Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Регистр

Область памяти

Формат области памяти – массив дескрипторов, в котором нулевой дескриптор начинается со смещения 0, первый – 8, второй – 16 и т.п. Подобный массив, содержащий 3 дескриптора, мог бы выглядеть так (дескрипторы взяты из примера выше):

; сегмент данных, 4 Гб, базовый адрес 0, Read/Write segment_descriptor <0ffffh, 0, 0, 10010010b, 10001111b, 0> ; сегмент данных, 64 Кб, базовый адрес 0, Read/Write segment_descriptor <0ffffh, 0, 0, 10010010b, 0, 0> ; сегмент кода, 64 Кб, базовый адрес 12345678h, Execute/Read segment_descriptor <0ffffh, 5678h, 34h, 10011010b, 0, 12h>

Местоположение и размер GDT задаёт регистр GDTR (очевидно, от GDT Register; это не ключевое слово ассемблера, а условное название, которое применяется в документации для обозначения этого регистра), вот описание его формата:

Положение Описание
Два младших байта Смещение последнего байта таблицы дескрипторов. То есть размер таблицы в байтах минус 1. Так как дескрипторов должно быть целое число, размер должен делиться на 8 (размер дескриптора в байтах), а смещение последнего байта должно быть равно 8n-1.
Оставшиеся четыре байта Линейный базовый адрес таблицы дескрипторов.

Таблица 2. Регистр GDTR


Рисунок 3. Регистр GDTR

Для загрузки регистра GDTR существует специальная команда lgdt

lgdt pointer_to_new_gdtr

Здесь pointer_to_new_gdtr это указатель на шестибайтную структуру, повторяющую формат GDTR.

Инициализация GDT может выглядеть так:

… ; Вычисляем линейный адрес начала массива дескрипторов mov eax, 0 mov ax, ds shl eax, 4 add eax, offset GDT ; Записываем его в структуру mov dword ptr gdtr + 2, eax   ; Загружаем GDTR. ; fword ptr – указатель на шестибайтную структуру lgdt fword ptr gdtr …   ; Global Descriptor Table GDT label byte db …; Дескриптор #0 … db …; Дескриптор #N   gdt_len equ $ - GDT; размер GDT   gdtr dw gdt_len – 1; 16-битный размер GDT – 1 dd?; Место для 32-х битного базового адреса GDT …

Опять же, для удобства можно определить структуру:

table_register struct limit dw 0; Table Limit base dd 0; Linear Base Address table_register ends

Селекторы и сегментные регистры

Слово состоит из двух частей.

Если между первой и второй частью вставить пробел, полученное словосочетание будет означать «это преподаватель».

Всё вместе это структура, используемая для ссылки на дескриптор.

Шарада.

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

Защищённый режим позволяет разумной ОС более-менее контролировать этот процесс:

  • Сегменты описываются дескрипторами сегментов, которые расположены в GDT. GDT формируется ОС и пользовательские приложения не имеют к ней доступа (это должна обеспечить ОС, поместив GDT в недоступную для приложений область памяти).
  • ОС инициализирует GDT только такими дескрипторами сегментов, используя которые приложения никому не могут помешать (несколько упрощая…).
  • Приложение указывает выбранные дескрипторы при помощи селекторов (selector), хранящихся в сегментных регистрах. Использовать какие-то другие дескрипторы сегментов, кроме предложенных ОС, оно не в состоянии.
ПРИМЕЧАНИЕ Резонное возражение: но ведь пользовательские приложения могут сами вызвать lgtr и создать собственную, «альтернативную» GDT, через которую они получат доступ к любому участку памяти! К счастью, разработчики процессора не забыли о такой возможности, нормальное приложение не сможет сделать ничего подобного, так как для того чтобы успешно использовать инструкцию lgdt оно должно уже взломать защиту ОС каким-то другим способом. Подробнее этот вопрос будет описан в главе, посвящённой защите. Ещё несколько не менее резонных возражений обсуждается в конце главы.
<== предыдущая лекция | следующая лекция ==>
Примеры | Селекторы
Поделиться с друзьями:


Дата добавления: 2014-01-20; Просмотров: 326; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.011 сек.