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

Сегмент TSS 32-битного TSS должен содержать минимум 104 байта. Если размер TSS меньше 104 байт, процессор фиксирует особый случай неверного сегмента TSS. Однако, как и для других сегментов памяти,  верхний размер сегмента TSS ограничен только адресным пространством сегмента (4Гбайт для 32-разрядного процессора). Дополнительные области в сегменте TSS полностью определяются пользователем и используются по его усмотрению. Например, в этом сегменте удобно хранить содержимое всех регистров арифметического сопроцессора. Конечно, для записи и считывания из сегмента TSS приходится пользоваться псевдоименами дескрипторов. Когда процессор привлекает сегмент TSS для переключения задачи, он игнорирует все данные сверх аппаратно поддерживаемых 104 байт.

Двоичная карта разрешения ввода-вывода (I/O permission map) служит дополнительным средством механизма защиты по привилегиям. Такая карта при необходимости создается для отдельной задачи и участвует в контроле привилегий только для команд ввода-вывода (это IOPL-чувствительные команды IN, INS, OUT, OUTS, CLI, STI). Без двоичной карты разрешения ввода-вывода программа или задача может выполнять команды ввода-вывода, если только ее CPL £ IOPL. Значение IOPL находится в регистре ЕFLAGS и может изменяться при переключении задач.

Когда для задачи определена двоичная карта разрешения ввода-вывода, ей предоставляются дополнительные возможности по защите при выполнении команд ввода-вывода. Если обычная защита по привилегиям запрещает выполнение команд ввода-вывода, процессор обращается к двоичной карта разрешения ввода-вывода для дополнительной проверки возможности ввода-вывода по конкретным адресам. Если соответствующие этим адресам биты карты БКВВ содержат “0”, операции ввода-вывода разрешаются, в противном случае формируется особый случай нарушения общей защиты.

В двоичной карте разрешения ввода-вывода каждый бит соответствует одному адресу порта ввода-вывода (каждый бит БКВВ соответствует однобайтовому порту ввода-вывода). Так как процессор обеспечивает обслуживание до 65356 портов, то полная карта БКВВ, определяющая возможность их обслуживания, представляет строку длиной 64 Кбит, занимающую 8 Кбайт пространства памяти вблизи сегмента TSS. Конечно, такая карта требуется не всегда и ее всегда можно “отсечь” по байтной границе. Все отсутствующие в усеченной карте биты считаются равными “1”.

Двоичная карта разрешения ввода-вывода может размещаться в памяти произвольно, но обязательно вблизи сегмента TSS той задачи, которая пользуется этой картой. Смещение в сегменте TSS определяет начало карты относительно начала самого сегмента TSS. Карта заканчивается либо по достижению 8 Кбайт, либо по пределу сегмента TSS (что меньше). За последним байтом БКВВ должен следовать заключительный байт, содержащий “1” во всех разрядах. Адрес этого байта должен соответствовать границе сегмента, указанной в дескрипторе TSS.

Двоичная карта разрешения ввода-вывода обеспечивает задачам свободный доступ к незащищенным портам ввода-вывода без требования понижения значения уровня привилегий в поле IOPL.

Защиту можно обеспечить как для всех, так и для части портов. Если конец БКВВ выходит за границу сегмента TSS, определенную в дескрипторе TSS, то доступность соответствующих портов с высокими номерами не зависит от битовой карты. Если значение размера сегмента, заданное дескриптором TSS, меньше указанного в TSS относительного адреса, то эта карта не влияет на доступность портов и ее можно полностью исключить.

Пример конкретной двоичной карты разрешения ввода-вывода

                       31                                            0       специальный байт границы           

                                                                F   F         карты разрешения ввода-вывода

 F  F   F   F  F        F         F   F 

 F  F   F   F  F        F         F   F 

 F  F   F   F  F   1100000    F   F     200h

 


Cегмент TSS