Содержание
- 3. Основы переключения реального и защищенного режимов Исполнение программ защищенного режима должно начинаться в реальном режиме процессора,
- 4. Действия, необходимые для обеспечения функционирования программы защищенного режима : Подготовка в оперативной памяти таблицы глобальных дескрипторов
- 5. Подготовка таблиц глобальных дескрипторов GDT Для простейшей программы достаточно определить пока только одну дескрипторную таблицу —
- 6. Загрузка регистра gdtr Для загрузки регистра gdtr существует команда lgdt: lgdt адрес_48-битного_поля (Load GDT register) -
- 7. Запрет обработки аппаратных прерываний без соответствующей настройки первое же прерывание от таймера, которое происходит 18,2 раза
- 8. Работа в защищенном режиме Настройка сегментных регистров Как только микропроцессор оказывается в защищенном режиме, первую же
- 9. В микропроцессоре каждому сегментному регистру соответствует свой теневой регистр дескриптора. Этот регистр имеет размер 64 бит
- 10. В реальном режиме теневые регистры заполняются не из таблицы дескрипторов, а непосредственно самим процессором. В частности,
- 11. Фрагмент db OEAh ;Код команды far jmp dw offset continue ;Смещение dw 16 ;Селектор сегмента команд
- 12. Выполнение собственно программы защищенного режима есть существенные ограничения на ее работу. Прежде всего, это связано с
- 13. Запрет аппаратных прерываний Для нашей программы этого делать и не нужно, так как мы их и
- 14. В защищенном режиме запрещены любые обращения к функциям DOS или BIOS. Причина этого совершенно очевидна -
- 15. При работе в защищенном режиме в дескрипторах сегментов записаны, среди прочего, их линейные адреса и границы.
- 16. Теневые регистры, куда, собственно, надо записать значение границы, нам недоступны. Для из модификации придется прибегнуть к
- 17. Если, однако, в программе встретятся команды сохранения и восстановления содержимого сегментных регистров, например push DS pop
- 18. Работа с прерываниями в защищенном режиме Допустим, что мы будем обрабатывать одно аппаратное прерывание (от таймера),
- 19. Далее микропроцессор, находясь в защищенном режиме, может производить обработку необходимых прерываний. По окончании работы для возврата
- 20. Обработчики прерываний Расположение и порядок следования процедур обработки прерываний в памяти может быть произвольным. Главное, не
- 21. Программирование контроллера прерываний i8259А При загрузке BIOS производит инициализацию контроллеров прерываний (ведущего и ведомого). При этом
- 22. После этого можно перейти в защищенный режим и разрешить аппаратные прерывания. Выполнив работу в защищенном режиме,
- 45. Скачать презентацию
Основы переключения реального и защищенного режимов
Исполнение программ защищенного режима должно начинаться
Основы переключения реального и защищенного режимов
Исполнение программ защищенного режима должно начинаться
Действия, необходимые для обеспечения функционирования программы защищенного режима :
Подготовка в оперативной
Действия, необходимые для обеспечения функционирования программы защищенного режима :
Подготовка в оперативной
Инициализация необходимых дескрипторов в таблице GDT.
Загрузка в регистр gdtr адреса и размера таблицы GDT.
Запрет обработки аппаратных прерываний.
Переключение микропроцессора в защищенный режим.
Организация работы в защищенном режиме:
настроить сегментные регистры;
выполнить собственно содержательную работу программы; подготовиться к возврату в реальный режим;
запретить аппаратные прерывания;
Переключение микропроцессора в реальный режим.
Настройка сегментных регистров для работы в реальном режиме.
Разрешение прерываний и стандартное для MS-DOS завершение работы программы.
Подготовка таблиц глобальных дескрипторов GDT
Для простейшей программы достаточно определить пока только
Подготовка таблиц глобальных дескрипторов GDT
Для простейшей программы достаточно определить пока только
Таблицу LDT есть смысл применять, когда в системе работают несколько задач и необходимо изолировать их друг от друга.
Определимся теперь с набором дескрипторов в таблице GDT, которые понадобятся для нашей программы:
дескриптор для описания сегмента самой таблицы GDT;
дескриптор для описания сегмента данных программы;
дескриптор для описания сегмента команд программы;
дескриптор для описания сегмента стека программы;
дескриптор для описания сегмента, в котором будет находиться процедура для выполнения алгоритмов программы
Загрузка регистра gdtr
Для загрузки регистра gdtr существует команда lgdt:
lgdt адрес_48-битного_поля (Load
Загрузка регистра gdtr
Для загрузки регистра gdtr существует команда lgdt:
lgdt адрес_48-битного_поля (Load
Команда lgdt загружает системный регистр gdtr содержимым 6-байтового поля, адрес которого указан в качестве операнда. Вначале необходимо сформировать поле из шести байт со структурой, аналогичной формату регистра gdtr, а затем указать адрес этого поля в качестве операнда команды lgdt.
Для резервирования поля из шести байт (48 бит) TASM поддерживает специальные директивы резервирования и инициализации данных — dp и df. После выделения — с помощью одной из этих директив — области памяти в сегменте данных необходимо сформировать в этой области указатель на начало таблицы GDT и ее размер.
Запрет обработки аппаратных прерываний
без соответствующей настройки первое же прерывание от таймера,
Запрет обработки аппаратных прерываний
без соответствующей настройки первое же прерывание от таймера,
Переключение микропроцессора в защищенный режим
О том, что микропроцессор находится в защищенном режиме, говорит лишь состояние бита PE в регистре сr0. Установить этот бит можно двумя способами:
1.Непосредственной установкой бита PE в регистре сr0. Состояние этого бита управляет режимами работы микропроцессора: если PE = 0, то микропроцессор работает в реальном режиме, если PE = 1, то микропроцессор работает в защищенном режиме;
2.Использованием функции 89h прерывания 15h BIOS.
Регистр сr0 программно доступен (в реальном режиме и на нулевом кольце в защищенном), поэтому установить бит PE можно, используя обычные команды ассемблера:
mov eax,cr0
or eax,0001h
mov cr0,eax
Последняя команда mov переводит микропроцессор в защищенный режим.
Работа в защищенном режиме
Настройка сегментных регистров
Как только микропроцессор оказывается в
Работа в защищенном режиме
Настройка сегментных регистров
Как только микропроцессор оказывается в
В микропроцессоре каждому сегментному регистру соответствует свой теневой регистр дескриптора. Этот
В микропроцессоре каждому сегментному регистру соответствует свой теневой регистр дескриптора. Этот
Таким образом, в защищенном режиме программист имеет дело с селекторами, т.е. номерами дескрипторов, а процессор - с самими дескрипторами, хранящимися в теневых регистрах.
В реальном режиме теневые регистры заполняются не из таблицы дескрипторов, а
В реальном режиме теневые регистры заполняются не из таблицы дескрипторов, а
Фрагмент
db OEAh ;Код команды far jmp
dw offset continue ;Смещение
dw 16 ;Селектор
Фрагмент
db OEAh ;Код команды far jmp
dw offset continue ;Смещение
dw 16 ;Селектор
выглядящий совершенно нелепо в сегменте команд, как раз и демонстрирует эту методику.
В реальном режиме мы поместили бы во второе слово адреса сегментный адрес сегмента команд, в защищенном же мы записываем в него селектор этого сегмента (число 16). Команда дальнего перехода, помимо загрузки в CS селектора, выполняет еще одну функцию - она очищает очередь команд в блоке предвыборки команд процессора. Как известно, в современных процессорах с целью повышения скорости выполнения программы используется конвейерная обработка команд программы, позволяющая совместить во времени фазы их обработки. Одновременно с выполнением текущей (первой) команды осуществляется выборка операндов следующей (второй), дешифрация третьей и выборка из памяти четвертой команды. Таким образом, в момент перехода в защищенный режим уже могут быть расшифрованы несколько следующих команд и выбраны из памяти их операнды. Однако эти действия выполнялись, очевидно, по правилам реального, а не защищенного режима, что может привести к нарушениям в работе программы. Команда перехода очищает очередь предвыборки, заставляя процессор заполнить ее заново уже в защищенном режиме.
Выполнение собственно программы защищенного режима
есть существенные ограничения на ее работу.
Выполнение собственно программы защищенного режима
есть существенные ограничения на ее работу.
Здесь возникает примерно та же проблема с сегментными регистрами, что была при входе в защищенный режим. Мы упоминали уже о теневых регистрах микропроцессора, но не сказали того, что микропроцессор использует их, даже работая в реальном режиме. При этом поля этих регистров заполнены, конечно, в соответствии с требованиями реального режима:
предел должен быть равен 64 К = 0ffffh;
бит G = 0 (значение размера в поле предела) — это значение в байтах;
байт атрибута равен 10010010 = 92h;
базовый адрес значения не имеет.
Следовательно, перед переходом в реальный режим нужно сформировать эти значения в соответствующих дескрипторах и сделать актуальными эти изменения в теневых регистрах, для чего нужно перезагрузить сегментные регистры. После этого можно переходить в реальный режим.
Запрет аппаратных прерываний
Для нашей программы этого делать и не нужно, так
Запрет аппаратных прерываний
Для нашей программы этого делать и не нужно, так
Переключение микропроцессора в реальный режим
Для этого необходимо сбросить нулевой бит регистра сr0 (только для 386+). Это можно сделать несколькими способами. К примеру:
mov eax,cr0
and al,0feh
mov cr0,eax
После сброса бита PE микропроцессор снова оказался в реальном режиме.
Настройка сегментных регистров
После перехода в реальный режим опять возникает проблема с содержимым сегментных регистров. Решается она ранее описанным способом.
Разрешение прерываний
Теперь можно разрешить прерывания. Так как в системе прерываний мы ничего не меняли, то действия наши тоже были простейшими: а) запрещение аппаратных прерываний для того, чтобы на время смены режима работы микропроцессора нас не беспокоило прерывание от таймера, б) последующее разрешение прерываний после возврата в реальный режим.
В защищенном режиме запрещены любые обращения к функциям DOS или BIOS.
В защищенном режиме запрещены любые обращения к функциям DOS или BIOS.
При работе в защищенном режиме в дескрипторах сегментов записаны, среди прочего,
При работе в защищенном режиме в дескрипторах сегментов записаны, среди прочего,
Как уже отмечалось, дескрипторы сегментов хранятся в процессе выполнения программы в теневых регистрах , которые загружаются автоматически при записи в сегментный регистр селектора. При работе в реальном режиме некоторые поля теневых регистров должны быть заполнены вполне определенным образом. В частности, поле границы любого сегмента должно содержать число FFFFh, а бит дробности сброшен. Если мы просто перейдем в реальный режим сбросом бита 0 в регистре CR0, то в теневых регистрах останутся дескрипторы защищенного режима и при первом же обращении к любому сегменту программы возникнет исключение общей защиты, так как ни один из наших сегментов не имеет границы, равной FFFFh. Поскольку мы не обрабатываем исключения, произойдет либо сброс процессора и перезагрузка компьютера, либо зависание. Таким образом, перед переходом в реальный режим необходимо исправить дескрипторы всех наших сегментов: команд, данных, стека и видеобуфера(если работали с ним)
Теневые регистры, куда, собственно, надо записать значение границы, нам недоступны. Для
Теневые регистры, куда, собственно, надо записать значение границы, нам недоступны. Для
Настроив все использовавшиеся в программе сегментные регистры, можно сбросить бит 0 в CR0. После перехода в реальный режим нам придется еще раз выполнить команду дальнего перехода, чтобы очистить очередь команд в блоке предвыборки и загрузить в регистр CS вместо хранящегося там селектора обычный сегментный адрес регистра команд. сегментные адреса,
Если, однако, в программе встретятся команды сохранения и восстановления содержимого сегментных
Если, однако, в программе встретятся команды сохранения и восстановления содержимого сегментных
push DS pop DS
выполнение программы будет нарушено, так как команда pop DS загрузит в DS не сегментный адрес реального режима, а селектор, т.е. число. Это число будет рассматриваться процессором, как сегментный адрес, и дальнейшие обращения к полям данных приведут к адресации физической памяти, лишеной смысла. Даже если в нашей программе нет строк сохранения и восстановления сегментных регистров, они неминуемо встретятся, как только произойдет переход в DOS по команде int 21h, так как диспетчер DOS сохраняет, а затем восстанавливает все регистры задачи, в том числе и сегментные. Поэтому после перехода в реальный режим необходимо загрузить в используемые далее сегментные регистры соответствующие
Работа с прерываниями в защищенном режиме
Допустим, что мы будем обрабатывать одно
Работа с прерываниями в защищенном режиме
Допустим, что мы будем обрабатывать одно
В общем случае для того, чтобы сделать возможным обработку прерываний в защищенном режиме, необходимо выполнить следующие действия:
Инициализировать таблицу IDT.
Составить процедуры обработчиков прерываний.
Запретить аппаратные прерывания.
Перепрограммировать контроллер прерываний i8259A.
Загрузить регистр IDTR адресом и размером таблицы IDT.
Перейти в защищенный режим.
Разрешить обработку прерываний.
Далее микропроцессор, находясь в защищенном режиме, может производить обработку необходимых прерываний.
Далее микропроцессор, находясь в защищенном режиме, может производить обработку необходимых прерываний.
Запретить аппаратные прерывания.
Выполнить обратное перепрограммирование контроллера прерываний.
Перейти в реальный режим работы микропроцессора.
Разрешить обработку аппаратных прерываний.
Инициализация таблицы IDT
так же, как и в реальном режиме, все прерывания защищенного режима имеют свои номера от 0 до 255. Отличие их от прерываний реального режима в том, что под цели микропроцессора (исключительные ситуации или просто исключения) отдано гораздо большее количество номеров — первые 32 вектора с номерами 0...31. Из этих 32 векторов реально используются только 0...17, остальные вектора 18...31 пока зарезервированы для будущих разработок. Для того чтобы сформировать таблицу IDT в целом, необходимо определиться с описанием отдельных ее дескрипторов - шлюзов.
Обработчики прерываний
Расположение и порядок следования процедур обработки прерываний в памяти может
Обработчики прерываний
Расположение и порядок следования процедур обработки прерываний в памяти может
Снять со стека и проанализировать код ошибки (если он есть).
Сохранить в стеке используемые в обработчике регистры микропроцессора.
Выполнить необходимые действия, в том числе подготовить возможный рестарт команды, вызвавшей прерывание. Подобный рестарт подразумевает возобновление выполнения прерванной программы, начиная с команды, инициировавшей процесс прерывания.
Восстановить сохраненные на шаге 2 регистры;
Выполнить команду iret.
Программирование контроллера прерываний i8259А
При загрузке BIOS производит инициализацию контроллеров прерываний (ведущего
Программирование контроллера прерываний i8259А
При загрузке BIOS производит инициализацию контроллеров прерываний (ведущего
Загрузка регистра IDTR
Аналогично таблице GDT нужно сообщить микропроцессору, где находится таблица IDТ. Это делается с помощью специально выделенного для этой цели регистра idtr. Таким образом, в защищенном режиме любая задача, имея достаточный уровень привилегий, может создать свою среду для обработки прерываний.
Загрузка регистра idtr производится специальной командой lidt, которая имеет следующий формат:
lidt адрес_48-битного_поля (Load IDT register) — загрузить регистр idtr.
Команда lidt загружает системный регистр idtr содержимым 6-байтового поля, адрес которого указан в качестве операнда.
После этого можно перейти в защищенный режим и разрешить аппаратные прерывания.
После этого можно перейти в защищенный режим и разрешить аппаратные прерывания.