Какая информация может содержаться в таблице дескрипторов прерываний

Какая информация может содержаться в таблице дескрипторов прерываний thumbnail

Лекция  №13

Система
прерываний 32-разрядных микропроцессоров
i80x86.

Работа системы
прерываний в защищенном режиме

Вопросы

1.   
Отличия работы системы прерываний в защищенном режиме

2.   
Классификация прерываний в защищенном режиме

3.    Таблица
дескрипторов прерываний IDT

4.    Обобщенная
схема обработки прерывания в защищенном режиме

5.    Шлюз
ловушки

6.    Шлюз
прерывания

7.    Шлюз
задачи

8.   
Резюме

Обработка прерываний в защищенном
режиме отличается от обработки в реальном режиме так же сильно, как и
защищенный режим отличается от реального.

Потому что:

1.   
В защищенном режиме немного изменено распределение
номеров векторов прерываний. (Можно самостоятельно посмотреть по таблицам,
например, в книге Аssembler Юрова,
Хорошенко на стр. 439-441)

2.   
Принципиально иным является механизм обработки
прерываний.

Классификация прерываний в защищенном режиме

Прерывания и исключения можно раз­делить
на несколько групп:

1.   
сбой;

2.   
ловушка;

3.   
аварийное завершение.

Это деление производится в
соответствии со следующими признаками:

·      какая
информация сохраняется о месте возникновения прерывания (ис­ключения)?

·      возможно
ли возобновление прерванной программы?

Исходя из этих признаков, можно
дать следующие характеристики вышепере­численным группам:

Сбой (ошибка) прерывание или исключение, при
возникновении которо­го в стек записываются значения регистров cs: ip, указывающие на команду,
вызвавшую данное прерывание. Это позволяет, получив доступ к сегменту кода,
исправить ошибочную команду в обработчике прерывания и, вернув управление
программе, фактически осуществить ее рестарт (вспомните, что в реальном режиме
при возникновении прерывания в стеке всегда запоми­нается адрес команды,
следующей за той, которая вызвала это прерывание).

Ловушка прерывание или исключение, при
возникновении которого в стек записываются значения регистров cs: ip,
указывающие на команду, сле­дующую за командой, вызвавшей данное
прерывание.

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

Механизм
ловушек похож на механизм прерываний в реальном режиме, хотя не во всем. Здесь есть один тонкий
момент. Если пре­рывание типа ловушки возникло в команде передачи управления jmp, то
со­держимое пары cs: ip в стеке будет отражать результат этого перехода,
то есть соответствовать команде назначения.

Аварийное
завершение прерывание, при
котором информация о месте его возникновения недоступна или неполна и поэтому
рестарт практически не­возможен, если только данная ситуация не была
запланирована заранее.

Þ
соответствующие программы-обработчики ошибок, ловушек и аварий будут отличаться
алгоритмами работы.

Микропроцессор
жестко определяет, какие прерывания являются ошибками, ловушками и авариями.

Замечания.

Для некоторых
номеров прерываний в реальном режиме возможны 2 источника прерывания
(развитие микропроцессоров).

Некоторые
прерывания при своем воз­никновении дополнительно генерируют и записывают в
стек так называемый код ошибки. Этот код
может впоследствии использоваться для установления источника прерывания. Код
ошибки записывается в стек вслед за содержимым регистров eflags, cs и eip.

Þ
можно распознать истинный источник прерывания (если есть неоднозначность).

Таблица дескрипторов прерываний IDT

Вместо таблицы векторов
прерываний система прерываний имеет дело с таблицей дескрипторов прерываний (IDT, interrupt descriptor table)

Таблица IDT
связывает каждый вектор прерывания с дескриптором процедуры или задачи, которая
будет обрабатывать это прерывание.

Элементами
таблицы IDT являются
дескрипторы — Размер дескриптора = 8 байтам.

(Т.е. формат
таблицы IDT подобен формату GDT и LDT.)

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

Шлюзы
предназначены для указания точки входа в программу обработки пре­рывания.

В дескрипторной
таблице прерываний IDT могут содержаться шлю­зы трех типов:

·     
шлюз ловушки;

·     
шлюз прерывания;

·      шлюз
задачи. 

Физически
микропроцессор отличает шлюзы по со­держимому полей.

Особенности
таблицы IDT:

·     нулевой
дескриптор используется для описания шлюза для программы обработки
исключительной ситуации 0 (ошибка деления);


таблице GDT отсутствует)

·     дескрипторы
в таблице IDT строго упорядочены в соответствии с номерами прерываний.

В
таблицах GDT и LDT порядок описания дес­крипторов роли не играет, хотя и
допускается наличие некоторых соглаше­ний по их упорядоченности;

·     размерность
таблицы IDT — не более
256 элементов размером по восемь байт, по числу возможных источников
прерываний.

В отдельных случаях есть
смысл описывать все 256 дескрипторов этой таблицы, формируя для неиспользуемых
номеров прерываний шлюзы-заглушки. Это позволит кор­ректно обрабатывать все
прерывания, даже если они и не планируются к использованию в данной задаче.
Если этого не сделать, то при незапланированном прерывании с номером,
превышающим пределы IDT для данной зада­чи, будет возникать исключительная
ситуация общей защиты (с номером 13 (ODh)).

Адрес и длина
таблицы IDT содержатся в регистре idtr

Заметим, что в реальном режи­ме
регистр idtr  также содержит адрес
таблицы прерываний, но при этом каждый вектор занимает 4 байта и содержит
32-разрядный адрес в формате CS:IP. Начальное значение этого
регистра равно нулю, но внего можно занести и другое значение.

Þ Возможно произвольное
размещение в памяти этой таблицы не только в за­щищенном режиме, но и реальном.

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

Доступ к таблице IDT со стороны
пользовательских (прикладных) программ невозможен. 

Обобщенная схема обработки прерывания в защищенном режиме

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

1.
Определяет местонахождение таблицы IDT, адрес и размер которой содер­жится в
регистре idtr.

2.
Складывает значение адреса, по которому размещена IDT, и значение n*8. По данному смещению в
таблице IDT должен находиться 8-байтовый дес­криптор,
определяющий местоположение процедуры обработки прерывания.

3.  
Переключается на процедуру обработки прерывания.

Шлюз
ловушки

Формат шлюза ловушки —

offset_2

p

dpl

1 1 1 1

000

не используется

63            47                   
39              36                                          32

indicator

                     offset_1

31            15                                                                                     

Offset_1, offset_2 — первая и
вторая половины смещения в сегменте

indicator — Селектор,
указывающий на дескриптор в LDT
или GDT

000 — Постоянное
значение

type — 1111 — Тип шлюза —
ловушка

dpl — Определение
минимального уровня приви­легий задачи, которая может передать управление
обработчику прерываний через данный шлюз (обычно dpl =
112)

p — Бит присутствия (0 или 1)

Когда возникает
прерывание и его вектор выбирает в таблице IDT дескриптор шлюза с типом ловушки, микропроцессор сохраняет в
стеке информацию о месте, где он прервал работу текущей программы. После этого
он передает управление в соответствии с полями indicator и offset.

Читайте также:  Какие витамины содержатся в морковке и для чего они полезны

Поле indicator представляет
селектор одной из таблиц, GDT или LDT, в зависимос­ти от состояния бита TI в нем.

Поле offset определяет смещение в
сегменте кода. Этот сегмент кода описывается дескриптором, на который указывает
се­лектор в поле indicator.

После того как
управление было передано обработчи­ку прерывания, он выполняет свою работу до
тех пор, пока не встретит коман­ду iret. Эта команда восстанавливает из стека состояние регистров eflags, cs и eip на момент возникновения
прерывания, и работа приостановленной про­граммы продолжается.

 При подготовке выхода из программы обработки пре­рывания
имейте в виду, что команда iret ничего не знает о возможности нали­чия в стеке
кода ошибки, поэтому для корректного возврата управления не забудьте при
необходимости предварительно удалить командой pop код ошиб­ки из стека.

Шлюз
прерывания

Шлюз
прерывания  отличается
только полем типа = 1110.

При
возникновении прерывания, которому соответствует шлюз прерывания,
микропроцессор выполняет те же действия, что и для шлю­за ловушки, но с одним важным
отличием:

при
передаче управления обработчику прерывания через шлюз прерывания,
микропроцессор сбрасыва­ет флаг прерывания в регистре eflags в 0, запрещая тем самым обработку аппа­ратных прерываний.
Этот факт имеет важное значение для программирования обработчиков аппаратных и
программных прерываний.

Совет. Если у вас есть сомнение в том, какой из шлюзов —
прерывания или ловушки — использовать — применяйте шлюз пре­рывания.

Шлюз задачи

Шлюз
задачи  отличается

1)   поле типа = 1110

2)   поле indicator вместо селектора сегмента кода указывает  на дескриптор сегмента состояния задачи (TSS).

Осуществляется
переход на новую задачу, которая будет осуществлять обработку прерывания. Задача является частью механизма
многозадачности. Т.е. производится переключение задач. (Текущее состояние
прерываемой задачи аппаратно сохраняется в ее собственном TSS.)

Для каждой задачи
определяется сегмент состояния задачи TSS (Task Segment Status) со строго определенной структурой. В этом сегменте
есть поля для со­хранения всех регистров общего назначения, некоторых системных
регистров и другой информации. Всю совокупность этой информации называют контек­стом задачи. Этот сегмент
описывается, подобно другим сегментам, дескрипто­ром в таблице GDT или LDT.

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

РЕЗЮМЕ

Шлюзы ло­вушки и
прерывания с помощью полей
indicator и offset
определяют адрес, по которому находится точка входа в программу обработки
прерывания.

Шлюз задачи
предназначен для реализации принципиально иного перехода к обра­ботчику
прерываний — с использованием механизма переключения задач.

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

Источник

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

Подробности в описании ниже , применяются специально для архитектуры x86 и AMD64 архитектуры. Другие архитектуры имеют схожие структуры данных, но могут вести себя по- разному.

Использование IDT вызывается тремя типами событий: аппаратные прерывания, программные прерывания и исключения процессоров, которые вместе называются прерываниями . IDT состоит из 256 векторов прерываний -Первый 32 (0-31 или 0x00-0x1F) , из которых зарезервированы для исключения процессора.

Реальный режим

В 8086 процессоре, таблица прерываний называются IVT (вектор прерывания таблицы). IVT всегда находится в том же месте в памяти, в пределах от 0x0000до 0x03ff, и состоит из 256-байтовых четыре реального режима дальних указателей (256 × 4 = 1024 байт памяти).

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

На 80286 и позже, размер и расположение бесступенчатой можно изменить таким же образом , как это делается с IDT в защищенном режиме (то есть, с помощью инструкции LIDT) , хотя это не меняет формат его. 80286 также ввел высокую область памяти , которая повышает предел адреса в реальном режиме по 65,520 байт.

Обычно используемые прерывания в реальном режиме х86 INT 10, то Video BIOS код для обработки примитивных функций экрана рисования , таких как пиксельный рисунок и изменение разрешения экрана.

Защищенный режим

В защищенном режиме , то IDT представляет собой массив из 8-байтовых дескрипторов , сохраненных в памяти последовательно и индексируемых с помощью вектора прерывания. Эти дескрипторы могут быть либо прерывают ворота, ловушки ворота или ворота задачи. Прерывание и ловушки ворота указывают на ячейку памяти , содержащую код для выполнения, указав как сегмент (присутствует либо в GDT или LDT ) и смещение внутри этого сегмента. Единственное различие между этими двумя , что прерыванием ворот отключит дальнейшую обработку процессора аппаратных прерываний, что делает его особенно подходящим для аппаратного обслуживания прерываний, в то время как ловушка ворот оставит аппаратные прерываний и, таким образом , в основном используется для обработки программных прерываний и исключений. И, наконец, задача ворот заставит текущую активную задачу-сегмент состояния необходимо переключить, используя аппаратный механизм переключателя задач , чтобы эффективно передать использование процессора к другой программе, нити или процесса.

Защищенный режим IDT может находиться в любом месте в физической памяти. Процессор имеет специальный регистр ( IDTR) для хранения как физического адреса базы и длиной в байтах IDT. Когда происходит прерывание, процессор умножает вектор прерывания на 8 и добавляет результат к базовому адресу IDT. С помощью длины IDT, полученный адрес памяти затем проверяется , чтобы быть в пределах таблицы; если оно слишком велико, генерируется исключение. Если все в порядке, 8-байтовый дескриптор хранится в вычисленной ячейке памяти загружаются и принимаются меры в соответствии с типом дескриптора и содержания.

Читайте также:  В каких продуктах содержаться простые углеводы

Полностью заселена IDT 2  КБ (256 записей по 8 байт каждый) в длину. Нет необходимости использовать все возможные записи: достаточно , чтобы заполнить IDT до самого высокого вектора прерывания используется, и установите часть длины IDT IDTRсоответственно.

Векторы 0-31 зарезервированы Intel для процессоров генерируются исключений ( общая ошибки защиты , неисправность страницы и т.д.). Хотя в настоящее время только векторы 0-20 используются процессором, будущие процессоры могут создавать несовместимости для разбитого программного обеспечения , которые используют эти векторы для других целей.

Аппаратные средства генерируемых исключений

Все INT_NUM между 0х0 и 0x1F включительно зарезервированы для исключения; INT_NUM больше 0x1F используется для обработки прерываний. (Обратите внимание , что IBM PC не всегда подчиняются этому правилу, например , с помощью прерывания 5 , чтобы указать Print Screen клавиша была нажата.)

INT_NUMКраткое описание PM
0x00 Деление на ноль
0x01Пошаговое прерывание (см флага прерываний )
0x02 NMI
0x03Точка останов (вызываемый по специальной инструкции 1-байтового 0xCC, используемый отладчики)
0x04перелив
0x05Bounds
0x06Invalid Опкод
0x07Сопроцессор не доступен
0x08 Дважды вина
0x09Сопроцессора Сегмент перерасход (386 или чуть раньше)
0x0AНедопустимый сегмент состояния задачи
0x0BСегмент нет
0x0CОшибка стека
0x0D Нарушение защиты общего характера
0x0E неисправность Page
0x0F зарезервированный
0x10Math Fault
0x11Выравнивание Проверка
0x12Machine Check
0x13 SIMD Floating-Point Exception
0x14Виртуализация Исключение
0x15Исключение Защита управления

Зацепление

Некоторый Windows , программа Крючок вызовов на IDT. Это включает в себя написание в режиме ядра драйвер , который перехватывает вызовы к IDT и добавляет в ее собственной обработке. Это никогда не было официально поддерживается Microsoft , но не было предотвращено на программно своих операционных системах до 64-битных версий Windows, в том случае , если водитель , который пытается использовать режим ядра крючка будет вызывать машину для проверки ошибок .

Рекомендации

генеральный

  • Intel 64 и Manual, Volume 3 IA-32 архитектуры программного обеспечения разработчик: Руководство по системному программированию

внешняя ссылка

  • Intel® 64 и IA-32 Архитектуры Software Developer Руководство, Том 3A: Система Руководство по программированию, часть 1 (глава 5, ПРЕРЫВАЙТЕ И ИСКЛЮЧЕНИЕ ОБРАБОТКА и Глава 10, ADVANCED PROGRAMMABLE контроллер прерываний)]
  • Таблицы дескрипторов прерываний в OSDev.org

Источник

Сегментная организация памяти в защищенном режиме

В основе сегментной модели памяти лежит разделение ее на независимые адресные пространства переменной длины — сегменты. Для программы адресное пространство разделено на блоки смежных адресов, называемых сегментами, а программа может обращаться только к данным, находящимся в этих сегментах. Внутри сегментов применяется линейная адресация, то есть программа может обращаться к байту 0, байту 1 и т. д. Такая адресация осуществляется относительно начала сегмента, и физический адрес, ассоциируемый, например, с программным адресом 0, по существу, скрыт от программиста. Этот подход к управлению памятью опирается на тот факт, что программы обычно логически разделяются на области (сегменты) кода, данных и стека. При этом упрощается изоляция программ друг от друга в мультипрограммном режиме работы. Каждый сегмент имеет свое целевое назначение. Каждая задача имеет непосредственный доступ к трем основным сегментам: кода, данных и стека, определяемых сегментными регистрами CS, DS SS соответственно, и к трем дополнительным сегментам данных, определяемых сегментными регистрами ES, FS, GS. Описания этих сегментов содержатся в их дескрипторах. Любая программа, независимо от уровня ее привилегий, не может обращаться к сегменту до тех пор, пока он не описан с помощью дескриптора, а сам дескриптор не помещен в таблицу дескрипторов.

Дескрипторы хранятся либо в глобальной таблице дескрипторов (Global Descriptor Table — GDT), либо в локальных таблицах дескрипторов (Local Descriptor Table — LDT). В GDT содержатся дескрипторы сегментов, которые доступны всем активным задачам, имеющимся в системе на данный момент. GDT может содержать любые дескрипторы сегментов, за исключением дескрипторов прерываний и ловушек. Обычно GDT включает дескрипторы сегментов кодов и данных операционной системы, сегментов состояния задач и дескрипторы сегментов, содержащих локальные таблицы дескрипторов. Микропроцессорная система имеет единственную глобальную таблицу дескрипторов.

Локальная таблица дескрипторов LDT используется для хранения дескрипторов, доступных только данной задаче. Их количество определяется количеством активных задач в системе.

С точки зрения расположения в памяти, локальные таблицы дескрипторов представляют собой обычные сегменты. Они могут накладываться друг на друга, частично пересекаться. Это приводит к тому, что отдельные сегменты, описанные дескрипторами в своих LDT, могут разделяться несколькими задачами (рис. 3.8).

Описание сегментов в таблицах дескрипторов

Рис.
3.8.
Описание сегментов в таблицах дескрипторов

Для нахождения дескриптора в таблице дескрипторов используется селектор, который содержится в одном из сегментных регистров. Селектор представляет собой 16-разрядое слово, которое разбито на 3 поля (рис. 3.9):

  • TI ( Table Indicator — индикатор таблицы ) показывает, к какой таблице идет обращение: TI = 0 — дескриптор находится в глобальной таблице дескрипторов GDT, TI = 1 — в локальной таблице LDT;
  • Index: поле индекса — номер дескриптора в соответствующей таблице дескрипторов;
  • RPL ( Request privilege level — уровень привилегий запроса ). При обращении сравнивается с полем DPL в байте доступа дескриптора.

Обращение разрешается, если уровень привилегий запроса не ниже, чем уровень привилегий дескриптора.

Формат селектора

Рис.
3.9.
Формат селектора

Максимальное количество дескрипторов, находящихся в таблице дескрипторов, определяется длиной поля Index селектора и равно 213. Так как каждый дескриптор имеет длину 8 байт, максимальный объем любой таблицы дескрипторов составляет 216байт. Каждая из таблиц дескрипторов имеет регистр ( GDTR для глобальной таблицы и LDTR для локальной), определяющий ее положение в памяти. Регистр GDTR содержит 48 разрядов, из которых 32 задают базовый адрес глобальной таблицы дескрипторов, а 16 указывают ее объем в байтах (границу таблицы). Для определения положения дескриптора относительно начала таблицы его номер (поле Index селектора) умножается на 8, то есть реально сдвигается на три разряда влево, так как длина дескриптора составляет 8 байт. Если селектор обращается к дескриптору, содержащемуся в таблице GDT (при TI = 0 в селекторе), то полученное смещение сравнивается с хранящейся в GDTR границей таблицы. Если нарушения границы нет, то смещение прибавляется к содержащемуся в GDTR базовому адресу, в результате чего образуется физический адрес выбираемого дескриптора (рис. 3.10).

Читайте также:  Какие вещества содержаться в мидиях

Нулевой дескриптор в GDT является пустым, не используемым. Селектор с нулевым значением разрядов 2….15 называется нуль-индикатором. Он обеспечивает обращение к нулевому дескриптору GDT. Так как этот дескриптор не используется, то при обращении к нему происходит прерывание. Одно из возможных применений пустых селекторов заключается в следующем. Перед инициированием задачи операционная система может загрузить в регистры DS и ES пустые селекторы. Если в последующем не инициализировать эти регистры, то адресация памяти через них вызовет особый случай (прерывание). Загрузка в LDTR пустого селектора, для которого поле Index = 0, допустима. Такая операция сообщает процессору о том, что в задаче не будет использоваться локальная дескрипторная таблица. Это характерно для небольших однопользовательских систем.

Для обращения к локальной таблице дескрипторов предназначен 16-разрядный регистр LDTR. Он содержит селектор, определяющий размещениев GDT дескриптора используемой локальной таблицы дескрипторов.

Получение дескриптора, находящегося в глобальной таблице дескрипторов GDT

Рис.
3.10.
Получение дескриптора, находящегося в глобальной таблице дескрипторов GDT

Такая структура упрощает работу с таблицами LDT. Благодаря описанию LDT с помощью селектора эти таблицы превращаются в обычные сегменты памяти и, в частности, могут размещаться в любых областях памяти, участвовать в свопинге и т. п. Внутри процессора с регистром LDTR ассоциируется так называемый «теневой регистр», в котором и хранится дескриптор LDT текущей задачи. Это ускоряет в последующем обращение к локальной таблице дескрипторов текущей задачи. При переключении с одной задачи на другую для замены используемой LDT достаточно загрузить в регистр LDTR селектор новой LDT, а процессор уже автоматически загрузит в теневой регистр дескриптор новой LDT при первом обращении к нему.

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

Он более сложен по сравнению с получением дескриптора из глобальной таблицы дескрипторов и проходит следующие этапы:

  1. Анализируем, к какой из двух возможных таблиц дескрипторов идет обращение. Если в селекторе TI = 1, то обращение идет к локальной таблице дескрипторов.
  2. Находим дескриптор локальной таблицы дескрипторов в глобальной таблице дескрипторов.

    Получение дескриптора, находящегося в локальной таблице дескрипторов LDT

    Рис.
    3.11.
    Получение дескриптора, находящегося в локальной таблице дескрипторов LDT

  3. Считываем дескриптор LDT в «теневой» регистр регистра LDTR микропроцессора. После считывания дескриптора в «теневой» регистр дальнейшее обращение к сегменту аналогично обращению к GDT, где вместо GDT R используются поля базового адреса и предела из дескриптора LDTR, находящегося в «теневом» регистре.
  4. По адресу локальной таблицы дескрипторов, находящемуся в ее дескрипторе, и номеру дескриптора из обрабатываемого селектора находим дескриптор сегмента в локальной таблице дескрипторов.
  5. Записываем дескриптор сегмента в «теневой» регистр сегментного регистра микропроцессора для ускорения последующих обращений к искомому сегменту.

Таким образом, при обращении к сегменту через таблицу LDT появляется дополнительный уровень вложенности, снижающий быстродействие микропроцессора. «Теневые» регистры микропроцессора частично обеспечивают решение этой проблемы.

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

В случае если режим страничной адресации выключен (в регистре CR0 бит PG = 0), полученный линейный адрес равен физическому адресу искомого операнда или команды.

Рассмотрим подробнее процесс получения адреса операнда на примере команды

MOV EAX, [ECX+ESI+20h].

В этой команде нет специальных указаний об использовании сегмента, поэтому она обращается к текущему сегменту данных, селектор которого по умолчанию находится в сегментном регистре DS. Пусть (DS) = 0000000000011.0.XXb.

Формирование физического адреса операнда включает следующие действия (для сегментированного ЛАП):

  1. Образовать эффективный адрес (вычислить смещение в сегменте):

    EA = (ECX)+(ESI)+20h.

  2. Выбрать 3-й дескриптор ( Index = 3 ) из GDT (TI = 0).

    Для этого:

  3. Получить линейный адрес: ЛА = EA + A_{баз дескр.3}, где A_{баз дескр.3} -базовый адрес сегмента из считанного дескриптора с номером 3.
  4. Так как при сегментной организации адресного пространства линейный адрес равен физическому, следует обратиться к памяти по сформированному адресу и передать двойное слово в EAX.

При TI = 1 потребовалось бы еще одно обращение к памяти для счтывания дескриптора LDT из GDT.

Чтобы сократить число обращений к памяти (а такой процесс должен проходить и при считывании кода каждой команды), в микропроцессорах с архитектурой IA-32 применяется так называемое кэширование дескрипторов. Кэширование опирается на тот факт, что обращение к памяти производятся гораздо чаще, чем изменение используемых сегментов и переключение задач. Поэтому с каждым регистром, содержащим селекторы тех или иных сегментов (сегментные регистры, а также регистры локальной таблицы дескрипторов LDTR и регистр задач TR ), ассоциируются «теневые», или кэш-регистры.

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

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

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

IDT служит заменой таблицы векторов прерываний 16-разрядного микропроцессора. Обращение к ней проводится только аппаратными средствами МП при возникновении аппаратных прерываний или особых случаев при выполнении программы. Программы самостоятельно не могут обратиться к IDT, так как единственный бит индикатора таблицы в селекторе сегмента идентифицирует только GDT или LDT.

До перевода процессора в защищенный режим необходимо создать таблицы GDT и IDT и соответственно инициализировать регистры GDTR и IDT R. Таблицы GDT и IDT определяются при загрузке в соответствующие регистры GDTR и IDT R базового адреса и предела. Это действие осуществляется только один раз в ходе подготовки к переходу в защищенный режим, и в дальнейшем содержимое GDTR и IDTR не изменяется. Это значит, что местонахождение таблиц GDT и IDT в известном смысле фиксировано, и они не могут участвовать в свопинге.

Источник