Адресация и многозадачность: Сегмент состояния задачи (TSS)

Печать
Программирование - Архитектура и система команд микропроцессоров x86

 

Все процессоры, начиная с Intel386, поддерживают два формата сегмента состояния задачи (TSS) — 16-битный и 32-битный. 16-битный TSS (рис. 2.25.) содержит гораздо меньше данных и поддерживается для сохранения совместимости с процессором Intel286. 32-битный TSS (рис. 2.24.) является основным для 32-битных процессоров и включает всю информацию, которая может быть уникальной для каждой исполняемой задачи.

Задачи, исполняемые в защищенном 32-битном режиме должны иметь 32-битный TSS (это относится и к задачам V86), и только 16-битные приложения защищенного режима могут использовать 16-битный TSS.

 

32-битный TSS

Рис. 2.24. 32-битный TSS

 

16-битный TSS

Рис. 2.25. 16-битный TSS

 

LINK (Поле обратной связи)

Содержит селектор 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 (Бит ловушки отладки)

Если 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.