Глава 5. Работа микропроцессора в защищенном режиме.

- Так ты, кум, еще не был у дья­ка в новой хате.

Н.В. Гоголь.

Ночь перед рождеством.

До сих пор мы пользовались только командами из набора микропроцессоров 8088/8086. В принципе этот набор будет работать на любом из микропроцессоров данного семейства. С каждым появлением нового микропроцессора расширялся набор команд - к старым командам добавлялись новые. В главе 20 дается полная картина того, как происходил этот процесс. Из всего семейства следует выделить микропроцессоры 80286 и 80386, т.к. они не только расширили набор команд по сравнению с предыдущими, но и явили собой качественный скачок в области про­В данной главе мы будем говорить о микропроцессоре 80286, ука­зывая там, где это необходимо, на отличие, появившееся в последующих микро­процессорах.

Микропроцессор 80286 полностью совместим с микропроцессорами 8088/8086. По сути дела, если Вам нет нужды обращаться к защищенному режиму (см. ниже), то можете не думать, на каком микропроцессоре программируете. Считайте, что работе с быстрым 8086-м микропроцессором". В моей книге Вы найдете много программ, ко­торые для своего исполнения требуют микропроцессор, способный выполнять коман­ды 286-го процессора.

Хочу подчеркнуть, что мы не будем рассматривать какие-либо технические харак­теристики микропроцессоров, изложение будет ограничено только программными рамками. Но и это в силу большого объема материала будет изложено конспективно кратко. Отсылаю всех интересующихся к книгам [18,22].

Микропроцессор 80286 может работать в двух режимах: реальном и защищенном. Реальный режим представляет фактически эмуляцию работы микропроцессоров 8088/ 8086с увеличением быстродействия и некоторого расширения множества команд. За­щищенный режим качественно отличается от реального режима поддержкой многоза­дачных операционных систем.

Рассмотрим вначале некоторые команды реального режима, которые могут быть полезны в программировании.

11 Была еще промежуточная модель микропроцессоров этой серии 80186. Но выпуск этой мо­дели не был слишком массовым, и вряд ли Вы встретите компьютер на таком микропроцес-

. соре. Лично я не встречал (см. главу 20). Говорить же о быстроте 286-го микропроцессора во времена Реппит'ов, конечно, можно лишь относительно.

II.

Сделаем краткий обзор команд микропроцессора 80286 реального режима (новых по отношению к микропроцессору 8086). Интересно, что, несмотря на то что сейчас повсеместно уже используются многие программисты, пишущие на ассем-

блере, почему-то забывают об этих командах.

Расширение команд коснулось стека. Прежде всего появились команды PUSH А-все регистры в стек и РОРА - все регистры из стека12. Очень эффективные команды, особенно для создания процедур. Крометого, появилась возможность отправлять в стек непосредственный операнд, например, PUSH457H (в стек помещается слово 0457Н).

Расширена команда знакового умножения. Теперь появилась возможность выпол­нять команды: IMUL DX,BX,123 (ВХ*123 -> DX) или IMUL CX,MEMW,567 (MEMW*567~>CX). Здесь MEMW- ячейка памяти. Арсенал логических команддо-полнен командой NOT, которая инвертирует все биты операнда. Расширены сдвиго­вые команды. Стали возможны команды типа SHLAX.7 или SHRMEM, 10. В микро­процессоре 8086/8088 для выполнения подобных действий потребовалось бы две ко­манды:

К цепочечным (строковым) командам добавлено две команды: OUTS - запись дан-ныхиз последовательных ячеекпамяти в выходное устройство; INS - считывание дан­ных из входного устройства в последовательные ячейки памяти. Они упрощают пере­дачу больших блоков данных между памятью и внешними устройствами. Примитив

ввода INS передает данные из входного порта, определяемого содержимым DX, в байт или слово, смещение которого находится в DI, и производит инкремент (декремент) содержимого DI. Аналогично OUTS передает       или слово из памяти в порт.

Среди команд условного перехода появилась команда JCXZ - передать управле­ние, если СХ содержит 0.

В перечне команд микропроцессора 80286 имеются три команды, упрощающие работу компиляторов языков высокого уровня. Рассмотрим их.

Команда BOUND проверяет, находится ли знаковое значение из 16-битного реги­стра в заданных пределах. Пределы находятся в двух смежных словах памяти. Значе­ние в регистре должно быть больше или равно значению в первом слове и меньше или равно значению во втором слове; в противном случае генерируется некоторое преры­вание. Например, команда BOUND AX.MEMW проверяет, находится ли слово из АХ в промежутке, определяемом смежными словами MEMW и MEMW+2. Эта команда может быть удобна для проверки того, находится ли индекс массива в заданных преде­лах.

Оставшиеся две команды ENTER и LEAVE называют процедурными. Команда ENTER OP 1 ,ОР2 готовит стекдля входа в процедуру. ОР1 показывает количество байт для локальных переменных в процедуре, ОР2 - уровень вложенности в процедуру. При ОР2=0 вложенность процедур не допускается (ситуация в языке Си). Команда LEAVE не имеет аргументов, она освобождает стек, занятый командой ENTER.

12 Справедливости ради следует сказать, ЧТО все команды, описанные до раздела Ш, были уже в микропроцессоре 80186.

Например, команда:

ENTER N,0 (обычная при входе в функцию Си) эквивалентна последовательности команд PUSH BPVMOV BP.SPSUB SP,4, а команда LEAVE - последовательности MOV SP.BPVPOP BP. (см. Главу 15).

Если Вам необходимо использовать указанные команды в своей программе, не забудьте в начале программы поставить опцию .286 либо .286Р, если собираетесь ис­пользовать команды защищенного режима (см. ниже). У компиляторов языков высо­кого уровня есть соответственно опции для трансляции в команды 80286. Причем в этом случае код программы будет более компактным и быстрым.

III. Вычисление физического адреса в защищенном режиме.

Адрес в микропроцессорах 8088/808би 80286в реальном режиме состоит из сегмент­ного адреса (селектора) и смещения (см. главу 2). Реальный физический адрес получается умножениемсегментногоадресанаІбидобавлениемкнемусмещения.Врезультатеполу-чается20-битньшфизическийадрес(20-гшряднаяшинаадреса).^

виртуальный (логический) адрес также состоит из селектора и смещения, но физический адрес получаетсятеперьне сдвигом сегментного адреса, а путем индексирования - обраще­нию ктаблице адресов. Шина адресов для 286-го процессора состоит из 24 разрядов (из 32 для 386-го). Селектор (содержимое сегментного регистра) состоит из трех полей:

13 бит 1 бит       2 бита

И х х s к с

т

RPL - запрашиваемый уровень привилегий, используется операционной системой для поддержки разделенного доступа; Т-индикатор,

Т=0 - индекс указывает на глобальную дескрипторную таблицу (GDT) - GLOBAL DESCRIPTTABLE.

І - индекс указывает на локальную дескрипторную таблицу (LDT) - LOCAL

DESCRIPTTABLE.

Каждая задача (в узком смысле слова - программа) имеет свою LDT. Базовые адре­са сегментов, разделяемых всеми задачами, хранятся в GDT. Базовые адреса "част­ных" сегментов каждой задачи хранятся в LDT. Элемент таблицы называется деск­риптором, нумерация этих элементов начинается (индексируется) с нуля. Дескриптор имеет длину восемь байт, три байта из восьми определяют адрес сегмента (24 бита с объемом адресации 16М). Полученный из таблицы адрес суммируется со смещением, и полученный 24-битный результат является результирующим адресом. Случай с Т=0 и равным нулю индексом называется особым - дескриптор с нулевым индексом - пус­тым дескриптором. Пустые селекторы не обращаются к дескриптору GDT, а вызы­вают особый случай, обрабатываемый особым образом.

Так как длина поля индекса в селекторе составляет 13 бит, то в дескрипторной таблице может быть самое большее 2Л13 дескрипторов. Каждый дескриптор описывает сегмент, длиной до 2Л16 байт. Каждая задача может иметь, таким образом, в своем распоряжении 2Л13*2Л 1 ббайт. Таккак аппаратно допускается память в 2Л16 байт, для использования всего допустимого адресного пространства используются внешние за­поминающие устройства. Реально операционная система может сбрасывать часть сег­ментов на диск и по мере необходимости считывать их в память. Кроме того, в систе­ме имеется таблица дескрипторов прерываний ГОТ (см. ниже и главу 26).

IV. Регистры преобразования адреса.

Ниже на рисунке представлены регистры микропроцессора ОТТ и ЕБТ, участву­ющие в преобразовании адреса.

Регистр ОБТ содержит физический адрес таблицы ОБТ (24 бита) и ее длину (16 бит). Выход за длину вызывает особый случай (защита). Регистр 1Х>Т (16 бит) хранит селектор сегмента, содержащего текущую 1Х)Т. Этот сегмент индексирует дескриптор в ОБТ. Во время переключения задач микропроцессор изменяет все адресное пространство перезагрузкой регистра ЕБТ.

Загрузка регистров ОБТ и 1Х>Т из памяти (или регистра) и сохранение содержи­мого этих регистров в памяти осуществляется командами ІХЮТ, ШЭТи БвБТ, БЫУГ соответственно (см. ниже).

Регистр ОБТ обычно загружается во время инициализации системы и в дальней­шем его содержимое не меняется. Локальные дескрипторные таблицы используются в многозадачных операционных системах. Если в защищенном режиме работает лишь одна задача, то ей нет необходимости создавать локальные дескрипторные таблицы, а поэтому нет необходимости как-то использовать регистр ЕБТ.

Параллельно регистру ЬБТ и сегментным регистрам (СБ, Б8, Е8) существуют теневые сегментные регистры. В них запоминаются промежуточные результаты вычис­ления физического адреса, которые потом используются, ускоряя обращение кпамяти. Ниже приводится алгоритм вычисления физического адреса по селектору и смещению:

1. Взять селектор из сегментного регистра.

2. Если бит ТІ показывает на ОБТ, то взять из регистра ОБТ адрес дескрипторной таблицы и перейти к шагу 4.

3. Если бит ТІ показывает на ЬБТ, то

а) взять селектор сегмента ЕБТ из регистра ЕБТ;

б) выделить в селекторе поле индекса и умножить индекс на 8. Это объясняет­ся тем, что длина дескриптора составляет 8 байт;

■      в) прибавить результат к адресу СБТ из регистра ОБТ; г) считать из памяти адресуемый дескриптор;д) выделить из этого дескриптора базовый адрес сегмента, содержащего таб­лицу 1Х>Т. Полученный базовый адрес является адресом дескрипторной таб­лицы. Перейти к шагу 4.

4. Вьщелить значение из поля индекса селектора, умножить его на 8 и прибавить к адресудескрипторной таблицы. Считать из памяти дескриптор по этому адресу.

5. Выделить из дескриптора базовый адрес сегмента.

6. Прибавить значение смещения к базовому адресу сегмента. Это и будет физи­ческий адрес.

7. Осуществить обращение к памяти по физическому адресу.

V. Дескриптор сегмента.

Ниже представлен формат дескриптора сегмента.

16 бит

8 бит

24 бита

16 бит

 

 

 

 

0

доступ

база

предел

Всегда О для совместимости

Байт доступа имеет структуру, представленную на Рис. 5.1.

7        6     $        4       3       2        1 О

р

В

РЬ

 

Я

А

- яля сегмента кода

7

 

6-6

 

4       3 2

1

0

 

р

 

1 |

1     0 ш>

] 1

Е

А

- для сегмента данных

7

 

6-5

 

4      3 2

1

0

 

р

БРЬ

0   ||  0  | 0

1

0

- для сегмента ЬОТ

7

6-5

1

0

 

 

 

III)

 

 

р

 

Т v р Е

 

 

 

 

1        1 , і

 

 

для системного сегмента

Рис.5.1. Форматы байта доступа дескриптора.

Байт доступа закодирован так, что путек его анализа всегда можно однозначно определитьтипдескриптора. Ниже приводится расшифровка полей байта доступа.

БРЬ - уровень привилегий, предотвращает доступ обычных задач к сегментам операционной системы.

Р- бит наличия. Определяет, находится сегмент в памяти или нет (0 -в памяти, 1 -на диске). В том случае, если места в памяти нет, то какой-то сегмент следует сбро­сить на диск.

А - бит обращения. Помогает выбрать оптимальную стратегию сброса и подкачки (с диска) сегментов. А обращается в 1, когда селектор для дескриптора загружается в сегментный регистр. СбросАвОосуществляетпрограмма. Бит А т.о. приблизительно показывает, было ли обращение к сегменту после того, как программа сбросила его в 0. Первоначально биты Аравны 0. Через регулярные интервалы времени операцион­ная система просматривает дескрипторы и сбрасывает его в 0. Если обнаруживаются дескрипторы с А= 1, то к ним после сканирования были обращения. Т.о. можно выя­вить сегменты с более частым к ним обращением.

Я - бит считываемого сегмента. Если Я= 1,то наряду с обращением к такому сег­менту для выполнения разрешено обращение для считывания. Если Я=0, то попытка

считывания вызывает особый случай защиты. Попытка записать в исполняемый сег­мент также вызывает особый случай защиты.

\¥- бит разрешения записи. Если \У= 1,то, помимо считывания, возможна и за­пись. При \¥=0, попытка записать в сегмент вызывает особый случай защиты.

С сегментом ЬБТнельзя вьшолнять операции считывания, записиили выполнения.

С - битподчинения.

ЕБ- бит расширения. Он применяется для отметки сегментов стека, которые рас­ширяются в область меньших адресов. Он управляет интерпретацией поля предела дескриптора. ПриЕО=1 сегмент предназначен для стеков.

Для системных сегментов первые 4 бита определяют его тип:

0 - запрещенное значение

1 -доступныйТБЗ 13 дляпроцессора80286

2 - сегмент ЬБТ (см. Рис. 5.1)

3 - занятый      для процессора 80286

4 - вентиль вызова для процессора 80286 (см. ниже)

5 - вентиль задачи для процессоров 80286 и 80386

6 - вентиль прерывания для процессора 80286

7 - вентиль исключения для процессора 80286

8 - запрещенное значение

9 - доступ      для процессора 80386 А - зарезервировано

В - занятый      для процессора 80386 С - вентиль вызова для процессора 80386

- зарезервировано Е - вентиль прерытания для процессора 80386 Б - вентиль ловушки для процессора 80386

11 TSS - Task State Segment - сегмент состояния задачи, т.е. сегмент, в котором сохраняется содержимое регистров задачи, когда процессор выполняет другую задачу.

Продолжим определение других частей дескриптора.

Предел - содержит размер сегмента в байтах, уменьшенный на 1.

База - физический адрес сегмента длиной 24 бита.

Последние два байта (16 бит) содержатдля 286-го процессора всегда 0. Для 386-го процессора там, в частности, хранится старший байт 32-битного адреса.

Как видим, адресное пространство для 286-го процессора расширяется до разме­ров 2 в 24 степени, т.е. до 16Мб. Для 386-го процессора адресное пространство увели­чивается еще в 256 раз (2 в 8 степени), т.е. составляет 4 Гб.

Таблица прерываний в защищенном режиме состоит из дескрипторов прерыва­ний. Ниже приводится структура дескриптора такой таблицы. Дескрипторы таблицы прерываний называются еще вентилями.

16

9

8

16

16

Резерв

Доступ

Парам

Селектор

Смещение

Селекторисмещениепоказываютнапроцедуру обработки прерывания. Старшие 1 ббит используются 32-битными микропроцессорами для получения 32-битного ад­реса. Поле Парам используется для передачи параметров вызываемому модулю.

7 6-5 4        3     2      1 О

р

 

0

0

1

1

0

Поле доступа вентиля прерывания

 

7

6-5

4

3

2

1

О .

Р

 

0

0

1

1

1

Поле доступа вентиля исключения

 

7

6-5

4

3

2

1

0

Р

 

0

0

1

0

1

Поле доступа вентиля  (шлюза) задачи

Расположениетаблицыпрерыванийопределяетсярегастромпрерываний(1ВТ). Структура этого регистра аналогична структуре регистра вОТЯ. Загрузка регистра осуществляется командой ЬГОТ.

Добавление для 386-го микропроцессора.

Краткоотметимизменения,произведенныев386-гомикропроцессоре.Болеепод-робносм.главы20,26.

Рассмотрим содержимое старших 16 бит дескриптора для 386-го микропроцес­сора.

Дескриптор сегмента.

Биты с 48 по 51 расширяют значение предела, т.е. длины сегмента. Т.о. длина сег­мента определяется теперь 20 битами и может, следовательно, составлять 1 Мб.

Бит52-битпользователя,предназначендляиспользованиясистемнымпрограм-мистом.

Бит 53 - зарезервирован для будущихмикропроцессоров.

Бит 54 - если содержит 0, то находящиеся в сегменте операнды интерпретируются как 16-битные, в противном случае они считаются 32-битные.

Бит 55 - бит гранулярности. Определяет в байтах или в страницах будет измерять­ся длина сегмента.

Биты с 56 по 63 расширяют значение базового адреса. Длина базового адреса, таким образом, становится 32-битной. Дескриптор таблицы ШТ.

Отличается от предыдущего только тем, что битые 52 по 55 равны нулю. Дескриптор прерывания.

Последние Іббитрасширяютзначениесмещениядо 32бит.

VI. Структура разделения между задачами.

В однопользовательской системе, где не требуется изолирование задач, можно поместить пустой селектор в регистр ШТ для каждой задачи. Тогда каждая задача будет разделять одно адресное и операционная система может не стро-

ить никаких ШТ. Такой режим удобен для небольших систем.

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

частными сегментами, изолированными от других. Такую группу задач называют за­данием.

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

Для каждой задачи свой сегмент состояния задачи В нем сохра-

няется содержимое регистров текущей задачи, когда происходит переключение на новую задачу. Информация о сегменте состояния (селектор) задачи содержится в ре­гистре состояния задачи (ТК). Регистр состояния задачи загружается после перехода защищенный режим. В дальнейшем его содержимое меняется автоматически при пе­реходе от одной задачи к другой.

Операционная система в специальном сегменте хранит селекторы всех выполняе­мых задач. Периодически обращаясь то к одному, то к другому селектору (переключая задачи), операционная система осуществляет многозадачный режим работы системы.

Рассмотрим немного подробнее вопрос о переключении задач. Как мы уже гово­рили, состояние задачи хранится в специальном сегменте ТЖ. Селектор этого сегмен­та текущей задачи содержится в регистре Тії. Ниже представлена структура сегмента состояния задачи.

Обратная связь Начало стека, кольцо О Начало стека, кольцо 1 Начало стека, кольцо 2 1Р Флажки АХ СХ

ВР Б1 Р1

Ё5

С8 Ш

Регистр ПУТ

Обратите внимание на поле "Обратная связь". В многозадачных системах это поле используют как указатель на следующий ТЖ. Таким образом, образуется структура в виде списка. Работая этой структурой ОС система легко может переключаться с од­ной задачи на другую. Переключение осуществляется путем межсегментного косвен­ного перехода (команда ГМР).

VII. Команды защищенного режима.

Перечислимкомандызащищенногорежимаскраткойиханнотацией.   ' '

ЕОБТ - загружает ОХУТ из памяти. При загрузке передается шесть байт. Первые пять байт загружаются в регистр вОТ, шестой байт игнорируется (загружается в 386-м процессоре). Используется при инициализации (см. главу 26).

8ОБТ - передает содержимое регистра ОБТ в адресуемую область памяти. Ко­манда используется в системных отладчиках.

Ь1Х)Т - загружает операнд-слово из регистра или памяти в регистр 1Х)Т. Данное слово будет являться селектором, определяющим выбор локального дескриптора из таблицы ОБТ. Используется при инициализации.

- передает содержимое регистра       в операнд-слово. Команда, обратная

ШУТ.

Ь ЛЯ - команда загружаем свой первый операнд байт доступа дескриптора, выби­раемый вторым операндом.

Ь8Ь - действует аналогично ЬАЯ, но загружает в свой первый операнд значение предела выбранного дескриптора.

ЬМ8\¥- загружает из памяти или регистра регистр состояния. Используется для перехода в защищенный режим. Например, ЬМ8\УАХ.

8М8\У - команда обратная предыдущей.

ЬТЯ - загрузка регистра задачи. Выполняется ОДИН раз после перехода в защищен­ный режим.

СЬТЗ - сброс флага переключения задачи. ЬЮТ - загрузка регистра таблицы прерываний.

VIII. Инициализация системы.

Запуская микропроцессор 80286 в реальном режиме, мы можем затем задать все таблицы и регистры, необходимые для защищенного режима, а потом перейти в защи­щенный режим. Процессор переключается из реального режима в защищенный ко­мандой ЬМ8\¥, которая загружает в регистр состояния микропроцессора (не путать с регистром флагов) слово, в кoтqpoм бит разрешения РЕ равен 1 (бит 0). Ясно, что переход возможен только после инициализации нужных регистров (СБТ, 1ЛУТ и т.д.) и таблиц (ОВТ, ЦУГидр.).

Ниже приводится фрагментустановки битаРЕв 1. Заметим, что при выполнении данного фрагмента другие биты регистра состояния не изменяются.

8м8\¥ ах оя     ах, 1 ьм8\¥ ах

В регистре состояния микропроцессора используются еще 3 бита, вот они:

бит 1 - должен быть восстановлен при инициализации. если имеется сопроцессор

(80287), ..

бит 2-восстанавливается в случае отсутствия сопроцессора,

бит 3 - используется при переключении задач (признак переключения).

Остальные биты 286-м микропроцессором не используются. Рассмотрим теперь последовательность шагов, необходимых для инициализации защищенного режима:

1. Подготовить в оперативной памяти глобальную таблицу дескрипторов ОВТ. Впоследствии в защищенном режиме можно модифицировать ОБТ, лишь нахо­дясь в нулевом кольце защиты (см. ниже).

2. Запретить все маскируемые и немаскируемые прерывания.

3. Если предполагается использовать в защищенном режиме расширенную память, то следует открыть адресную линию А20 (см. [19,22]).

4. Загрузить регистр ОВТЫ.

5. Подготовить дескрипторную таблицу прерываний и загрузить регистр ГОТК Эта таблица постоянно активна в защищенном режиме и направляет централь­ный процессор к программам обработки прерываний в случае соответствую­щей команды вызова или возникновения особого случая.

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

7. Установить бит РЕ и тем самым перейти в защищенный режим.

8. Сбросить очередь команд.

9. Загрузить регистр задачи (команда ЬТК).

Далее в главе 26 мы покажем реализацию данного алгоритма.

Функция 89Н прерывания 15Нтакже позволяет перейти в защищенный режим

(см. ниже).

IX. Кольца защиты.

Для защиты сегментов в микропроцессоре 80286 принята схема уровней привиле­гий. Система привилегий регулирует доступ к тому или иному сегменту в зависимос­ти от уровня его защищенности и от привилегированности запроса. Защита требует наложения на обычные программы (невходящие в операционную систему) трех типов ограничений:

1. обычным программам запрещается выполнять некоторые команды;

2. обычным программам должны быть недоступны определенные сегменты, дос­тупные операционной системе;

3. должно быть невозможным получение привилегии операционной системы, кро-

ме как входом в нее в разрешенной точке входа. Уровни привилегий определяются полями БРЕдескриптора. Поскольку на БРЕ отводится 2 бита, то имеется 4 уровня привилегий. Например, если код находится в сегменте с БРП 00, то это самый высокий уровень - имеет доступ ко всем сегментам, НО к этому сегменту имеет доступ только код с сегментом, у которого дескриптор име­ет уровень привилегий 00.

Наименее защищеннымиявляются прикладные программы пользователя, для ко­торых выделяется уровень с номером 3. Уровни с номерами 0,1,2 отводятся для сис­темных программ. Наиболее защищенная часть - ядро операционной системы имеет

3*уровень привилегий 0. Основная же часть программ операционной системы имеет уровень привилегий 1. Наконец уровень 2 обычно имеют ряд служебных программ. Устанавливаются следующие правила доступа:

1. Данные из сегмента могут быть выбраны программой, имеющей такой же или более высокий уровень привилегий.

2. Сегмент программы или процедуры может быть вызван программой, имеющей такой же или более низкий уровень привилегий.

Из правила 2 есть исключение. Командой CALL можно вызывать некоторые проце­дуры с более высоким уровнем привилегий, используя специальные точки входа (шлю­зы). Эти шлюзы имеют свои дескрипторы, которые хранятся в LDT. Шлюзы, в частно­сти, используют для предоставления возможности прикладным программам использо­вать ресурсы операционной системы. Задача может вызвать данную процедуру или за­дачу через шлюз, если ее привилегия равна или выше привилегии шлюза (но не задачи, на которую данный шлюз указывает). Таким образом, операционная система может ре­гулировать доступ к некоторым ее внутренним задачам и процедурам.

Для полноты защиты часть команд реального режима должна выполняться только в нулевом кольце. Это команды ввода-вывода: OUT, IN, OUTS, INS. В частности, с помо­щью этих команд программа посредством контролера прямого доступа к памяти (ПДП) сможет получить доступ к любому сегменту. Кроме этого, в кольцах с ненулевой приви­легией запрещены команды, способные заблокировать прерывания: CLI, STI, LOCK.

X. Прерывание 15Н.

Данное прерывание доступно        на и, в частности, позволяет

работать с защищенным режимом. Таковой является функция 89Н данного прерыва­ния. Эта функция переводит микропроцессор в защищенный режим. Данной функци­ей пользуются многие программы, работающие в защищенном режиме.

Пример использования ее можно найти в книге [19]. Заметим также, что BIOS не дает возможности переходить из защищенного режима в реальный, в первую очередь по причине невозможности использовать старые векторы прерывания в защищенном режиме в их старом качестве.

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

Как известно, стандартный объем ОЗУ, который имеется у современного IBM-со­вместимого компьютера и которым можно пользоваться обычным способом (напри­мер, MOV ES:[BX],AL) составляет 640 Кб. (см. главу 2). Остальное доступное адрес­ное пространство отведено под адреса ПЗУ и видеопамять (см. главу 22). Отсюда сле­дует, что добавленная оперативная память получит адреса за одним мегабайтом (ее называют расширенной). Ясно, что обычными способами нам до этой памяти не доб­раться. В защищенном режиме, однако, можно адресовать до 16 Мб (пока речь идет лишь о 286 процессоре). То есть доступ к расширенной памяти можно осуществить через защищенный режим. Именно таким способом функция 87Н прерывания 15Н осуществляет доступ к памяти за 1 Мб.

Для того чтобы узнать объем расширенной памяти используется функция 88Н:

АН-88Н

Выход:

АХ - объем в килобайтахнепрерывного участка расширенной памяти, начиная с адреса 100000Н (1048576). Если взведен флаг переноса, то данная функция не поддер­живается.

Заметим, что многие драйверы ОС MS DOS, работающие с расширенной памя­тью, блокируют работу прерывания 15Н. При этом функция 88Н будет давать 0 кило­байт. К таким драйверам относится, в частности, известный HIMEM.SYS.

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

Вход:

АН-87Н,

СХ - размер перемещаемого блока в словах, максимум составляет число 8000Н, что соответствует 64 Кб.

ES:SI - указывает на список дескрипторов (таблицу GDT), данная таблица необхо­дима для перехода и работы в защищенном режиме.

Выход:

если флаг переноса не взведен, то в АН - 0, если взведен, то АН - 1 ошибка схем контроля,

2 выполнение прекращено,

3 неверный адрес памяти. Рассмотрим подробно структуру таблицы GDT:

- пустой дескриптор, устанавливается на адрес 0, дескриптор данной табли­цы дескрипторов, устанавливается в 0, модифицируется BIOS,

- дескриптор перемещаемого блока памяти,

- дескриптор области, куда будет перемещен блок,

- дескриптор кодового сегмента программы, устанавливается в 0, модифици­руется BIOS,

- дескриптор стека программы, устанавливается в 0, модифицируется BIOS. Таким образом, пользователь устанавливает в значение, отличное отО, только тре­тий и четвертый дескрипторы.

Вспомним теперь структуру дескриптора (см. раздел Г/данной главы): вначале (16 бит) идет размер описываемого сегмента. Легко сообразить, что это должно быть значение не меньшее 2*СХ-1 .далее (24 бита) - физический адрес блока, следом идет байт доступа, с учетом изложенной выше схемы байт доступа следует выбрать рав­ным 93Н, наконец, последние два байта должны быть равны нулю.

WHERE   EQU   ЮН /старший байт  начала  расширенной памяти

DATA SEGMENT

/.--начало GDT1  для  копирования  в расширенную память INT  15  GDT  LABEL BYTEнулевых байт

DB 8 DUP(O) DB 8 DUP(O)

сегмента = СХ*2-1

DW 31

адрес исходного блока

SRC_LO DW ?

SRC_HI DB ?

байт доступа

DB 93H

поле

DW О

сегмента   = СХ*2-1 DW 31

;24-x разрядный   адрес результирующего блока

DST_LO DW ?

DST_HT DB ?

доступа

DB 93H

поле

DW О

нулевых байт

DB 8 DUP(O) DB 8 DUP(O) ;—конец GDT1

;—начало GDT2 для копирования из расширенной памяти

INT_15_GDT1 LABEL BYTE

нулевых байт DB  8 DUP(O) DB  8 DUP(O)

сегмента  = СХ*2-1

DW 31

адрес  исходного блока

SRC_L01 DW ?

SRC_HI1 DB ?

доступа

DB 93H /нулевое поле

DW О

/предел сегмента = СХ*2-1 DW 31

адрес   результирующего блока

DST_L01 DW ?

DST НИ  DB ?

Глава     Работа микропроцессора в защищенном режиме

;байт доступа

DB 93H /нулевое поле

DW О

; 1 б нулевых байт DB 8 DUP(O)

DB 8 DUP(O) ; —конец GDT2 DATA ENDS

;сегмент для  пересылаемых или принимаемых данных /вначале здесь  содержится  строка,   состоящая  из  букв 'А' DATAl SEGMENT

DB 32 DUP(65)

DB 13,10,'$' DATAl ENDS

стека ST1   SEGMENT STACK

DB  200 DUP(?)

ST1 ENDS CODE SEGMENT

ASSUME CS:CODE,   DS:DATA, SS:ST1 BEGIN: ;часть I

; —установка регистров MOV AX,DATA MOV DS,AX MOV ES,AX

LEA   SI,DS:INT_15_GDT ;—установка GDT

откуда MOV    AX,DATAl MOV    DL,AH ■ SHE    AX, 4 ;* SHR    DL, 4 ; *

MOV SRC_LO,AX MOV SRC_HI,DL куда

MOV    DS T_H I, WHERE

MOV    DST_LO, OOOOOH

запуск MOV CX,16 MOV AH,87H INT 15H

выполнения

MOV DL,AH MOV   AH, 2

INT 21H ;теперь  выводим строку MOV    AX, DATAl MOV DS,AX MOV   DX, 0 MOV   AH, 9 INT 21H

; заменяем на строку,   состоящую из букв  1 В1 MOV СХ,32 MOV ВХ,DATA1

LL:

MOV BYTE PTR DS:[BX],66

INC BX LOOP LL ;часть II

/--установка регистров MOV AX,DATA MOV DS,AX MOV ES, AX

LEA SI,DS:INT_15_GDT1 ;—установка GDT

куда MOV    AX,DATAl MOV    DL, AH

SHL   AX, 4 ; *

SHR     DL,4 ;*

MOV

MOV DST_HI1,DL

откуда

MOV     SRC_HII,WHERE

MOV     SRC_L01,OOOOOH ;теперь запуск

MOV CX,16

MOV AH,87H

INT 15H ;проверка выполнения

MOV    DL, AH

MOV   AH, 2

INT 21H

выводим строку

MOV    AX,DATAl

MOV    DS, AX

MOV DX, 0 MOV AH, 9 INT 21H

EXIT:

MOV АН,4CH INT 21H CODE ENDS

END BEGIN

Рис. 5.2. Программа демонстрирует копирование данных из обычной памяти в

расширенную и обратно.

На Рис. 5.2 представлена программа, демонстрирующая копирование в расширен­ную память и обратно. Как видим, механизм работы с расширенной памятью весьма прост, и Вы легко сможете написать свои процедуры работы с расширенной памятью. При этом следует учесть, что при выполнении обмена данными с расширенной памя­тью отключаются все прерывания, поэтому не рекомендуется копировать слишком большие объемы информации. Отметим, что в программе команды 286-го процессора отмечены звездочками.

В заключение скажу, что более подробную информацию о работе с расширенной, дополнительной памятью, а также памятью НМА и UMB можно найти в главе 22.