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

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

Необновляемая часть сегмента TSS содержит селектор дескриптора таблицы LDT (содержимое регистра LDTR), а также полные логические адреса трех стеков - по одному для каждого из трех колец защиты 0 - 2. Каждый адрес определяет нижнюю границу стека, т.е. его наибольший адрес. Указанные стеки используются в межкольцевых вызовах. Они устанавливается при создании задачи. Использование собственной таблицы LDT для каждой задачи обеспечивает дополнительную защиту, поскольку задачи в этом случае изолируются и их влияние друг от друга исключено.                                  

Некоторые регистры процессора 80х86 при переключении задач не запоминаются в сегменте TSS. В число этих регистров входят регистры GDTR, TR и теневые регистры. Они либо остаются неизменными (GDTR), либо определяются вновь.

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

Сегмент TSS может располагаться в любом месте пространстве линейных адресов процессора.

Процессор Pentium поддерживает как 16-битные сегменты TSS 16-разрядных процессоров х86, так 32- битные сегменты TSS 32-разрядных процессоров. Форматы 16- и 32-битных сегментов TSS представлены на рис.

Сегмент TSS процессора 80286 должен содержать минимум 44 байта. Если размер TSS меньше 44 байт, процессор фиксирует особый случай неверного сегмента TSS. Верхний предел размера TSS, как и  других сегментов памяти процессора 80286, ограничен только адресным пространством 64 Кбайт. Дополнительные области в сегменте TSS полностью определяются пользователем и используются по его усмотрению (могут и не определяться, что чаще всего и делается). Например, в этой области сегмента TSS удобно хранит содержимое регистров арифметического сопроцессора для данной задачи. При переключении задачи процессор запоминает содержимое своих регистров в сегменте TSS старой задачи и перезагружает регистры значениями из TSS вызываемой задачи. При этом все данные, сверх аппаратно поддерживаемых 44 байт, размещенные в дополнительной области TSS, процессор игнорирует. Для использования этих данных необходимо программно вызывать алиасный сегмент данных.

                         15                                                 0 обратная связь               0

                                   начало стека               SP0      2

кольца 0                      SS0      4

                                   начало стека               SP1      6

кольца 1                      SS1      8

                                   начало стека               SP2     10

кольца 2                      SS2     12

                                                   IP                            14

                                               FLAGS                         16

                                                  AX                            18

                                                  CX                            20  

                                                  DX                            22

                                                  BX                            24

                                                  SP                            26

                                                  BP                            28

                                                  SI                             30

                                                  DI                             32 

                                                  ES                            34

                                                  CS                            36