Рассылка закрыта
При закрытии подписчики были переданы в рассылку "Сетевой адаптер: осваиваем Интернет" на которую и рекомендуем вам подписаться.
Вы можете найти рассылки сходной тематики в Каталоге рассылок.
← Октябрь 2002 → | ||||||
1
|
2
|
3
|
4
|
5
|
||
---|---|---|---|---|---|---|
7
|
8
|
9
|
10
|
11
|
12
|
13
|
14
|
15
|
16
|
17
|
18
|
19
|
20
|
21
|
22
|
23
|
24
|
25
|
26
|
27
|
28
|
29
|
30
|
31
|
Статистика
-2 за неделю
Процессор INTEL в защищенном режиме
Информационный Канал Subscribe.Ru |
|
Процессор INTEL в защищенном режиме Выпуск №8 |
В выпуске: |
|
Переключение в
защищенный режим |
В этом выпуске мы наконец-то применим часть полученных знаний на практике. Сейчас мы
попробуем переключиться в защищенный режим. И все. Возвращаться назад (в реальный) мы не
будем...
Вычислим линейный адрес таблицы GDT. Зачем? Чтоб загрузить регистр GDTR. Линейный адрес
GDT = линейный адрес базы сегмента RM_CODE (потому что GDT расположена именно в этом
сегменте у нас в программе) + смещение метки GDT в нем.
Теперь нам еще нужно вычислить точно таким же макаром линейный адрес т.н. ТОЧКИ ВХОДА В
ЗАЩИЩЕННЫЙ РЕЖИМ. Дело в том, что после переключения в защ. режим мы окажемся в неком
подвешенном состоянии – когда регистр CS еще содержит номер сегмента из реального режима,
а не селектор. Мы не можем просто сделать mov CS, селектор, CS можно изменить только
дальним jmp-ом либо iret-ом, но щас не про то. Поэтому нам все же придется делать дальний
jmp для изменения CS. НО КУДА? Вот именно на ТОЧКУ ВХОДА В ЗАЩИЩЕННЫЙ РЕЖИМ, см.
исходник.
Теперь нада обязательно посидеть на дорожку :)... все. Теперь можно. Для переключения в PM
нужно установить нулевой бит регистра CR0:
Кто играл в Half Life, помните, в первой части, когда взрыв на заводе в самом начале,
Гордон падает в обморок, а потом на несколько секунд приходит в себя и оказывается в
другом мире, вокруг какие то существа едят траву, вот что то типа этого произошло
сейчас... :)
Теперь давайте осмотримся кругом, что мы видим? Ага, вон таблица GDT во тьме. Память?
Оперативная память на месте. Регистры, где вы? Мы все тута! Ну слава Богу... мы здесь не
одни. Где таблица векторов? Но нет ответа... Ладно, и без нее обойдемся...
Итак, давай разберемся, куда же мы все-таки прыгнули. Селектор равен 00001000b. Младшие
два бита – нули, это уровень привилегий, на него не смотрим. Второй бит (TI) – нолик.
Вспоминаем. Значит этот селектор указывает на дескриптор из таблицы GDT... На какой же?
Смотрим левее... 001! На первый! А что у нас описывает первый дескриптор в GDT? Правильно,
сегмент кода.
Теперь единственное, что мы можем сделать – это перезагрузить компьютер (причем, только
кнопкой RESET). Я умышленно убрал часть кода, которая отвечает за переключение обратно в
реальный режим, потому что она сильно все затуманит (надо в таблице GDT еще подготовить
16-битные дескрипторы), но если кому интересно – пишите.
Находчивый подписчик сразу спросит: «А не могли бы мы, допустим, сделать базу
видеосегмента в нуле, а при выводе на экран значение 0B8000h поместить в EDI?». Тот, у
кого возникнет данный вопрос – уже видит защищенный режим насквозь. Конечно могли бы, это
то же самое по сути! |
© Broken Sword, 2002 - Рассылка
© Igoryk, 2002 - Дизайн
http://subscribe.ru/
E-mail: ask@subscribe.ru |
Отписаться
Убрать рекламу |
В избранное | ||