Лекции по Вычислительным машинам, системам и сетям   

3. Тридцатидвухразрядные процессоры фирмы Intel

3.3. Переключение в защищенный режим

Процессор переходит в этот режим, когда бит PE в регистре cr0 устанавливается в единицу. Установить этот бит можно командами mov cr0 , r 32  или командой lmsw  r16/m16 . Последняя команда загружает из памяти или 16-разрядного регистра младшую половину регистра cr0. Обе команды доступны в реальном режиме.

После перехода в защищенный режим МП ожидает наличия в памяти по крайней мере двух таблиц: GDT и IDT. Поэтому эти таблицы должны быть созданы заранее ещё в реальном режиме, например, с помощью ассемблерных директив db, dw и dd. Что касается LDT, то её (их) можно создать как заранее в реальном режиме, так и позднее, когда мы уже находимся в защищенном режиме. Зачастую LDT вообще не создаются.

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

1. Создать в памяти таблицы GDT и IDT.

2. Запретить внешние прерывания, в том числе и по входу NMI (если последний в системе используется). Связано это с тем, что в процессе переключения есть временной интервал, когда таблица векторов прерываний реального режима уже не действует, а таблица IDT ещё не действует. Если на этом интервале МП воспримет любое прерывание, наступит крах системы.

3. Перенастроить контроллеры прерываний на новые типы (номера) прерываний, с тем чтобы исключить конфликты между внутренними и внешними прерыва-ниями. Этот пункт не имеет никакого отношения к самому МП, а связан с особенностями функционирования IBM-подобных ПЭВМ. Когда фирма Intel выпустила МП 8086, она заняла под внутренние прерывания типы 0 ‑ 4, но предупредила, что типы 5 ‑ 31 резервируются для внутрен-них прерываний будущих процессоров. По каким-то причинам фирма IBM это предупреждение проигнори-ровала и отвела типы 8 ‑ 15 внешним прерываниям. В результате, например, тип 8 присвоен внешнему прерыванию от таймера (этот тип выдает на МП контроллер прерываний) и одновременно в 32-разрядных МП этот тип отведен особому случаю (внутреннему прерыванию) «двойная ошибка». Получается конфликт, так как МП не знает, какой обработчик он должен выполнять.

4. Открыть линию А20 (если она была закрыта).

5. Во внутренние регистры процессора gdtr и idtr загрузить начальные адреса и размеры таблиц GDT и IDT.

6. Установить бит РЕ. С этого момента мы в защищенном режиме.

7. Обычно первой командой в защищенном режиме ставится команда jmp far next (дальний переход на следующую команду программы). Команда очищает очередь команд от команд защищенного режима, а также заносит в видимую часть cs правильный селектор, по которому в дескрипторной таблице GDT отыскивается дескриптор сегмента кода. Далее этот дескриптор копи-руется в теневую часть cs. Очистка очереди команд нужна исходя из следующих соображений. Во всех рассматриваемых процессорах реализован конвейер команд. В любой момент времени внутри процессора обрабатывается сразу несколько команд, находящихся на разных стадиях выполнения. Отсюда, при переключении режимов возникает ситуация, когда с конвейера еще сходят команды одного режима, а на конвейер уже поступают команды другого режима. Поскольку в разных режимах одни и те же команды выполняются по-разному, такая ситуация иногда может приводить к различным коллизиям. Использование команды jmp снимает эту проблему. Начиная с Pentium, использование команды jmp для рассмотренной выше цели необязательно, поскольку команды, меняющие содержимое регистров управления cr0-cr4, гарантируют, что все команды, идущие перед ними, будут завершены (так называемые «сериалайзд» ‑ команды – serialized instruction).

8. Разрешить внешние прерывания.

Не следует считать, что все эти пункты всегда обязательны к исполнению. Это только общая схема действий, причем подразумевающая, что мы переключаемся в защищенный режим «всерьёз и надолго». Если же требуется только «нырнуть» в защищенный режим и тут же вернуться обратно, то многие пункты можно исключить. В частности, можно не создавать IDT, не загружать IDTR, и вообще не выполнять пп. 3,4 и 7.

Далее приведен пример программы, переключающей процессор из реального режима в защищенный и обратно. Находясь в защищенном режиме, программа очищает экран и выводит надпись «МЫ В ЗАЩИЩЕННОМ РЕЖИМЕ». Кроме того, после возврата в реальный режим, программа выводит на экран числовое значения поля TYPE дескриптора видеопамяти (смотри формат дескриптора). Программу надо запускать, находясь в «чистой» DOS (без EMM и других подобных драйверов). Программу можно было написать значительно проще, но здесь преследовалась цель продемонстрировать общие принципы переключения в защищенный режим:

code  segment

 

p486

 

org  100h

 

assume  cs:code, ds:code

 
   

start:  jmp  begin

 
   

mess db 'Ура, мы в ЗР!'

 
   

gdt    dd  0

 

dd  0

; пустой  дескриптор

   

dw  0ffffh

; дескриптор видеопамяти

dw  8000h

 

db  0bh

 

db  92h

 

dw  0

 

desc_gdt  dq  0

;заготовка под дескриптор ;GDT

begin:

 

mov  si,offset desc_gdt

; заносим в заготовку размер ;и адрес GDT

mov  word ptr [si],15

; это размер

mov  ebx,0

 

mov  bx,offset gdt

 

push  cs

 

mov  eax,0

 

pop  ax

 

shl   eax,4

 

add  ebx,eax

 

mov   [si+2],ebx

; а это адрес

lgdt  pword ptr [si]

; а теперь перекидываем ;заготовку в GDTR

mov  eax,cr0

 

mov  edx,eax

 

cli

 

or  eax,1

 

mov  cr0,eax

; переключение в ;защищенный режим

mov  ax,8

 

mov  es,ax

; заносим в ES дескриптор  ;видеопамяти

cld

;чистим экран

mov  di,0

 

mov  ax,7020h

 

mov  cx,2000

 

rep  stosw

;выводим надпись

mov  bx,offset mess

 

mov  si,1010

 

mov  cx,22

 
   

m:

 
   

mov  al,[bx]

 

mov  es:[si],al

 

add  si,2

 

inc  bx

 

loop  m

 

mov  cr0,edx

;выходим обратно в ;реальный режим

   

sti

 
   

mov  si,1348

mov  di,offset gdt

mov  al,[di+13]

and  al,0fh

add    al,30h

mov  es:[si],al

mov  ah,7

int  21h

mov  ah,4ch

int  21h

code  ends

end  start

; этот фрагмент доказывает, ;что МП использует в РР ;начальный адрес из теневой ;части сегментного регистра, ;а не из видимой ( в видимой ;части ES - 8, а значение ;выводится в видеопамять!!) ;и также показывает, что ;МП сам устанавливает бит ;А в дескрипторе

;(было 92,стало 93 (на экран ;выводится 3))



*****

© 2009-2017 Банк лекций siblec.ru
Лекции для преподавателей и студентов. Формальные, технические, естественные, общественные, гуманитарные, и другие науки.