Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Orgevm_Ekzamen.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
998.59 Кб
Скачать

Форматы таблиц gdt, ldt и idt.

3.4. Системные таблицы

ТАБЛИЦА GDT. Эта таблица создается еще в реальном режиме и содержит следующие виды дескрипторов:

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

  • Дескрипторы сегментов, разделяемых несколькими задачами.

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

  • Дескриптор таблицы IDT, где она описана как сегмент данных (причины те же).

  • Дескрипторы всех созданных в системе таблиц LDT .

  • Альтернативные дескрипторы для всех LDT, где эти таблицы описаны как сегменты данных.

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

  • Альтернативные дескрипторы для всех TSS, где TSS описаны как сегменты данных.

  • Возможно другие дескрипторы и шлюзы.

Не следует конечно думать что все перечисленные выше дескрипторы должны обязательно присутствовать в GDT. А вот нулевой (самый первый дескриптор в таблице) дескриптор в GDT обязательно должен быть пустым (состоять из одних нулей). Его использует МП для системных целей.

Для того чтобы МП знал где в ОП располагается таблица GDT, внутри МП имеется специальный регистр gdtr: Его формат приведен на рис. 48.

47 16

15 0

начальный адрес GDT

размер GDT

Рис. 48

Размер GDT задается в байтах. Для загрузки этого регистра используется команда lgdt m 40 / m 48. То есть команда загружает в регистр пять или шесть байт из памяти (пять байт здесь используется для совместимости с МП 286, который работал не с 32-х, а с 24-х разрядным адресом). Например, следующая команда загружает в регистр gdtr шесть байт из области памяти, на которую указывает регистр si;

lgdt pword ptr [si].

Команда lgdt допустима как в реальном, так и в защищенном режимах, но в защищенном она доступна только на 0-м уровне привилегий. При первом использовании этой команды (еще в реальном режиме) задается местоположение таблицы в памяти и ее размер. В дальнейшем эта команда может использоваться для изменения размера GDT, например, если понадобилось добавить в GDT новые дескрипторы. Менять местоположение GDT в памяти не имеет никакого смысла (хотя рассматриваемая команда и предоставляет такую возможность).

Таблица GDT в системе всегда одна и всегда должна находиться в ОП. А вот содержимое этой таблицы постоянно обновляется ОС и самим МП. Например, отправив сегмент из ОП на диск ОС должна соответствующим образом пометить дескриптор этого сегмента. Для того чтобы можно было изменять содержимое GDT должен быть создан дескриптор, где эта таблица была бы описана как сегмент данных. Этот дескриптор располагают в самой GDT.

ТАБЛИЦА IDT. Это дескрипторная таблица прерываний. Хотя таблица называется дескрипторной в ней располагаются только шлюзы. Связано это с тем что прерывание может произойти когда мы находимся на любом уровне привилегий (может на 0-м, а может на 3-м). При этом, на каком бы уровне мы не находились, мы должны получить доступ к обработчику. Иначе говоря, обработчик любого прерывания должен быть доступен (через IDT! )с любого уровня привилегий. А это можно осуществить только через шлюз. В данной таблице могут располагаться шлюзы трех типов:

  • шлюзы задач;

  • шлюзы ловушки;

  • шлюзы прерывания.

Таблица IDT, так же как и таблица прерываний МП 8986, задает 256-ть (или меньше) обработчиков прерываний. Для каждого имеющегося в системе обработчика в таблице должен быть шлюз. Учитывая что шлюз занимает в памяти 8-мь байт можно сделать вывод что максимальный размер IDT равен 256×8=2Кбайта. Напомним, что в реальном режиме и в МП 8086 размер таблицы векторов прерываний 1Кбайт.

Таблица IDT может располагаться в любом месте ОП (в отличие от МП 8086, где подобная таблица фиксируется в младшем килобайте ОП). Для того чтобы МП 486 знал где находится IDT и каков ее размер внутри МП имеется регистр idtr. Его формат аналогичен рассмотренному выше формату регистра gdtr. Кстати отсюда следует (смотри формат регистра) что мы можем задать размер IDT больше 2-х Кбайт (вплоть до 64Кбайт), но смысл будут иметь не более 2-х младших килобайт этой области, так как обработчиков не может быть больше 256-ти. Загрузка регистра idtr производится командой lidt m 40 / m 48. Для этой команды справедливо все сказанное выше о команде lgdt.

Таблица IDT в системе всегда одна и всегда должна находиться в ОП. А вот содержимое этой таблицы по ходу работы может меняться. Для того чтобы можно было менять содержимое IDT для нее должен быть создан дескриптор, в котором эта таблица описана как сегмент данных. Этот дескриптор размещается в GDT.

ТАБЛИЦЫ LDT. Для каждой задачи в системе может быть создана ( а может и не создаваться) своя таблица LDT. В нее сводятся дескрипторы всех сегментов с которыми работает только эта задача. В LDT могут находится дескрипторы сегментов кода, данных и стека, а так же шлюзы вызова и задач.

Таким образом подобных таблиц в системе может быть много и располагаться они могут как в ОП, так и на диске. Для того чтобы МП знал где находится LDT текущей задачи в его состав введен специальный регистр ldtr. Формат этого регистра не похож на формат gdtr, а скорее похож на формат обычного сегментного регистра (см. рис. 49). Дело в том что смена LDT происходит при смене задачи, при этом МП загружает в ldtr новый селектор, задающий дескриптор LDT в таблице GDT. То есть «с точки зрения GDT» таблица LDT представляет из себя сегмент специального вида. У этого сегмента есть дескриптор, который располагается в GDT и в котором задан начальный адрес LDT, ее размер и. т. д.

15 0

63 0

селектор LDT

дескриптор LDT

видимая часть

теневая часть

Рис. 49

В видимую часть загружается селектор, адресующий дескриптор LDT в таблице GDT. При правильном обращении из этого дескриптора берутся начальный адрес и размер LDT и копируются в теневую часть ldtr, с тем чтоб в дальнейшем эта информация была у МП «под рукой». В процессе работы системы загрузка нового селектора в видимую часть ldtr (а следовательно и смена LDT) происходит при переходе на новую задачу. Новый селектор берется при этом из соответствующего поля сегмента TSS входящей задачи. Для первоначальной загрузки регистра ldtr применяется команда lldt r 16 / m 16. Эта команда загружает в ldtr новый селектор из любого 16-ти разрядного регистра МП или из памяти. Эта команда доступна только в защищенном режиме и только на 0-м уровне привилегий.

Содержимое таблиц LDT может меняться по ходу работы. Для того чтобы у нас была возможность вносить изменения в LDT для каждой из них должен быть создан альтернативный дескриптор, где эти таблицы описаны как сегменты данных. Такие дескрипторы располагаются в GDT.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]