Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Операционная система "с нуля" на Ассемблере и Cи (Выпуск 5)


Служба Рассылок Subscribe.Ru проекта Citycat.Ru

Здравствуйте, уважаемые подписчики.



Приношу свои извинения за задержку выпуска.
Так же извиняюсь, что выпуск вновь будет теоретический. В творческой группе небольшой разлад. :(



Выпуск №5

Но пока я введу вас в суть защищенного режима, немного подробнее рассмотрим организацию памяти в защищенном режиме и поговорим о концепциях защиты.


История организации памяти.


Ранние модели процессоров от Intel имели 16 бит шины данных и 20 бит шины адреса. Это налагало определенные ограничения на адресацию памяти, ибо 16-бинтный регистр невозможно было использовать для адресации более чем 64 килобайт памяти. Чтобы обойти это препятствие разработчики предусмотрели сегментные регистры. Сегментный регистр хранит в себе старшие 16 бит адреса и для получения полного адреса к сегментному адресу прибавляется смещение в сегменте.

19 15 8 4 0
Сегмент
Смещение
Линейный адрес

Таким образом, стало возможным адресовать до 1 мегабайта памяти. Это же позволило делать программы, не настолько привязанными к памяти и упростило адресацию. Сегменты могут начинаться с любого адреса, кратного 16 байтам, эти 16-байтные блоки памяти получили название параграфов. Но это и создает определенные неудобства. Первое неудобство состоит в том, что на один адрес памяти указывает 4096 различных комбинаций сегмент/смещение. Второе неудобство состоит в том, что нет возможности ограничить программам доступ к тем или иным частям памяти, что в некоторых случаях может быть существенно!
Введение защищенного режима решило эти проблемы, но ради совместимости любой из современных процессоров может работать в реальном или виртуальном режиме процессора i8086.


Защита.


Для обеспечения надежной работы операционных систем и прикладных программ разработчики процессоров предусмотрели в них механизмы защиты. В процессорах фирмы Intel предусмотрено четыре уровня привилегий для программ и данных. Нулевой уровень считается наиболее привилегированным, третий уровень - наименее.

Так же в защищенном режиме совсем иначе работает механизм преобразования адресов. в сегментном регистре теперь хранится не старшие биты адреса, а селектор. селектор представляет из себя индекс в таблице дескрипторов. И кроме этого содержит в себе несколько служебных бит. Формат селектора такой:

15 2 0
Index TI RPL

Поле Index определяет индекс в дескрипторной таблице.

В процессорах Intel одновременно в системе может существовать две дескрипторных таблицы: Глобальная (Global descriptor table или GDT) и Локальная (Local descriptor table или LDT).

GDT существует в единственном экземпляре. Адрес и предел GDT хранятся в специальном системном регистре (GDTR) в 48 бит длиной (6 байт).
LDT может быть индивидуальная для каждой задачи, или общая для системы, или же ее вообще может не быть. Адрес и размер LDT определяется в GDT, для обращения к LDT в процессоре существует специальный регистр (LDTR), но в отличии от GDTR он имеет размер 16 бит и содержит в себе селектор из GDT.

Поле TI (Table indicator) селектора определяет принадлежность селектора GDT (0) или LDT (1).

Поле RPL (Requested privilege level) определяет запрашиваемые привилегии... об этом мы поговорим чуть позже.


Дескрипторы сегментов.


Дескрипторные таблицы состоят из записей по 64 бита (8 байт) в каждой. Формат дескриптора таков:

7 6 5 4
Базовый адрес 31-24 Предел 19-16 Права доступа Базовый адрес 23-16
3 2 1 0
Базовый адрес 15-0 Предел 15-0

Сразу бросается в глаза очень странная организация дескриптора, но это связано с совместимостью с процессором i286, формат дескриптора в котором был таков:

7 6 5 4
Зарезервировано Права доступа Базовый адрес 23-16
3 2 1 0
Базовый адрес 15-0 Предел 15-0

Что же содержится в дескрипторе:

Базовый адрес - 32 бита (24 бита для i286). Определяет линейный адрес памяти, с которого начинается сегмент. В отличие от реального режима этот адрес может быть указан с точностью до байта.

Предел - 20 бит (16 бит для i286). Определяет размер сегмента (максимальный адрес, по которому может быть произведено обращение, это справедливо не всегда но об этом чуть позже). 20-битное поле может показаться не очень то большим для 32-х битного процессора, но это не так. Оно не всегда показывает размер в байтах. Но и об этом чуть позже.

Байт прав доступа:

7 6 5 4 3 2 1 0
P DPL S Type A

Бит P (present) - Указывает на присутствие сегмента в памяти. обращение к отсутствующему сегменту вызывает особый случай не присутствия сегмента в памяти.

Двух битное поле DPL определяет уровень привилегий сегмента. Про Уровни привилегий мы поговорим чуть позже.

Бит S (Segment)- Будучи установленным в 1, определяет сегмент памяти, к которому может быть получен доступ на чтение (запись) или выполнение.

Три бита Type - в зависимости от бита S определяет либо возможности чтения/записи, выполнения сегмента или определяет тип системных данных, хранимых в селекторе. Подробнее это выглядит так:

Если бит S установлен в 1, о поле Type делится на биты:

2 1 0
1 - код Подчиненный сегмент кода Допустимо считывание
0 - данные Расширяется вниз Допустима запись

Если сегмент расширяется вниз (это используется для стековых сегментов) то поле предела показывает адрес, выше которого допустима запись. ниже запись недопустима и вызовет нарушение пределов сегмента.

Бит А (Accessed) устанавливается в 1, если к сегменту производилось обращение.

Если бит S установлен в 0, то в сегменте находится служебная информация определяемая полем Typе и битом A.

TYPE A Описание
000 1 TSS для i286
001 0 LDT
001 1 Занятый TSS для i286
010 0 Шлюз вызова i286
010 1 Шлюз задачи
011 0 Шлюз прерывания i286
011 1 Шлюз исключения i286
100 1 TSS для i386
101 1 Занятый TSS i386
110 0 Шлюз вызова i386
111 0 Шлюз прерывания i386
111 1 Шлюз ловушки i386

Остальные комбинации либо недопустимы, либо зарезервированы.

TSS - это сегмент состояния задачи (Task state segment) о них мы поговорим позже, возможно в следующем выпуске.

Шестой байт дескриптора, помимо старших бит предела, содержит в себе несколько битовых полей.

7 6 5 4 3 2 1 0
G D 0 U Предел 19-16

Бит G (Granularity) - определяет размер элементов, в которых измеряется предел. если 0 - предел в байтах, если 1 - размер в страницах.

Бит D (Default size) - размер операндов в сегменте. Если 0 - 16 бит. если 1 - 32 бита.

Бит U (User) - доступен для пользователя (вернее для программиста операционной системы)


И снова защита.


Немного терминологии:

Уровень привилегий может быть от 0(высший) до 3(низший). Следовательно повышение уровня привилегий соответствует его уменьшению в численном эквиваленте, понижение - наоборот.

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

В селекторе содержится RPL - то есть запрашиваемый уровень привилегий.

RPL секущего кодового сегмента (хранится в регистре cs) является уровнем привилегий данного процесса и называется текущим уровнем привилегий (CPL)

Прямые обращения к сегментам возможны при соблюдении следующих условий:

  • В случае если запрашиваемый уровень привилегий больше текущего, то запрашиваемый уровень понижается до текущего.
  • При обращении к сегменту данных RPL селектора должен быть не ниже DPL сегмента.
  • При обращении к сегменту кода возможно только при равенстве CPL, RPL и DPL.
  • Если сегмент кода помечен как подчиненный, то для обращения к нему необходимо иметь уровень привилегий не ниже уровня сегмента. При этом выполнение сегмента происходит с текущим уровнем привилегий.

Косвенные вызовы возможны только через шлюзы при соблюдении следующих условий:

  • DPL шлюза должен быть не выше, чем CPL сегмента, из которого производится вызов шлюза.
  • DPL сегмента, на который указывает шлюз, должно быть не ниже чем DPL шлюза.


Эпилог.


Тема конечно очень сложна для понимания. В дальнейших выпусках я буду концентрировать внимание на таких моментах. Интересующиеся люди могут почитать дополнительную, более подробную информацию по защите в литературе по микропроцессорам фирмы Intel. Мое изложение не претендует на полноту.

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

Отправлено 2001-08-06 для 3542 подписчиков.
ведущий рассылки Dron
Архив Рассылки

При поддержке Kalashnikoff.ru


Подписаться на рассылки

Рассылки Subscribe.Ru
Операционная система "с нуля" на Ассемблере и Cи
Ассемблер? Это просто! Учимся программировать
Ассемблер? Это просто! Учимся программировать (FAQ)
(C)Москва, 2001. Авторское право принадлежит Валяеву А.Ю. Публичное размещение материала из рассылки, а также его использование полностью или частично в коммерческих или иных подобных целях без письменного согласия автора влечет ответственность за нарушение авторских прав.


http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться Рейтингуется SpyLog

В избранное