Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ВМСиС.docx
Скачиваний:
23
Добавлен:
22.04.2019
Размер:
278.98 Кб
Скачать

33.Сегменты реального и защищенного режима. Глобальная и локальная таблицы дескрипторов.

34.Механизм преобразования линейного адреса в физический в процессоре x86.

Преобразование линейного виртуального адреса в физический происходит следующим образом

Рис. 6.11. Преобразование линейного виртуального адреса в физический адрес

Поле номера виртуальной страницы (старшие 20 разрядов) делится на две равные части по 10 разрядов — поле номера раздела и поле номера страницы в разделе. На основании заданного в регистре CR3 номера физической страницы, хранящей таблицу разделов, и смещения в этой странице, задаваемого полем номера раздела, процессор находит дескриптор виртуальной страницы раздела. В соответствии с атрибутами этого дескриптора определяются права доступа к странице, а также наличие ее в физической памяти. Если страницы нет в оперативной памяти, то происходит прерывание, в результате которого операционная система должна выполнить загрузку требуемой страницы в память. После того как страница (содержащая нужный раздел) загружена, из нее извлекается дескриптор страницы данных, номер которой указан в линейном виртуальном адресе. И наконец, на основании базового адреса страницы, полученного из дескриптора, и смещения, заданного в линейном виртуальном адресе, вычисляется искомый физический адрес.

Таким образом, при доступе к странице в процессоре используется двухуровневая схема адресации страниц, которая хотя и замедляет преобразование, но позволяет использовать страничный механизм для таблицы страниц, что существенно уменьшает объем физической памяти, требуемой для ее хранения. Для ускорения преобразования адресов в блоке управления страницами используется ассоциативная память, в которой каптируются 32 дескриптора активно используемых страниц, что позволяет по номеру виртуальной страницы быстро извлекать номер физической страницы без обращения к таблицам разделов и страниц.

35.Основные исключения защиты (обработка исключения отсутствие страницы в памяти).

36.Уровни привилегий и кольца защиты защищенного режима.

37.Числа с фиксированной и плавающей точкой.

38.Стандартные форматы чисел с плавающей точкой.

39.Число епсилон и проверка равенства 0,0 разности двух чисел.

40.Особенности машинной реализации целых и вещественных чисел.

41.Источники погрешности при вычислениях с числами с плавающей точкой.

Существует два основных типа числовых объектов, используемых в машинных вычислениях: целые числа и числа с плавающей точкой. Если целые числа очень близки по своим свойствам к числам натурального ряда, то числа с плавающей точкой отличаются от вещественных чисел, и незнание этих отличий и особенностей может привести к получению неправильных результатов вычислений. Операции над целыми числами выполняются абсолютно точно. Единственное, что их отличает от натуральных чисел – это ограничение на максимальное и минимальное значение, обусловленное конечной длиной разрядной сетки. Если результат операции над целыми числами выходит за пределы допустимого диапазона, то происходит переполнение. При этом биты, выходящие за пределы разрядной сетки усекаются слева, и результат получается неверным. Однако эта проблема легко решается, если заранее известен диапазон изменений натуральных чисел в моделируемой предметной области. Если стандартных целых чисел для покрытия требуемого диапазона недостаточно, то используются нестандартные целые числа нужной длины, а операции над ними реализуются при помощи сложения с переносом и вычитания с заемом.

Числа с плавающей точкой в машинном представлении состоят из трех частей: знака мантиссы, мантиссы и порядка. Мантисса – это нормализованная двоичная дробь. Порядок – это показатель степени числа 2, являющегося сомножителем мантиссы. Разрядность мантиссы определяет точность представления чисел и точность вычисления, а разрядность порядка – диапазон представляемых значений. Для оценки погрешности представления чисел с плавающей точкой часто используется число епсилон. Число епсилон определяется последовательным делением 1 на 2. Результат очередного деления складывается с 1. За число епсилон принимают такое самое малое число 1/(2^N), которое будучи прибавлено к 1 изменяет ее значение.

Вещественные числа имеют бесконечно длинную мантиссу. Поэтому в принципе вещественное число может быть реализовано в машинном представлении лишь приближенно, так как мантисса числа с плавающей точкой всегда имеет ограниченную длину. При выполнении операций над числами с плавающей точкой мантисса результата всегда выходит за пределы разрядной сетки и усекается справа. Поэтому вычисления с плавающей точкой всегда выполняются приближенно. Ограниченность разрядной сетки мантиссы приводит также к тому, что числовая ось не непрерывна, а дискретна. При этом количество чисел, находящихся в диапазоне между двумя целыми степенями числа 2 постоянно. То есть между числами 2.0 и 4.0 помещается столько же чисел, сколько между числами 1024.0 и 2048.0. Следовательно, точность представления чисел с плавающей точкой убывает при удалении их модуля от нуля. Дискретность числовой оси приводит также к тому, что некоторые значения, например, корни нелинейных уравнений, определяемые методом итераций, никогда не могут быть получены абсолютно точно, так как значения левой и правой частей уравнения могут попадать на соседние узлы числовой оси. Поэтому критерием выхода из итераций никогда не следует делать равенство двух чисел с плавающей точкой, а всегда сравнение модуля их разности с требуемой для данной задачи точностью.

Другим источником погрешностей в расчетах с плавающей точкой, помимо ошибок округления, являются ошибки усечения, которые проявляются при вычислении значений трансцендентных функций при помощи степенных рядов. Естественно, что количество членов ряда в вычислениях всегда конечно. Причем отбрасывать нужно не первое слагаемое, выходящее за пределы разрядной сетки, а несколько более раннее, так как вес последних попадающих в разрядную сетку слагаемых соизмерим с ошибкой округления. И более того, увеличение числа слагаемых приводит к накоплению ошибок округления. Накопление ошибок округления также проявляется при решении плохо обусловленных систем линейных уравнений методом Гаусса.

При сложении двух чисел с плавающей точкой близких по модулю и противоположных по знаку происходит исчезновение точности. Все значимые разряды исчезают, а оставшаяся часть содержит только ошибки округления. Если результат такой суммы складывать с числом много меньшим первых двух, то на полученный результат будет существенно влиять последовательность выполнения операций. Если сначала сложить одно из больших чисел с третьим слагаемым, то практически вся его значащая часть окажется за пределами разрядной сетки и не скажется на конечном результате. Таких ситуаций следует избегать и тщательно планировать вычисления с плавающей точкой.

Еще одним источником погрешности является преобразование чисел из внешнего представления в десятичной системе счисления во внутреннее в двоичной системе счисления и обратно. Эта погрешность обусловлена тем, что числа представленные точно в десятичной системе счисления преобразуются в бесконечную периодическую двоичную дробь, которая усекается до длины разрядной сетки. При суммировании значительного числа таких чисел может набежать заметная ошибка. Этот эффект проявляется при интегрировании дифференциальных уравнений. Для уменьшения погрешности в этом случае рекомендуется шаг интегрирования выбирать таким, чтобы он содержал в знаменателе целую степень числа 2. Поэтому шаг интегрирования 0,25 лучше, чем 0,2 и 0,125 лучше, чем 0,1. Еще больше этот эффект проявляется при денежных расчетах. Суммы большого числа слагаемых всегда содержат заметную погрешность. И если в технических расчетах такая погрешность вполне допустима, то в финансовых баланс должен сходиться до копейки. Увеличение длины разрядной сетки смягчает эту проблему, но не снимает ее совсем. Решением этой проблемы является использование чисел с плавающей точкой в формате BCD. Расчеты с денежными суммами в таком формате выполняются абсолютно точно, практически как на целых числах. Но если в результате расчетов возникают промежуточные данные, которые нужно округлять до целых копеек, то окончательный результат опять может быть получен лишь приближенно.

И, наконец, стандартный компилятор Си все операнды с плавающей точкой одинарной точности (float) перед выполнением вычислений преобразует во временные объекты с плавающей точкой двойной точности (double). То есть числа одинарной точности используются только для хранения данных для уменьшения затрат памяти. Поэтому все перечисленные выше проблемы при программировании на Си проявляются не так остро. И, кроме того, все современные вычислительные системы оснащены математическим сопроцессором, в котором все операнды с плавающей точкой хранятся в формате расширенной точности (long double), а операции над ними реализованы аппаратно. Поэтому, если выражение с плавающей точкой содержит небольшое количество операндов, и все из них размещаются во внутренних регистрах сопроцессора или имеют расширенную точность, то точность таких расчетов настолько велика, что даже денежные расчеты можно выполнять на числах long double, что многократно быстрее, чем на числах в формате BCD.

Тем ни менее особенности машинного представления чисел с плавающей точкой и проблемы, которые они порождают при расчетах, нужно знать и понимать, как их можно избежать.

Математический сопроцессор (NPX или x87), аппаратно выполняющий операции над числами с плавающей точкой, в процессорах x86 реализован в виде отдельного узла со своим конвейером, регистрами, исполнительным блоком и набором инструкций.

Функция _control87, загружающая новое значение в управляющее слово сопроцессора может использовать следующие битовые константы и маски, определенные в заголовочном файле float.h:

#define MCW_EM 0x003f /* маска исключений */

#define EM_INVALID 0x0001 /* недейст. инструкция */

#define EM_DENORMAL 0x0002 /* денормализов. операнд */

#define EM_ZERODIVIDE 0x0004 /* деление на 0 */

#define EM_OVERFLOW 0x0008 /* переполнение */

#define EM_UNDERFLOW 0x0010 /* антипереполнение */

#define EM_INEXACT 0x0020 /* неточный результат */

#define MCW_IC 0x1000 /* бесконечность */

#define IC_AFFINE 0x1000 /* афинная */

#define IC_PROJECTIVE 0x0000 /* проективная */

#define MCW_RC 0x0c00 /* округление */

#define RC_CHOP 0x0c00 /* усечение */

#define RC_UP 0x0800 /* вверх */

#define RC_DOWN 0x0400 /* вниз */

#define RC_NEAR 0x0000 /* к ближайшему */

#define MCW_PC 0x0300 /* точность */

#define PC_24 0x0000 /* 24 бита */

#define PC_53 0x0200 /* 53 бита */

#define PC_64 0x0300 /* 64 бита */

42.Математический сопроцессор: регистровая модель.

43.Математический сопроцессор: загрузка данных.

44.Математический сопроцессор: выгрузка данных.

45. Математический сопроцессор: арифметические инструкции.

1. безоперандные

2 однооперандные

3 двухоперандные

1. безоперандные

 Команда:

FADD приемник,источник

 Назначение:

Сложение вещественных чисел

 Команда:

FADDP приемник,источник

 Назначение:

Сложение с выталкиванием из стека

 Команда:

FIADD источник

 Назначение:

Сложение целых чисел

 Процессор:

8087

Команда выполняет сложение источника и приемника и помещает результат в приемник. Команда FADDP после этого выталкивает ST(0) из стека (помечает ST(0) как пустой и увеличивает ТОР на один). Команды сложения могут принимать следующие формы:

FADD источник, когда источником является 32- или 64-битная переменная, а приемником — ST(0);

FADD ST(0),ST(n), FADD ST(n),ST(0), FADDP ST(n),ST(0), когда источник и приемник заданы явно в виде регистров FPU;

FADD без операндов — эквивалентно FADD ST(0),ST(1); FADDP без операндов — эквивалентно FADDP ST(1),ST(0);

FIADD источник, когда источником является 16- или 32-битная переменная, содержащая целое число, а приемником — ST(0).

 Команда:

FSUB приемник,источник

 Назначение:

Вычитание вещественных чисел

 Команда:

FSUBP приемник,источник

 Назначение:

Вычитание с выталкиванием из стека

 Команда:

FISUB источник

 Назначение:

Вычитание целых чисел

 Процессор:

8087

Выполняет вычитание источника из приемника и сохраняет результат в приемнике. Команда FSUBP после этого выталкивает ST(0) из стека (помечает ST(0) как пустой и увеличивает ТОР на один). Команды вычитания могут принимать следующие формы:

FSUB источник, когда источником является 32- или 64-битная переменная, содержащая вещественное число, а приемником — ST(0);

FSUB ST(0),ST(n), FSUB ST(n),ST(0), FSUBP ST(n),ST(0), когда источник и приемник заданы явно в виде регистров FPU;

FSUB без операндов — эквивалентно FSUB ST(0),ST(1); FSUBP без операндов — эквивалентно FSUBP ST(1),ST(0);

FISUB источник, когда источником является 16- или 32-битная переменная, содержащая целое число, а приемником — ST(0).

Если один из операндов — бесконечность, результат — бесконечность соответствующего знака. Если оба операнда — бесконечности одного знака, результат не определен (происходит исключение «недопустимая операция»).

 Команда:

FSUBR приемник,источник

 Назначение:

Обратное вычитание вещественных чисел

 Команда:

FSUBRP приемник,источник

 Назначение:

Обратное вычитание с выталкиванием

 Команда:

FISUBR источник

 Назначение:

Обратное вычитание целых чисел

 Процессор:

8087

Эти команды эквивалентны FSUB/FSUBP/FISUB во всем, кроме того, что они выполняют вычитание приемника из источника, а не источника из приемника.

 Команда:

FMUL приемник,источник

 Назначение:

Умножение вещественных чисел

 Команда:

FMULP приемник,источник

 Назначение:

Умножение с выталкиванием из стека

 Команда:

FIMUL источник

 Назначение:

Умножение целых чисел

 Процессор:

8087

Выполняет умножение источника и приемника и помещает результат в приемник. Команда FMULP после этого выталкивает ST(0) из стека (помечает ST(0) как пустой и увеличивает ТОР на один). Так же как и остальные команды базовой арифметики, команды умножения могут принимать следующие формы:

FMUL источник, когда источником является 32- или 64-битная переменная, а приемником — ST(0);

FMUL ST(0),ST(n), FMUL ST(n),ST(0), FMULP ST(n),ST(0), когда источник и приемник заданы явно в виде регистров FPU;

FMUL без операндов — эквивалентно FMUL ST(0),ST(1); FMULP без операндов — эквивалентно FMULP ST(1),ST(0);

FIMUL источник, когда источником является 16- или 32-битная переменная, содержащая целое число, а приемником — ST(0).

 Команда:

FDIV приемник,источник

 Назначение:

Деление вещественных чисел

 Команда:

FDIVP приемник,источник

 Назначение:

Деление с выталкиванием из стека

 Команда:

FIDIV источник

 Назначение:

Деление целых чисел

 Процессор:

8087

Выполняет деление приемника на источник и сохраняет результат в приемнике. Команда FDIVP после этого выталкивает ST(0) из стека (помечает ST(0) как пустой и увеличивает ТОР на один). Команды могут принимать следующие формы:

FDIV источник, когда источником является 32- или 64-битная переменная, содержащая вещественное число, а приемником — ST(0);

FDIV ST(0),ST(n), FDIV ST(n),ST(0), FDIVP ST(n),ST(0), когда источник и приемник заданы явно в виде регистров FPU;

FDIV без операндов — эквивалентно FDIV ST(0),ST(1); FDIVP без операндов — эквивалентно FDIVP ST(1),ST(0);

FIDIV источник, когда источником является 16- или 32-битная переменная, содержащая целое число, а приемником — ST(0).

При делении бесконечности на ноль (так же как и на любое число) результат — бесконечность, при делении нуля на бесконечность (так же как и на любое число) результат — ноль. При делении на ноль нормального числа происходит исключение деления на ноль, а если флаг ZM = 1, в качестве результата записывается бесконечность соответствующего знака.

 Команда:

FDIVR приемник,источник

 Назначение:

Обратное деление вещественных чисел

 Команда:

FDIVRP приемник,источник

 Назначение:

Обратное деление с выталкиванием

 Команда:

FIDIVR источник

 Назначение:

Обратное деление целых чисел

 Процессор:

8087

Эти команды эквивалентны FDIV/FDIVP/FIDIV во всем, кроме того, что они выполняют деление источника на приемник, а не приемника на источник.

 Команда:

FPREM

 Назначение:

Найти частичный остаток от деления

 Процессор:

8087

 Команда:

FPREM1

 Назначение:

Найти частичный остаток в стандарте IEEE

 Процессор:

80387

Эти команды выполняют деление ST(0) на ST(1) и помещают остаток от деления в ST(0). Деление осуществляется при помощи последовательных вычитаний ST(1) из ST(0), но за один раз выполняется не более 64 таких вычитаний. Если ST(0) не стал меньше ST(1) за это время, говорят, что в ST(0) находится частичный остаток от деления. Если был получен точный остаток, флаг С2 сбрасывается в 0, если частичный — устанавливается в 1, так что можно повторять эту команду до обнуления С2. Если вычисление привело к точному остатку, три младших бита частного (то есть числа потребовавшихся вычитаний) сохраняются в С0, С3, С1 (биты 2, 1, 0 соответственно). Например, используя FPREM1, можно уменьшить аргумент тангенса, вычислив его остаток от деления на /4, тогда потребуются младшие три бита частного, чтобы определить, не поменялся ли при этой операции знак тангенса.

Различие между FPREM и FPREM1 заключается в разном определении значения частного. Сначала эти команды выполняют вещественное деление ST(0) на ST(1), округляют результат (FPREM1 — к ближайшему целому, FPREM — к нулю), а затем, если частное меньше 64, вычисляяют точный остаток, а если больше — частичный.

 Команда:

FABS

 Назначение:

Найти абсолютное значение

 Процессор:

8087

Если ST(0) был отрицательным числом — переводит его в положительное.

 Команда:

FCHS

 Назначение:

Изменить знак

 Процессор:

8087

Изменяет знак ST(0), превращая положительное число в отрицательное, и наоборот.

 Команда:

FRNDINT

 Назначение:

Округлить до целого

 Процессор:

8087

Округляет значение ST(0) до целого числа в соответствии с режимом округления, заданным битами RC.

 Команда:

FSCALE

 Назначение:

Масштабировать по степеням двойки

 Процессор:

8087

Умножает ST(0) на два в степени ST(1) и записывает результат в ST(0). Значение ST(1) предварительно округляется в сторону нуля до целого числа. Эта команда выполняет действие, обратное FXTRACT.

 Команда:

FXTRACT

 Назначение:

Извлечь экспоненту и мантиссу

 Процессор:

8087

Разделяет число в ST(0) на мантиссу и экспоненту, сохраняет экспоненту в ST(0) и помещает мантиссу в стек, так что после этого ТОР уменьшается на 1, мантисса оказывается в ST(0), а экспонента — в ST(1).

 Команда:

FSQRT

 Назначение:

Извлечь квадратный корень

 Процессор:

8087

Вычисляет квадратный корень из ST(0) и сохраняет результат в ST(0).