Адресация и многозадачность: Сегмент состояния задачи (TSS) |
Программирование - Архитектура и система команд микропроцессоров x86 | |||
Все процессоры, начиная с Intel386, поддерживают два формата сегмента состояния задачи (TSS) — 16-битный и 32-битный. 16-битный TSS (рис. 2.25.) содержит гораздо меньше данных и поддерживается для сохранения совместимости с процессором Intel286. 32-битный TSS (рис. 2.24.) является основным для 32-битных процессоров и включает всю информацию, которая может быть уникальной для каждой исполняемой задачи. Задачи, исполняемые в защищенном 32-битном режиме должны иметь 32-битный TSS (это относится и к задачам V86), и только 16-битные приложения защищенного режима могут использовать 16-битный TSS.
Рис. 2.24. 32-битный TSS
Рис. 2.25. 16-битный TSS
Содержит селектор TSS предыдущей задачи, если текущая задача является вложенной (возможно, когда переключение в задачу осуществлялось командой CALL, через прерывание или исключение). Процессоры, начиная с Pentium, записывают селектор TSS старой задачи в поле LINK 32-битного TSS новой задачи как 32-битное значение со старшими двумя байтами равными нулю. Intel386 и Intel486 записывают только 16 бит, не изменяя старшие байты.
SSn, (E)SPn (Указатели стека на уровне привилегий n) Копии указателя стека SS:ESP на уровне привилегий n. Каждая задача может поддерживать до четырех стеков. Эти стеки предназначены для использования на различных уровнях привилегий. Каждый из используемых стеков должен описываться корректным дескриптором и располагать объемом, достаточным для сохранения всех данных программы и передаваемых ей параметров, причем с учетом возможности вызова вложенных задач и прерываний. Текущий стек приложения при выполнении задачи определяется значениями регистров SS:ESP, значения которых всякий раз сохраняются и восстанавливаются в случае прерываний или вызова вложенных задач. Когда в процессе выполнения задачи процессор передает управление в сегмент с идентичным уровнем привилегий, переключения стека не происходит и продолжает использоваться текущее значение SS:ESP. Однако для случаев, когда осуществляется обращение через шлюз вызова к несогласованному кодовому сегменту с более высоким уровнем привилегий (DPL сегмента меньше CPL) предусмотрено переключение стека. Это делается для того, чтобы обеспечить процедуру высокого уровня привилегий достаточным объемом стекового пространства и для предотвращения взаимодействия программы с низким уровнем привилегий с процедурой высокого уровня привилегий через стек. Новое значение стека SS:ESP выбирается из TSS задачи в соответствии с уровнем привилегий кодового сегмента, которому передается управление. Поля SS0, ESP0 используются для 0 уровня привилегий, SS1, ESP1 — для 1, SS2, ESP2 — для 2. Поле для уровня привилегий 3 не предусмотрено, поскольку в процессор не заложена возможность передачи управления из процедур уровня привилегий 0, 1, 2 в процедуры уровня привилегий 3 без переключения задач. После возврата из процедуры текущее значение SS:ESP теряется и заменяется на предварительно сохраненное значение указателя стека программы, вызвавшей эту процедуру. Поля SSn, ESPn в TSS процессор автоматически не изменяет. Таким образом, каждый раз при вызове процедуры определенного уровня привилегий будет использоваться одно и то же начальное значение для указателя стека соответствующего уровня. После загрузки в SS:ESP нового указателя стека процессор сохраняет в новом стеке указатель старого стека (стека вызвавшей программы), а также параметры процедуры, которые копируются из старого стека в количестве, указанном в специальном поле COUNT дескриптора шлюза вызова. В самом конце сохраняются текущие значения CS:EIP и управление передается новой (вызываемой) процедуре с более высоким уровнем привилегий.
Если T = 1, то при переключении задач генерируется особая ситуация отладки (#DB). Это происходит после того, как процессор осуществит переключение задач и выполнится первая команда новой задачи. Обработчик особой ситуации может определить причину генерации ловушки по значению флага DR6.BT. Если сам обработчик является задачей, то установка в этой задаче бита TSS.T приведет к зацикливанию процессора.
Служит для указания положения битовой карты ввода/вывода и карты перенаправления прерываний (Pentium …). Если эти карты присутствуют, то они расположены в верхней части TSS. Базовый адрес указывает на начало карты ввода/вывода и на конец 32-байтовой карты прерываний, используемой в режиме V86 при включенном расширении виртуального режима (CR4.VME = 1).
Карта перенаправления прерыванийКарта перенаправления прерываний (Interrupt Redirection Bitmap – IRB) предназначена для использования в режиме V86 при инициализированном расширении виртуального режима (CR4.VME = 1). Карта перенаправления прерываний занимает 32 байта и расположена сразу перед картой разрешения ввода/вывода. Каждый бит карты соответстует своему прерыванию. Бит 0 первого байта карты (который располагается по адресу: База карты в/в – 32) соответствует нулевому вектору прерываний, бит 1 этого же байта — первому вектору и т.д. для всех 256-ти векторов. Карта перенаправления прерываний влияет на обработку прерываний в режиме V86, если эти прерывания генерируются программно командами INT n. В этом случае прерывание перенаправляется для обработки либо через IDT обработчику прерываний и исключений защищенного режима (когда соответствующий бит карты установлен), либо обратно в задачу режима V86 в таблицу прерываний, расположенную по адресу 0 в адресном пространстве задачи (когда соответствующий бит карты сброшен). Карта перенаправления прерываний не влияет на обработку аппаратных прерываний и исключений, точки останова отладки, генерируемой командой INT 3 (код ССh), а также на обработку всех прерываний и исключений при CR4.VME = 0. В этих случаях обработка производится через IDT и обработчик прерываний и исключений защищенного режима.
Карта разрешения ввода/выводаКарта разрешения ввода/вывода (Input/Output-permission Bitmap) определяет доступность портов ввода/вывода. Расположена в верхней части TSS и определяет его длину. Если CPL ≤ IOPL в защищенном режиме, то проверки доступности ввода/вывода не производится. Если CPL > IOPL, или если процессор функционирует в режиме V86, то производится проверка доступности ввода/вывода при любых операциях с ним. Каждый бит в карте соответствует своему адресу порта. Например, управляющий бит для порта 29h находится в позиции 1 шестого байта карты ввода/вывода. Процессор проверяет все биты, соответствующие используемому порту, т.е. если пересылается слово, то тестируется два бита, двойное слово — четыре бита, байт — один бит карты в/в. Если какой-либо из тестируемых битов установлен, то генерируется особая ситуация общей защиты (#GP). В случае, если используемый порт не отражен в карте ввода/вывода (т.е. имеет больший адрес), то также генерируется особая ситуация общей защиты (#GP). Если базовый адрес карты ввода/вывода больше или равен пределу сегмента TSS, то любые обращения к портам ввода/вывода вызывают генерацию особой ситуации общей защиты (#GP). За последним байтом битовой карты ввода/вывода в TSS следует заключительный байт, содержащий 1 во всех разрядах. Адрес этого байта должен соответствовать границе сегмента, определенной дескриптором TSS.
|
Все права защищены © Алексей Ровдо, 1994-2023. Перепечатка возможна только по согласованию с владельцем авторских прав. admin@club155.ru