Сегменты в защищённом режиме — КиберПедия 

Двойное оплодотворение у цветковых растений: Оплодотворение - это процесс слияния мужской и женской половых клеток с образованием зиготы...

Состав сооружений: решетки и песколовки: Решетки – это первое устройство в схеме очистных сооружений. Они представляют...

Сегменты в защищённом режиме

2022-10-04 23
Сегменты в защищённом режиме 0.00 из 5.00 0 оценок
Заказать работу

 

В защищённом режиме можно использовать до 4 Гб физической памяти в стандартном режиме и 64 Гб в специальном (подробнее о нём будем говорить далее). Но прежде чем начать описывать принципы работы памяти в защищённом режиме, надо ещё раз вспомнить устройство памяти в реальном режиме. Вся память делится на сегменты размером 64 Кб; для получения доступа к памяти надо указать номер сегмента и смещение в этом сегменте. Физический адрес, который выставляется на шину адреса, вычисляется таким образом:

физический_адрес = сегмент * 10h + смещение

Смещение указывается 16-битным значением в регистре общего назначения или непосредственным значением. Сегмент тоже указывается 16-битным значением в сегментном регистре.

Адрес памяти в защищённом режиме является 32-битным, следовательно, можно адресовать 4 Гб физической памяти. Вся память делится на сегменты. Каждый сегмент может быть размером от 0 до 4 Гб (т. е. покрывать всю память). Для доступа к любому адресу в памяти, т. с. к любому сегменту и любому смещению, в нём надо сформировать логический адрес.

Логический адрес представляет из себя описание сегмента и адрес в сегменте. В реальном режиме сегмент указывался просто его порядковым номером. В защищённом режиме сегмент указывается селектором.

Селектор сегмента - это его идентификатор. Селектор имеет размер 16 Биг, точно так же как и в режиме реальных адресов, но обозначает он совсем другое.

 

Для того чтобы описать сегмент, надо указать его начальный адрес, уровень привилегий для доступа к нему, его лимит (т. е. его размер) и т. д.

 Для описания сегмента памяти отводится специальная структура размером 8 байт. Эта структура называется дескриптором.

Если быть более точным, то любой объект, которым управляет процессор и к которому он регулирует доступ, описывается дескриптором.

Все дескрипторы объединяются в специальных таблицах дескрипторов -глобальной и локальной.

Каждый объект описывается своим типом дескриптора. Сегмент памяти описывается сегментным дескриптором.

 

 

Сегментный дескриптор принято делить на два двойных слова. На рис. приведён общий формат дескриптора.

Базовый адрес - 32-разрядный адрес области памяти, с которой начинается сегмент.

Предел (лимит) сегмента - предельное значение смещения в сегменте; также можно рассматривать предел как размер сегмента минус один. Сегмент может измеряться в байтах или страницах. Если он измеряется в байтах, то размер сегмента может быть максимум 1 Мб; если в страницах, то 4 Гб.

Тип сегмента - 4-биговос поле, определяющее тип сегмента. Каждый бит типа сегмента имеет следующие значения:

1.    Старший бит (бит 11 во втором двойном слове): если 0, то это сегмент данных, если 1 - то кода. Разумеется, если данный бит сброшен, то передача управления коду, который находится в памяти, описываемой этим дескриптором, будет невозможна.

 

2.    Бит 10 во втором двойном слове. Если это сегмент кода, то он показывает подчинённость этого сегмента (более подробно об этом будет рассказано далее). Если это сегмент данных, то данный бит показывает направление расширения сегмента: если 0, то вверх (в сторону старших адресов) - как обычно; если 1, то вниз (в сторону младших адресов) - как в стеке.

3.    Бит 9 во втором двойном слове. Если это сегмент кода, то данный бит говорит нам, можно ли читать из этого сегмента (если 0, то только выполнение, если 1, то выполнение и чтение). Если это сегмент данных, то данный бит показывает, можно ли записывать в этот сегмент (если 0, то только чтение, если 1, то чтение и запись).

4.    Бит 8 во втором двойном слове - A (accessed). Этот бит показывает, был ли произведен доступ к сегменту, описываемому этим дескриптором. Если процессор обращался к сегменту для чтения или записи данных или для выполнения кода, размещённого в нём, то бит А будет установлен (равен 1), в противном случае - сброшен (0). С помощью бита А операционная система может определить, использовался ли за последнее время этот сегмент и предпринять какие-либо действия. Бит А процессором только устанавливается; сбрасывать его должна операционная система. При создании нового дескриптора подразумевается, что бит А будет равен 0 (т. е. обращений к этому сегменту ещё не было).

 

Бит S (System). Если этот бит установлен, то дескриптор определяет сегмент кода или данных, а если сброшен, то системный объект (о системных объектах мы будет говорить далее). В сегментном дескрипторе этот бит установлен всегда - иначе четыре предыдущих флага интерпретировались бы совсем по-другому.

Поле DPL (Descriptor Privilege Level). Уровень привилегий, который имеет объект, описываемый данным дескриптором. Это 2-битовое поле, в которое при создании дескриптора записывают значения от 0 до 3, определяющие уровень привилегий. Например, у кода, который выполняется на нулевом уровне привилегий, в дескрипторе сегмента кода оба бита должны быть сброшены. Именно по этим битам (и по уровню привилегий сегмента стека) процессор и определяет уровень привилегий текущего выполняемого кода.

Бит Р (Present). Если этот бит установлен, то сегмент есть в памяти; если сброшен, то его нет. Этот бит применяется при реализации механизма виртуальной памяти - если программе понадобится память, то она сохранит содержимое какого-либо сегмента на диск и сбросит бит Р. Если любая программа в дальнейшем обратится к этому сегменту, то процессор сгенерирует исключение отсутствующего сегмента и запустит обработчик этой ситуации, который должен будет подгрузить содержимое сегмента с диска и установить бит Р. Затем управление снова передаётся команде, обратившейся к данному сегменту (производится повторное выполнение команды, вызвавшей сбой), и работа программы продолжается. Бит Р устанавливается и сбрасывается программами, сам процессор его только считывает. Но в реальности механизм подкачки осуществляется через механизм страничного преобразования. Обычно этот бит используется в случаях, когда нужно пометить свободный элемент в дескрипторной таблице.

 

Бит AVL. Этот бит процессор не использует и позволяет программе или операционной системе использовать его в своих целях.

Бит L (только 64-битный режим). В защищённом режиме этот бит зарезервирован и всегда сброшен. Если процессор находится в 64-битном режиме и если бит сброшен, то процессор работает в режиме совместимости. Если этот бит выставлен, то бит D должен быть сброшен. Подробнее об этом бите будем говорить позже.

Бит D (Defaultsize). Если бит сброшен, по процессор использует объект, описываемый данным дескриптором, как 16-разрядный; если установлен - то как 32-разрядный. Если ваша программа имеет 32-разрядный код, то он должен размещаться в 32-разрядном сегменте кода (т. е. в дескрипторе такого сегмента бит D должен быть равен 1). Если в регистре SS содержится селектор дескриптора, у которого выставлен данный бит, то размер элемента в стеке 32-битный, а если этот флаг сброшен, то 16-битный.

В защищённом режиме допускается использование одновременно 16- и 32-разрядных сегментов, но при написании новых программ подразумевается, что все сегменты будут 32-разрядные. Вряд ли когда-либо вам пригодится сбрасывать этот бит, разве что в 64-битном режиме, ибо одновременно биты D и L не могут быть выставлены.

Бит G (Granularity). Если бит G=0, то сегмент имеет байтную гранулярность, иначе - страничную (одна страница - это 4 Кб). Например, сегмент, имеющий предел, равный OFFh, при G = 0 будет иметь размер 255 байт, а при G = 1 - 1020 Кб (255 страниц).

 

Глобальная дескрипторная таблица

 

Глобальная дескрипторная таблица (далее GDT) хранится в памяти. Глобальную дескрипторную таблицу можно расположить по любому адресу в памяти. Рекомендуется располагать её по адресу, выровненному на границу 8 байт (т. е. кратному 8), поскольку при этом увеличивается скорость доступа к её элементам (дескрипторам).

В GDT может храниться до 8192 дескрипторов. Нулевой дескриптор, т. е. дескриптор, определённый в самом начале GDT, процессор не использует. Если всё же в программе встречается обращение к нулевому дескриптору, то процессор генерирует исключение и не позволит доступ к такому дескриптору, хотя при загрузке в сегментный регистр селектора нулевого дескриптора исключение не будет генерироваться. Адрес таблицы и её лимит хранятся в регистре GDTR. Лимит таблицы нужен для того, чтобы не произошло обращения за границу таблицы. Регистр GDTR в защищённом режиме имеет размер 6 байт; формат регистра GDTR приведён на рис.

 

 

 

Таблица может быть не больше чем 64 Кб, отсюда максимальное количество дескрипторов 8192 (65536/8=8192), точнее 8191, т. к. нулевой дескриптор не используется.

Для загрузки регистра GDTR используется команда LGDT. Эта команда является привилегированной и может выполняться программой, которая находится на нулевом уровне привилегий. Операндом должны быть 6 байт памяти. Для получения содержимого GDTR используется команда sgdt, формат команды такой же. Но она уже может выполняться на любом уровне.

Теперь вернёмся к началу. Что такое селектор? Селектор - это индекс дескриптора в GDT. Селектор имеет размер 2 байта и содержится в сегментом регистре или задаётся непосредственным значением. Формат селектора приведён на рис.

 

 

Бит TI указывает, к какой таблице следует обратиться. Подробнее этот бит будет рассматриваться далее. Поле RPL обозначает запрашиваемый уровень привилегий.

Теперь о преобразовании логического адреса. Обратиться к памяти можно несколькими способами:

сегмент указывается сегментным регистром, адрес - непосредственным значением или регистром;

сегмент указывается непосредственным значением селектора, адрес - непосредственным значением или регистром. В этом случае непосредственное значение загружается в соответствующий сегментный регистр (при прыжках селектор загружается в регистр CS, а при обращении к памяти -в DS);

просто смещение. В этом случае селектор берётся из соответствующего сегментного регистра (при прыжках из CS, при работе с данными - из DS).

 

 

Преобразование адреса в защищенном режиме

 

 

Как видите, значение селектора будет использовано в любом случае. Поэтому преобразование логического адреса в линейный будет происходить при каждом обращении к памяти. Схема преобразования логического адреса в линейный изображена на рис.

 

Из селектора извлекается поле индекса, по индексу находится соответствующий дескриптор, из дескриптора извлекается поле адреса базы. К адресу базы добавляется смещение. В итоге получается линейный адрес.

Линейный адрес преобразуется в физический. В наших программах мы пока не будем использовать механизм трансляции страниц (о котором пойдет речь в далее), поэтому логический адрес у нас всегда будет равен физическому адресу.

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

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

 

Любой современный МП в реальном режиме работы позволяет работать с так называемыми пользовательскими режимами. Начиная с i486 и Pentiumтаких регистров 16:

-Восемь 32-разрядных РОН

Eax/ax/ah/al,

ebx, ecx,edx –аналогично

ebp/bp, esi/si, edi/di, esp/sp

- шесть 16-разрядных сегментных регистра

cs, ds, ss, es, fs, gs

- регистры состояния и управления (32-разрядные)

eflags/flags, eip/ip

Существует еще 16 системных регистра.

Защищенный режим (ЗР) МП позволяет полностью использовать все возможности МП для многозадачного режима. При этом сегментация памяти усложняется.

Любой сегмент памяти в ЗР имеет следующие атрибуты:

- расположение сегментов памяти

- размер сегмента

- уровень привилегий – определяет права данного сегмента относительно других

- тип доступа – определяет назначение сегмента

и некоторые другие.

Перечисленные атрибуты показывают, что в ЗР МП поддерживает 2 типа защиты: по привилегиям и по доступу к памяти в отличии от реального режима.

Ключевым объектом ЗР является специальная структура – дескриптор сегмента, который представляет собой 8-байтовую структуру, содержащую перечисленные атрибуты.

Любая область ОП, которая логически может быть сегментом данных, стека или кода, должна быть описана дескриптором.

Все дескрипторы собираются вместе в одну из 3-х дескрипторных таблиц соответствующего назначения.

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

Системные регистры МП.

- 4 регистра управления

- 4 регистра системных адресов

- 8 регистров отладки

 

1) Регистры управления

Cr0, cr1, cr2, cr3

Предназначены для общего управления системой и доступны только для программ уровня привилегий 0.

Регистр cr1 зарезервирован для спец.использования и недоступен.

Cr0 содержит системные флаги, управляющие режимами работы МП, и отражающие его состояние глобально независимо от конкретно выполняющихся задач.

 Рассмотрим следующие системные флаги:

- pe (ProtectEnable), бит 0

pe=
             0 – реальный режим

             1 - ЗР

- mp (MattPresent), бит 1 – обозначает наличие сопроцессора. В современных компьютерах mp=1.

- ts (TaskSwitched), бит 3 – переключение задач; автоматически переключается при переключении на выполнение другой задачи.

- am (AlignmentMask), бит 18 – маска выравнивания

am=
             1 – разрешен контроль выравнивания

             0 - запрещен контроль выравнивания

- cd (CashDisable), бит 30 – запрещение кэш-памяти, если cd=1.

- pg (PaGing), бит 31

При pg=1 – разрешение страничного преобразования

Cr0 используется при страничной организации памяти.

Регистр Cr2 используется при страничной организации ОП в ситуации, когда текущая команда обратилась по адресу, содержащемуся на странице, отсутствующей в данный момент в ОП.

Тогда в МП возникает прерывание, и 32-битовый адрес команды записывается в Cr2, и обработчик определяет нужную страницу, подкачивает ее в ОП и возобновляет нормальную работу программы.

Регистр Cr3 используется так же при страничной организации памяти. Это регистр каталога страниц 1-го уровня. Он содержит 20-битовый физический базовый адрес каталога страниц текущей задачи. Этот каталог содержит 1024 32-битовых дескриптора, каждый из которых содержит адрес таблицы страниц 2-го уровня. Каждая из таблиц страниц 2-го уровня содержит 1024 32-битовых дескриптора, адресующих страничные кадры в памяти размером по 4 КБ.

2) Регистры системных адресов (реестры управления памятью)

Предназначены для защиты программ и данных в мультизадачном режиме работы МП.

В ЗР адресное пространство делится на:

- глобальное (общее для всех задач);

- локальные (отдельное для каждой задачи).

В МП существуют следующие регистры:

- GDTR (GlobalDescriptorTableRegister) – регистр таблицы глобальныхдескрипторов.

Размер – 48 бит. Из них 32 бита (с 16 по 27) базовый адрес глобальной дескрипторной таблицы(GTR) и 16-битовая (с 0 по 15) – значения предела, т.е. размер таблицы GDR в байтах.

- LDTR (LocalDescriptorTableRegister)) – регистр таблицы локальных дескрипторов.

Размер – 16 бит. Содержит селектор дескриптора LDT. Этот селектор является указателем в таблице GDT, который описывает сегмент, содержащий LDT.

- IDTR (InterruptDescriptorTableRegister) - регистр таблицы дескрипторов прерываний.

Размер – 48 бит. Предназначен для таблицы IDTаналогично GDTR.

- TR (TaskRegister) – регистр задачи. Размер – 16 бит. Подобно LDTRсодержит селектор, т.е. указатель на дескриптор в таблице GDT, который описывает текущий сегмент состояния задачи TSS(TaskSegmentStatus).

Этот сегмент создается для каждой задачи в системе, имеет жестко регламентированную структуры и содержит контекст (или текущее состояние задачи).

Основное назначение сегментов TSS – сохранить текущее состояние задачи в момент переключения на другую задачу.

3) Регистры отладки.

Предназначены для аппаратной отладки. Реально из 8 регистров используются 6 (все 32-битовые).

Dr0, dr1, dr2, dr3 – предназначены для задания линейных адресов 4-х контрольных точек прерывания. Используемый при этом механизм: любой формируемый текущей программой адрес сравнивается с адресами в регистрах dr0, dr3 и при совпадении генерируется «исключение отладки номер 1»

Регистр DR6 – регистр состояния отладки, биты этого регистра устанавливаются в соответствии с битами прерывания.

Регистр DR7 – регистр управления отладкой. В нем для каждого из регистров DR0...DR3 имеются поля, с помощью которых можно уточнить следующие условия, при которых генерируется прерывание.

- место регистрации контрольной точки (только в текущей задаче или в любой задаче). Это младшие 8 бит (по 2 бита на каждую контрольную точку).

- тип доступа, по которому инициализируется прерывание (только при выборе команды, при записи или при записи/чтении данных) хранится в старшей части регистра.     

Большинство из системных регистров программно доступны.


Поделиться с друзьями:

Эмиссия газов от очистных сооружений канализации: В последние годы внимание мирового сообщества сосредоточено на экологических проблемах...

Типы сооружений для обработки осадков: Септиками называются сооружения, в которых одновременно происходят осветление сточной жидкости...

Своеобразие русской архитектуры: Основной материал – дерево – быстрота постройки, но недолговечность и необходимость деления...

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



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.062 с.