Процессор i486 может генерировать исключение при ссылках к конкретным адресам ввода/вывода. Эти адреса задаются битовым массивам разрешения ввода/вывода, находящимся в TSS (см. Рисунок 8-2). Размер этого массива и его позиция в TSS переменны. Процессор находит битовый массив ввода/вывода при помощи базового адреса массива ввода/вывода в TSS. Базовый адрес представляет собой 16-разрядное смещение в TSS. Это смещение задает начало битового массива. Граница TSS является и границей размера битового массива разрешения ввода/вывода.
Сегмент состояния задачи (TSS) ----------------------------------- | 11111111 | | |-------------- | | | | Битовый массив | | разрешения ввода/вывода | -->| | | |---------------------------------| | | |---------------------------------| ---| База массива | | | ввода/вывода | | |---------------------------------| |---------------------------------| | | | |---------------------------------| | | | ----------------------------------- Примечание: базовый адрес битового массива разрешения ввода/вывода не должен превышать DFFF (шестнадцатиричное). За последним байтом битового массива должен следовать байт, в котором всебиты установлены. Рисунок 8-2. Битовый массив разрешения ввода/вывода
Поскольку каждая задача имеет свой собственный TSS, то каждая задача имеет и свой собственный битовый массив разрешения ввода/ вывода. Доступ к конкретным портам ввода/вывода может быть определен для конкретных задач.
Если CPL <= IOPL в защищенном режиме, то процессор позволяет выполнение операций ввода/вывода. Если CPL > OPL, либо если процессор работает в виртуальном режиме 8086, то процессор проверяет битовый массив разрешения ввода/вывода. Каждый бит в этом массиве соответствует одному адресу байта ввода/вывода; например, управляющий бит для адреса 41 (десятичного) в адресном пространстве ввода/вывода будет находиться в позиции 1 шестого байта битового массива. Процессор проверяет все биты, соответствующие порту ввода/вывода, к которому выполняется доступ; например, операция с размером операнда в двойное слово проверяет четыре бита, соответствующих четырем смежным адресам байтов адресуемого двойного слова. Если хоть один из проверяемых битов установлен, то генерируется исключение общей защиты. Если же все проверяемые биты очищены, то операция ввода/вывода продолжается.
Поскольку допускается существование портов ввода/вывода, не выравненных по границе слова или двойного слова, процессору может понадобиться при проверке разрешения ввода/вывода доступ к двум байтам битового массива. Для максимального быстродействия Процессор устроен таким образом, что при каждом доступе к порту ввода/вывода прочитывается два байта массива. Для предотвращения генерации исключений при доступе к самым старшим адресам портов после битового массива находится лишний байт. Все биты этого байта должны быть установлены, и он должен лежать в пределах границы сегмента. Битовый массив ввода/вывода не обязан представлять все адреса ввода/вывода. Адреса ввода/вывода, не отображаемые в массиве, рассматриваются, как если бы соответствующие им биты массива были установлены. Например, если граница сегмента TSS находится в 10 байтах после базового адреса битового массива, то этот массив имеет 11 байтов, отображающих 80 портов ввода/вывода. Более старшие адреса при обращении к адресному пространству ввода /вывода приведут к генерации исключения. Если базовый адрес битового массива ввода/вывода больше или равен границе сегмента TSS, то битового массива разрешения ввода /вывода не существует, и все команды ввода/вывода будут генерировать исключение. Базовый адрес должен быть меньше или равен 0DFFFH.