3.6 Ввод-вывод
Если требуется обеспечить взаимодействие процессора с периферийным устройством, то регистры этого устройства могут быть отображены на ячейки обычной оперативной памяти процессора (memory-mapped I/O) либо на ячейки специального адресного пространства, называемого пространством портов ввода-вывода.
Ввод-вывод с отображением в память обслуживается обычными командами доступа к памяти (MOV, MOVS и т.п.) При этом используются обычные механизмы защиты на уровне сегментов и на уровне страниц. Для обслуживания устройств через пространство портов ввода-вывода используются специальные команды и особый механизм защиты. Особенностью обмена через пространство ввода-вывода является то, что процессор обеспечивает синхронизацию выполнения инструкций ввода-вывода, тогда как при обмене через отображаемую память надо дополнительно позаботиться о предотвращении кэширования и изменения порядка выполнения инструкций (P6+).
Пространство портов ввода-вывода состоит из 65536 индивидуально адресуемых 8-битных ячеек (портов), пронумерованных от 0 до FFFF. Порты с адресами 0F8h...0FFh зарезервированы фирмой Intel. Два соседних 8-битных порта могут использоваться как 16-битный порт. Четыре соседних 8-битных порта могут использоваться как 32-битный порт. Рекомендуется выравнивать 16-битные порты по четным адресам, а 32-битные - по адресам, кратным четырем.
В защищенном режиме выполнение инструкций обращения к портам ввода-вывода (IN, INS, OUT, OUTS) регулируется следующими механизмами защиты:
- уровень привилегий ввода-вывода (I/O Privilege Level - IOPL);
- битовая карта разрешения ввода-вывода (I/O Permission Bit Map);
Процессор разрешает выполнение инструкций ввода-вывода, если текущий процесс обладает достаточными привилегиями: CPL<=IOPL. В противном случае включается второй механизм контроля. Обычно операционная система устанавливает уровень привилегий ввода-вывода таким, чтобы операции ввода-вывода могли выполняться только специальным программным обеспечением (драйверами или самой ОС, IOPL=1 или IOPL=0), тогда как попытки прикладной программы (CPL=3) выполнить эти инструкции будут приводить к нарушению общей защиты.
Битовая карта разрешения ввода-вывода позволяет более гибко регулировать доступ к портам ввода-вывода непривилегированных программ и задач в состоянии V86. Битовая карта разрешения ввода-вывода располагается в сегменте состояния задачи (TSS) по адресу, задаваемому полем "Адрес карты вв-выв." Размер битовой карты может быть любым и ограничивается пределом сегмента состояния задачи. Каждый бит в этой карте соответствует определенному порту ввода-вывода. Когда непривилегированный код пытается обратиться к определенному порту ввода-вывода, процессор тестирует соответствующий бит. Если бит сброшен, то доступ к порту предоставляется, в противном случае генерируется нарушение общей защиты. Для 16- и 32-битных портов тестируются все соответствующие им биты, если хоть один из них 1, то возникает нарушение общей защиты.
![TSS](TSS.gif)
Битовая карта не обязательно должна представлять весь диапазон портов ввода-вывода и может быть короче. Если процессор пытается обратиться к биту карты и выходит за ее пределы, считается, что бит установлен, и операция ввода-вывода вызывает нарушение общей защиты. Если адрес битовой карты совпадает с пределом TSS или больше него, то считается, что битовая карта отсутствует, тогда работает только механизм защиты по полю IOPL.
Т.к. условие выравненности адресов многобайтных портов не является обязательным, процессор при каждом обращении к битовой карте читает два ее байта. Чтобы предотвратить исключение при обращении к портам с адресами вблизи верхней границы битовой карты, в битовую карту следует включать дополнительный байт со всеми выставленными битами (FF).