 При выполнении задач, запрограммированных для решения 16-разрядным процессором 80286, структура сегмента TSS изменяется (рис. 2.53). Объем обязательной части сегмента в этом случае составляет 44 байта, и его граница должна иметь значение не менее чем 2Ch.
| | | | | | | | | | | | | | | | | | |
| Байт 7
| Байт 6
| Байт 5
| Байт 4
|
|
|
|
| 31
| 24
| 23
| 22
| 21
| 20
| 19
| 16
| 15
| 14
| 13
| 12
| 11
| 10
| 9
| 8
| 7
| 0
| Базовый адрес ВА31-24
| G
| 0
| 0
| AVL
| Граница L19-16
| Р
| DPL
| 0
| 1
| 0
| В
| 1
| Базовый адрес ВА23-16
| Базовый адрес А15 -0
|
| 31
| 16
| 15
| 0
|
|
| Байт 3, 2
| Байт 1, 0
|
Рис. 2.52. Формат дескриптора TSS
| | | | | | | | | |
| Байт 7, 6
| Байт 5
| Байт 4
|
|
|
| 31
| 16
| 15
| 14
| 13
| 12
| 11
| 8
| 7
| 0
| Резервировано
| Р
| DPL
| 0
| 0101
| Резервировано
| Селектор сегмента TSS
| Резервировано
| 31
| 16
| 15
| 0
|
|
| Байт 3, 2
| Байт 1, 0
|
Рис. 2.53. Структура сегмента TSS для процессора 80286
Переключение задач осуществляется с помощью команд межсегментного перехода JUMP, вызова CALL и возврата IRET. Если селектор (sel 16) команды JUMP или CALL выбирает из таблицы GDT дескриптор, который содержит в поле TYPE байта доступа код 0001 (обращение к TSS для процессора 80286) или 1001 (обращение к TSS для процессоров 386,486, Pentium, P6), то выполняется переключение задач. При этом селектор sel 16 заносится в регистр TR, а в связанный с ним программно-недоступный регистр загружается дескриптор TSS. В соответствии с содержимым обязательной части TSS производится загрузка регистров процессора, после чего он начинает выполнение поступившей задачи. Следует отметить, что межсегментные команды JUMP и CALL содержат байты eip32, определяющие новое содержимое регистра EIP. Однако, если селектор выбирает дескриптор TSS, то эти байты игнорируются, а регистр EIP загружается содержимым соответствующего поля TSS. При переключении задачи устанавливается значение TS = 1 в регистре управления CR0, хранящем слово состояния машины MSW. Сброс этого бита в состояние TS = 0 может производиться командой CLTS или путем загрузки нового содержимого в CR0 командами LMSWwwMOV.
Переключение задач производится, если бит занятости В в байте доступа дескриптора TSS вызываемой задачи имеет значение «0» (задача свободна). При В = 1 выполняется исключение типа #GP (нарушение защиты). Установка значения В = 1 (задача занята) в дескрипторе TSS производится командами JUMP или CALL, переключающими процессор на выполнение данной задачи. Обращение к задаче, находящейся в процессе решения, которая имеет значение бита В = 1, запрещено (вызовет исключение #GP). Если решение данной задачи было прервано переключением на другую задачу, то возврат к ее выполнению может быть реализован только командой IRET.
15
| 0
|
| Селектор возврата
| Ах4
| SP0
| Ах + 2
| SS0
| Ах + 4
| SP1
| Ах + 6
| SS1
| Ах + 8
| SP2
| Ах +А
| SS2
| Ах + С
| IP
| Ах + Е
| FLAGS
| Ах + 10
| АХ
| Ах + 12
| GX
| Ах + 14
| DX
| Ах + 16
| BX
| Ах + 18
| SP
| Ах + 1А
| BP
| Ах + 1С
| SI
| Ах + 1В
| Dl
| Ах + 20
| ES
| Ах + 22
| GS
| Ах + 24
| SS
| Ах + 26
| DS
| Ах + 28
| Селектор LDT
| Ах + 2А
| Дополнительная информация для ОС
|
|
Рис. 2.54. Формат дескриптора шлюза задачи
При переключении задач с помощью команд JUMP или CALL должны выполняться правила доступа, установленные для обращения к сегментам данных: DPL >= CPL, RPL, где значение DPL задается соответствующим полем в дескрипторе сегмента TSS (см. рис. 2.52). Таким образом, допускается переключение на решение задач, чья степень защиты меньше или равна уровню привилегий текущей программы и запроса.
|