Системное программное обеспечение. Особенности программирования 32-разрядных процессоров. Рощин А.В. - 50 стр.

UptoLike

Составители: 

50
Набор подпрограмм, необходимых для переключения сегментного
регистра GS в режим линейной адресации, показан в листинге 2.1 [1]. Как
сказано выше, перезапись содержимого теневого регистра процессора
возможна только в защищенном режиме, а переход в этот режим, как видно из
листинга, требует ряда дополнительных операций, выполняемых процедурой
Initialization. В частности, нужно перенастроить на специально выделенные
в кодовом сегменте области данных регистры DS, SS и SP. В момент
перенастройки регистров стека должны быть запрещены прерывания,
поскольку некоторые обработчики прерываний пишут информацию в стек
прерываемой программы.
Процедура SetLAddrModeForGS, непосредственно осуществляющая
перенастройку регистра GS в режим линейной адресации, воспроизводит (с
незначительными изменениями) метод Родена. Прежде чем осуществить
переключение, нужно вначале подготовить таблицу GDT (настроить на
текущие сегменты кода и данных) и загрузить ее. Затем нужно войти в
защищенный режимустановить в единицу бит РЕ регистра CR0, а
остальные разряды сохранить без изменений (в том виде, в котором они
находились при работе в реальном режиме). В защищенном режиме
необходимо перезагрузить сегментные регистры, сняв при этом ограничения
с GS, и сразу же вернуться в реальный режим DOS, сбросив в ноль бит РЕ.
Длительное пребывание в защищенном режиме нежелательно, поскольку
переключение в него выполнялось по упрощенной схеме: таблица
прерываний не создавалась, а сами прерывания были просто отключены.
После выполнения процедуры SetLAddrModeForGS обязательно
следует отменить замыкание адресного пространства, то есть разблокировать
адресную линию А20, которая управляется контроллером клавиатуры. Для
этого необходимо послать в порт А контроллера соответствующую команду.
Посылка команды осуществляется при помощи Enable_A20 и
Wait8042Buffer Empty.
     Набор подпрограмм, необходимых для переключения сегментного
регистра GS в режим линейной адресации, показан в листинге 2.1 [1]. Как
сказано выше, перезапись содержимого теневого регистра процессора
возможна только в защищенном режиме, а переход в этот режим, как видно из
листинга, требует ряда дополнительных операций, выполняемых процедурой
Initialization. В частности, нужно перенастроить на специально выделенные
в кодовом сегменте области данных регистры DS, SS и SP. В момент
перенастройки регистров стека должны быть запрещены прерывания,
поскольку некоторые обработчики прерываний пишут информацию в стек
прерываемой программы.
     Процедура SetLAddrModeForGS, непосредственно осуществляющая
перенастройку регистра GS в режим линейной адресации, воспроизводит (с
незначительными изменениями) метод Родена. Прежде чем осуществить
переключение, нужно вначале подготовить таблицу GDT (настроить на
текущие сегменты кода и данных) и загрузить ее. Затем нужно войти в
защищенный режим — установить в единицу бит РЕ регистра CR0, а
остальные разряды сохранить без изменений (в том виде, в котором они
находились при работе в реальном режиме). В защищенном режиме
необходимо перезагрузить сегментные регистры, сняв при этом ограничения
с GS, и сразу же вернуться в реальный режим DOS, сбросив в ноль бит РЕ.
Длительное пребывание в защищенном режиме нежелательно, поскольку
переключение в него выполнялось по упрощенной схеме: таблица
прерываний не создавалась, а сами прерывания были просто отключены.
     После выполнения процедуры SetLAddrModeForGS обязательно
следует отменить замыкание адресного пространства, то есть разблокировать
адресную линию А20, которая управляется контроллером клавиатуры. Для
этого необходимо послать в порт А контроллера соответствующую команду.
Посылка   команды    осуществляется    при   помощи    Enable_A20      и
Wait8042Buffer Empty.


                                      50