для чего в архитектуре x86 используется регистр таблицы дескрипторов прерываний

Программирование процессоров Intel x86 в защищённом режиме
Программные прерывания


Автор: sergh
The RSDN Group

Опубликовано: 02.04.2006
Версия текста: 1.0

Конечно же, вы знаете, что такое прерывание (interrupt), слышали о таблице векторов прерываний (interrupt vector table) и вообще довольно неплохо представляете, как прерывания обрабатываются в реальном режиме 🙂

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

Но, тем не менее, пару общих слов сказать нужно, так как тема важная и непростая.

Общие слова

В защищённом режиме это не обязательно будет подпрограмма, есть ещё один вариант, он будет обсуждаться отдельно, в главе «Многозадачность».

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

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

Аналог таблицы векторов прерываний, существующий в защищённом режиме, называется таблицей дескрипторов прерываний (Interrupt Descriptor Table, IDT).

Это термин из официального руководства Intel. В книге Дэвида Соломона и Марка Руссиновича «Внутреннее устройство Windows 2000» (Питер, Русская Редакция, 2001) упоминается IDT, но, почему-то, там она названа таблица диспетчеризации прерываний (interrupt dispatch table), причём это не ошибка русских переводчиков, в английском оригинале используется такое же название. На мой взгляд, следует придерживаться терминологии Intel.

По формату и способу инициализации IDT практически идентична GDT. Основные отличия:

Таким образом, слегка модифицируя код из предыдущей главы, получаем пример инициализации IDT:

Несложно заметить, что та же самая структура table_register подходит и для загрузки в IDTR.

Дескриптор шлюза ловушки

Как уже говорилось в предыдущей главе, дескриптор это структура, описывающая некую системную сущность. Очередным типом дескрипторов, с которым вам придется познакомиться, будет дескриптор шлюза ловушки (trap gate descriptor; в [Гук 1999] слово «gate» переводится как «вентиль», это стандартный перевод для схемотехники, программисты обычно говорят «шлюз»), он предназначен для IDT и имеет следующий формат:

ПоложениеНазваниеКраткое описание
Нулевой и первый байтыOffset (part 1)Младшие два байта 32-х битного поля Offset. Поле Offset содержит смещение обработчика прерывания.
Второй и третий байтыSegment SelectorСелектор сегмента, содержащего обработчик прерывания.
Четвёртый байт00, просто 0. Эта часть дескриптора не используется.
0-й – 3-й биты пятого байта??Для дескриптора шлюза ловушки значение должно быть равно 1111b. Подробности про это и следующее поле в разделе «[Лирическое отступление] Классификация дескрипторов».
4-й бит пятого байта??Устанавливайте в 0.
5-й – 7-й биты пятого байта??Пока неважно, устанавливайте в 100b.
Шестой и седьмой байтыOffset (part 2)Старшие два байта поля Offset.
Таблица 1. Формат дескриптора шлюза ловушки.

То же самое на картинке:

Рисунок 1. Формат дескриптора шлюза ловушки.

Основная информация, которую несёт в себе дескриптор шлюза ловушки, это:

Поскольку формат практически прозрачен, остаётся только привести пример:

Это дескриптор шлюза ловушки, селектор сегмента указывает на первый дескриптор GDT, смещение – 01020304h. В виде структуры дескриптор шлюза выглядит так:

[Лирическое отступление] Классификация дескрипторов


Сегмента-кода-или-данных/системный

Первый признак классификации дескрипторов – значение 4-го бита пятого байта дескриптора. Полное название этого бита – флаг «descriptor type», краткое – флаг «S» (довольно странное сокращение, но везде применяется именно оно). В соответствии с этим признаком, дескрипторы делятся на два класса:

Системные дескрипторы имеют различный формат и единственное общее отличие их формата от формата дескрипторов сегмента кода/данных – младшие четыре бита пятого байта. Для обоих видов дескрипторов это поле называется «Type» и уточняет тип дескриптора, но при этом используются разные подходы:

Сегмента/шлюза

Второй признак классификации – характер сущности, описываемой дескриптором. Это может быть:

Дескрипторы, описывающие похожие сущности, имеют близкие форматы. Так, любой дескриптор сегмента по формату похож на дескриптор сегмента кода/данных, а любой дескриптор шлюза – на дескриптор шлюза ловушки.

Всё вместе

Объединим всё, уже известное про прерывания и добавим недостающие детали.

Вызов обработчика прерывания

Целью всего механизма обработки прерываний является своевременный вызов обработчика. В нашем случае (остальные случаи – в остальных главах, описывать всё сразу совершенно ни к чему) вызов происходит примерно так:

Ещё раз обращаю ваше внимание: независимо от префиксов команд, разрядности сегмента стека, разрядности целевого и исходного сегмента кода и т.п. (всё это будет обсуждаться в приложении в разделе про разрядность), под EFLAGS, CS, EIP в стеке выделяется 12 байт, по 4 байта на каждый регистр.

Это связано с тем, что тип 1111b соответствует 32-х разрядному дескриптору шлюза ловушки. Существует полностью аналогичный 16-и разрядный, но он в курсе не рассматривается.

Упрощённая версия алгоритма в виде комикса:

Рисунок 2. Немного упрощенный алгоритм вызова обработчика прерывания.

Ключевые признаки, отделяющие «наш» случай от «не нашего»:

Переключение режимов: инициализация IDT

Добавим к алгоритмам переключения ещё несколько шагов. Из реального режима в защищённый:

В данном случае нельзя использовать CS, оставшийся «в наследство» от реального режима, так как при возврате из обработчика прерывания сохранённое в стеке значение CS будет толковаться как селектор сегмента.

Поскольку обрабатывать аппаратные прерывания мы пока не планируем, разрешать прерывания будет преждевременно.

Сохранение значения IDTR


Пример


Обработчик int 0

Источник

Дескрипторные таблицы

Дескрипторные таблицы — служебные структуры данных, содержащие дескрипторы сегментов.

В архитектуре x86 есть три вида дескрипторных таблиц:

Содержание

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

Глобальная дескрипторная таблица является общей для всех процессов. Её размер и расположение в физической памяти определяются регистром GDTR. Размер таблицы не может превышать 8192 дескрипторов, поскольку один дескриптор занимает 8 байт, а лимит в регистре GDTR — двухбайтный и хранит размер таблицы минус один (максимальное значение лимита — 65535), а 8192 x 8 = 65536.

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

Особенностью GDT является то, что у неё запрещён доступ к первому (с нулевым смещением относительно начала таблицы) дескриптору. Обращение к нему вызывает исключение #GP, что предотвращает обращение к памяти с использованием незагруженного сегментного регистра.

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

В отличие от GDT, LDT может быть много (соответственно количеству задач (потоков), но не обязательно). Каждая задача может иметь свою. На расположение таблицы текущей задачи указывает регистр LDTR.

Размер и расположение LDT в линейной памяти определяются дескриптором LDT из GDT (но это не означает, что размер LDT может быть больше 65536 байт).

Первый дескриптор LDT (№ 0) использовать можно.

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

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

При возникновении прерывания (внешнего, аппаратного, или вызванного инструкцией Int):

См. также

Ссылки

Полезное

Смотреть что такое «Дескрипторные таблицы» в других словарях:

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

Защищённый режим — (режим защищённой виртуальной адресации) режим работы x86 совместимых процессоров. Частично был реализован уже в процессоре 80286, но там существенно отличался способ работы с памятью, так как процессоры еще были 16 битными и не была… … Википедия

GDTR — (англ. Global Descriptor Table Register регистр глобальной дескрипторной таблицы) специальный 48 битный регистр, который описывает местоположение и размер таблицы, содержащей дескрипторы. Он появился вместе с механизмом защиты в… … Википедия

Таблица векторов прерываний — (англ. Interrupt Descriptor Table, IDT) используется в x86 архитектуре и служит для определения корректного ответа на прерывания и исключения. В микропроцессорах 8086/80186 таблица векторов прерываний расположена в первом килобайте памяти… … Википедия

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

Источник

Лекция 3: Физическая и логическая организация адресного пространства

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

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

для чего в архитектуре x86 используется регистр таблицы дескрипторов прерываний. Смотреть фото для чего в архитектуре x86 используется регистр таблицы дескрипторов прерываний. Смотреть картинку для чего в архитектуре x86 используется регистр таблицы дескрипторов прерываний. Картинка про для чего в архитектуре x86 используется регистр таблицы дескрипторов прерываний. Фото для чего в архитектуре x86 используется регистр таблицы дескрипторов прерываний

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

для чего в архитектуре x86 используется регистр таблицы дескрипторов прерываний. Смотреть фото для чего в архитектуре x86 используется регистр таблицы дескрипторов прерываний. Смотреть картинку для чего в архитектуре x86 используется регистр таблицы дескрипторов прерываний. Картинка про для чего в архитектуре x86 используется регистр таблицы дескрипторов прерываний. Фото для чего в архитектуре x86 используется регистр таблицы дескрипторов прерываний

для чего в архитектуре x86 используется регистр таблицы дескрипторов прерываний. Смотреть фото для чего в архитектуре x86 используется регистр таблицы дескрипторов прерываний. Смотреть картинку для чего в архитектуре x86 используется регистр таблицы дескрипторов прерываний. Картинка про для чего в архитектуре x86 используется регистр таблицы дескрипторов прерываний. Фото для чего в архитектуре x86 используется регистр таблицы дескрипторов прерываний

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

для чего в архитектуре x86 используется регистр таблицы дескрипторов прерываний. Смотреть фото для чего в архитектуре x86 используется регистр таблицы дескрипторов прерываний. Смотреть картинку для чего в архитектуре x86 используется регистр таблицы дескрипторов прерываний. Картинка про для чего в архитектуре x86 используется регистр таблицы дескрипторов прерываний. Фото для чего в архитектуре x86 используется регистр таблицы дескрипторов прерываний

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

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

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

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

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

Источник

Прерывания и особые случаи

Прерывания и особые случаи

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

Классификация прерываний представлена на рис. 7.1.

для чего в архитектуре x86 используется регистр таблицы дескрипторов прерываний. Смотреть фото для чего в архитектуре x86 используется регистр таблицы дескрипторов прерываний. Смотреть картинку для чего в архитектуре x86 используется регистр таблицы дескрипторов прерываний. Картинка про для чего в архитектуре x86 используется регистр таблицы дескрипторов прерываний. Фото для чего в архитектуре x86 используется регистр таблицы дескрипторов прерываний

Запросы аппаратных прерываний возникают асинхронно по отношению к работе микропроцессора и связаны с работой внешних устройств.

Запрос от немаскируемых прерываний поступает на вход NMI микропроцессора и не может быть программно заблокирован. Обычно этот вход используется для запросов прерываний от схем контроля питания или неустранимых ошибок ввода/вывода.

Для запросов маскируемых прерываний используется вход INT микропроцессора. Обработка запроса прерывания по данному входу может быть заблокирована сбросом бита IF в регистре флагов микропроцессора.

Программные прерывания делятся на следующие типы.

Порядок обработки прерываний

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

Обработка запросов прерываний состоит из:

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

Всего микропроцессор различает 256 типов прерываний. Таким образом, все они могут быть закодированы в 1 байте.

«Рефлекторные» действия микропроцессора по обработке запроса прерывания выполняются аппаратными средствами МП и включают в себя:

для чего в архитектуре x86 используется регистр таблицы дескрипторов прерываний. Смотреть фото для чего в архитектуре x86 используется регистр таблицы дескрипторов прерываний. Смотреть картинку для чего в архитектуре x86 используется регистр таблицы дескрипторов прерываний. Картинка про для чего в архитектуре x86 используется регистр таблицы дескрипторов прерываний. Фото для чего в архитектуре x86 используется регистр таблицы дескрипторов прерываний

для чего в архитектуре x86 используется регистр таблицы дескрипторов прерываний. Смотреть фото для чего в архитектуре x86 используется регистр таблицы дескрипторов прерываний. Смотреть картинку для чего в архитектуре x86 используется регистр таблицы дескрипторов прерываний. Картинка про для чего в архитектуре x86 используется регистр таблицы дескрипторов прерываний. Фото для чего в архитектуре x86 используется регистр таблицы дескрипторов прерываний

В IDT могут храниться только дескрипторы следующих типов:

Шлюзы ловушки и прерывания сходны со шлюзом вызова, только в них отсутствует поле счетчика WC (рис. 7.4). Так как прерывание является неожиданным событием и не связано с текущей программой, говорить о передаче параметров их обработчику не приходится.

для чего в архитектуре x86 используется регистр таблицы дескрипторов прерываний. Смотреть фото для чего в архитектуре x86 используется регистр таблицы дескрипторов прерываний. Смотреть картинку для чего в архитектуре x86 используется регистр таблицы дескрипторов прерываний. Картинка про для чего в архитектуре x86 используется регистр таблицы дескрипторов прерываний. Фото для чего в архитектуре x86 используется регистр таблицы дескрипторов прерываний

Бит присутствия P может быть равен как 0, так и 1.

При входе в обработчик через шлюз ловушки флаг IF не меняется.

Источник

Работа микропроцессоров Intel x86 в защищенном режиме. Общая схема формирования исполнительного адреса. Кольца защиты. Организация дескрипторных таблиц. Типы дескрипторов.

1) Концепция незащищенного режима:

для чего в архитектуре x86 используется регистр таблицы дескрипторов прерываний. Смотреть фото для чего в архитектуре x86 используется регистр таблицы дескрипторов прерываний. Смотреть картинку для чего в архитектуре x86 используется регистр таблицы дескрипторов прерываний. Картинка про для чего в архитектуре x86 используется регистр таблицы дескрипторов прерываний. Фото для чего в архитектуре x86 используется регистр таблицы дескрипторов прерыванийOffset – смещение, дает возможность создавать сегменты размером до 64кб, однако сам сегмент памяти, выделенный под задачу может иметь размер 13 ) дескрипторов

Билет №11

Работа с подпрограммами в режиме защищенного адреса микропроцессоров Intel x86. Межкольцевые вызовы подпрограмм. Ограничение прав доступа. Управление задачами. Сегмент состояния задачи. Вложенные задачи.

для чего в архитектуре x86 используется регистр таблицы дескрипторов прерываний. Смотреть фото для чего в архитектуре x86 используется регистр таблицы дескрипторов прерываний. Смотреть картинку для чего в архитектуре x86 используется регистр таблицы дескрипторов прерываний. Картинка про для чего в архитектуре x86 используется регистр таблицы дескрипторов прерываний. Фото для чего в архитектуре x86 используется регистр таблицы дескрипторов прерываний

Дескриптор содержит байт доступа, который определяет тип сегмента: сегмент кода, сегмент данных или сегмент LDT.

для чего в архитектуре x86 используется регистр таблицы дескрипторов прерываний. Смотреть фото для чего в архитектуре x86 используется регистр таблицы дескрипторов прерываний. Смотреть картинку для чего в архитектуре x86 используется регистр таблицы дескрипторов прерываний. Картинка про для чего в архитектуре x86 используется регистр таблицы дескрипторов прерываний. Фото для чего в архитектуре x86 используется регистр таблицы дескрипторов прерываний

Р – бит присутствия (1 если сегмент загружен в память)

А – бит обращения (1 если было обращение к дескриптору)

DPL – уровень привелегий сегмента (номер кольца)

R – разрешение чтения (1 если чтение разрешено. Выполнение/запись разрешены всегда)

W – разрешение записи (1 если запись разрешена. Чтение/Выполнение запрещены всегда)

ED – признак расширения вниз

для чего в архитектуре x86 используется регистр таблицы дескрипторов прерываний. Смотреть фото для чего в архитектуре x86 используется регистр таблицы дескрипторов прерываний. Смотреть картинку для чего в архитектуре x86 используется регистр таблицы дескрипторов прерываний. Картинка про для чего в архитектуре x86 используется регистр таблицы дескрипторов прерываний. Фото для чего в архитектуре x86 используется регистр таблицы дескрипторов прерываний

При вызове подпрограммы в стек вызываемой процедуры записываются SS, SP – регистры вызывающей процедуры, затем передаваемые параметры, затем адрес возврата – CS и IP регистры.

1 Извлекается адрес возврата

2 Удаляются параметры из обоих стеков

3 Обратное переключение стеков

4 Сброс регистров DS и ES если они адресуют более привелегированный сегмент

Для предотвращения троянских вызовов создана шлюзовая система вызова процедур

1 Согласование прав доступа

2 Копирование аргументов межу стеками

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

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

Селектор TSS (task state segment) определяет дескриптор TSS в таблице GDT. Последний бит в байте доступа – бит B (busy) – бит занятости, определяет выполняется ли данная задача (1 если задача активная), и служит для предотвращения выполнения одной задачи одновременно 2мя процессорами при работе в многопроцессорном режиме. При вызове задачи бит занятости устанавливается равным 1, при выходе – 0. Вызов задачи с битом занятости равным 1 запрещен.

1.Межкольцевые вызовы задач

Используется функция jmp

Одной из команд обычно используемых для передачи управле ния является команда JMP. Эта команда выполняет безусловный переход, т.е. обеспечивает передачу управления при любых обстоятельствах.

2. Сегмент состояния задачи (TSS) является одной из нескольких структур данных, определяемых системной архитектурой 80386. Фактически, эти структуры данных являются «типами данных» для операционных систем. Сегмент TSS соответствует тому, что в некоторых операционных системах называется блоком управления задачей; в этом сегменте хранится состояние виртуального процесора задачи. Каждая задача 80386

представлена своим TSS, который делится на две части. Младшая

часть TSS определена системной архитектурой 80386 и содержит

значения регистров процессора. Старшая часть TSS может быть определена операционной системой для хранения данных, связанных с задачей, например, приоритета выполнения, дескрипторовфайлов и т.д. Дла создания своей задачи операционная система формирует TSS и инициализирует его величинами, необходимыми задаче для начала ее выполнения. В результате 80386 поддерживает младшую часть TSS, а за его старшую часть несет ответственность операционная система.

Задача управления ресурсами ЭВМ. Операционные системы и их классификация. Иерархия подсистем. Системные вызовы. Примеры реализации системных функций.

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

У линукса 319 системных вызовов, у фряхи – 330.

Операцио́нная систе́ма, сокр. ОС (англ. operating system) — комплекс управляющих и обрабатывающих программ, которые, с одной стороны, выступают как интерфейс между устройствами вычислительной системы и прикладными программами, а с другой — предназначены для управления устройствами, управления вычислительными процессами, эффективного распределения вычислительных ресурсов между вычислительными процессами и организации надёжных вычислений. Это определение применимо к большинству современных ОС общего назначения.

В логической структуре типичной вычислительной системы ОС занимает положение между устройствами с их микроархитектурой, машинным языком и, возможно, собственными (встроенными) микропрограммами — с одной стороны — и прикладными программами с другой.

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

В большинстве вычислительных систем ОС являются основной, наиболее важной (а иногда единственной) частью системного ПО. С 1990-х наиболее распространёнными операционными системами являются ОС семейства Microsoft Windows и системы класса UNIX (особенно Linux).

Функции операционных систем

Систе́мный вы́зов (англ. system call) в программировании и вычислительной технике — обращение прикладной программы к ядру операционной системы для выполнения какой-либо операции.

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

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

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *