ЭЛЕКТРОННАЯ БИБЛИОТЕКА КОАПП
Сборники Художественной, Технической, Справочной, Английской, Нормативной, Исторической, и др. литературы.



 

Часть 9

Глава 8  Ввод/вывод
-----------------------------------------------------------------
В данной главе рассматривается архитектура ввода/вывода
процессора i486. Ввод/вывод выполняется через порты
ввода/вывода, которые представляют собой регистры, подключенные
к периферийным устройствам. Порт ввода/вывода может быть портом
ввода, портом вывода, либо двунаправленным портом. Некоторые
порты используются для переноса данных, например, регистры
приема и передачи последовательного интерфейса. Другие порты
ввода/вывода используются для управления периферийными
устройствами, например, регистры управления контроллером
дисковода.
Процессор i486 всегда синхронизирует выполнение команд ввода
/вывода с работой внешней шины. Все предыдущие команды к моменту
начала операций ввода/вывода завершаются. В частности, прежде
чем будет выполнен ввод/вывод на чтение или запись, будут
завершены все отложенные операции записи в буферы записи ЦПУ
i486.
Архитектура ввода/вывода представляет собой с точки зрения
программиста модель того, как происходит доступ к портам
ввода/вывода. В рассмотрение этой модели входят:
     - Методы адресации портов ввода/вывода.
     - Команды, выполняющие операции ввода/вывода.
     - Механизм защиты ввода/вывода.
8.1  Адресация ввода/вывода
-----------------------------------------------------------------
Процессор i486 позволяет адресовать порты ввода/вывода одним из
следующих способов:
- Через отдельное адресное пространство ввода/вывода, доступ к
  которому выполняется посредством команд ввода/вывода.
- Через ввод/вывод, управляемый памятью, где порты ввода/вывода
  представлены в адресном пространстве физической памяти.
Использование отдельного адресного пространства ввода/вывода
поддерживается специальными командами и механизмом аппаратной
поддержки. При использовании пространства ввода/вывода,
отображенного на памятью, для доступа к портам ввода/вывода
используется обычный набор команд общего назначения, а защита
осуществляется при помощи механизма сегментации или подкачки
страниц. Некоторые разработчики систем могут предпочесть
использовать средства ввода /вывода, встроенные в процессор,
тогда как другим больше подходит простота единого физического
адресного пространства.
Если для защиты адресного пространства ввода/вывода используется
сегментация или подкачка страниц, то поля AVL в дескрипторах
сегментов или элементах страничной таблицы позволяют пометить
страницы, содержащие ввод/вывод, как непереместимые и не
подлежащие подкачке. Поля AVL предназначены для такого рода
использования, когда системному программисту требуется расширить
механизмы трансляции адреса и защиты.
Разработчики аппаратного обеспечения используют эти способы
отображения портов ввода/вывода в адресном пространстве при
разработке схем декодирования адресов в системе. Порты
ввода/вывода могут быть отображены в памяти таким образом, чтобы
находиться либо в адресном пространстве ввода/вывода, либо в
адресном пространстве физической памяти (или и там, и там).
Системным программистам может понадобиться обсудить с
разработчиками аппаратного обеспечения предпочтительный для них
тип адресации ввода/вывода.
8.1.1  Адресное пространство ввода/вывода
-----------------------------------------------------------------
Процессор i486 обеспечивает отдельное адресное пространство
ввода/вывода, отличное от адресного пространства физической
памяти, в которое могут быть помещены порты ввода/вывода.
Адресное пространство ввода/вывода состоит из 2**16 (64К)
индивидуально адресуемых 8-битовых портов; любые два
последовательно расположенные 8-битовые порта могут
рассматриваться как один 16-битовый порт, а любые четыре - как
один 32-битовый порт. Если порт пересекает границу между двумя
двойными словами физической памяти, то используются лишние циклы
шины.
Штырек M/IO# процессора i486 указывает, когда происходит цикл
шины обращения к адресному пространству ввода/вывода. При
использовании отдельного адресного пространства ввода/вывода
ответственность за применение данного сигнала для выбора портов
ввода/вывода вместо памяти лежит на разработчике аппаратного
обеспечения. Действительно, использование отдельного адресного
пространства ввода/вывода упрощает аппаратную конструкцию
системы, поскольку выбор этих портов может быть выполнен одним
сигналом: в отличие от других процессоров, здесь не требуется
декодировать сигналы нескольких проводов шины старшего адреса
для установки отдельного адресного пространства ввода/вывода.
Программа может задать адрес порта двумя способами. С
использованием непосредственно задаваемой байтовой константы в
команде:
     - 256 8-битовых портов с нумерацией от 0 до 255.
     - 128 16-битовых портов с нумерацией 0, 2, 4, ... ,252, 254.
     - 64 32-битовых порта с нумерацией 0,4,8, ... , 248,252
Используя значение регистра DX, программа может задать:
     - 8-битовые порты с нумерацией от 0 до 65535.
     - 16-битовые порты с нумерацией 0,2,4, ... ,65532,65534.
     - 32-битовые порты с нумерацией 0,4,8, ... ,65528,65532.
Процессор i486 может пересылать по 8, 16 или 32 бита в
устройство, отображаемое в пространстве ввода/вывода. Подобно
словам в памяти, 16-битовые порты должны быть выравнены по
четным адресам, таким образом, чтобы все 16 битов могли быть
пересланы за один цикл шины. Подобно двойным словам в памяти, 32
-битовые порты должны быть выравнены по границе адресов, кратным
четырем. Процессор поддерживает пересылку и к невыравненным
портам, но тогда происходит уменьшение быстродействия за счет
лишнего цикла шины.
Команды IN и OUT пересылают данные между регистром и портом в
адресном пространстве ввода/вывода. Команды INS и OUTS
пересылают строки данных между адресным пространством памяти и
портами в адресном пространстве ввода/вывода.
Адеса портов ввода/вывода от 0F8H до 0FFH резервируются для
внутреннего использования Intel. Не назначайте порты
ввода/вывода на эти адреса.
Точная последовательность циклов шины при доступе к портам,
требующим более одного цикла, не определена. Например, команда
OUT, загружающая невыравненный порт размером в двойное слово в
адрес памяти 2H, выполняет доступ к слову по адресу 4H раньше,
чем доступ к слову по адресу 2H. Точная последовательность не
определена, и не гарантируется ее сохранение следующими
продуктами Intel.
Если программному обеспечению требуется установить конкретную
последовательность циклов шины, то она должна быть задана в
явном виде. Например, для загрузки сначала порта длиной в слово
по адресу 4H, а затем порта длиной в слово по адресу 2H, нужно
использовать две команды формата слова вместо одной команды
формата двойного слова.
Отметим, что хотя процессор i486 автоматически маскирует ошибки
контроля четности для конкретных типов циклов шины, например,
для циклов квитирования прерывания, он не маскирует ошибки
четности для циклов шины обращения к адресному пространству
ввода/вывода. Программистам нужно знать о таком поведении
процессора, как о возможном источнике ложных ошибок контроля
четности.
8.1.2  Ввод/вывод, управляемый памятью
-----------------------------------------------------------------
Устройства ввода/вывода могут быть отображены в адресном
пространстве оперативной памяти. Это называется вводом/выводом,
управляемым памятью. Если устройства реагируют на обращения, как
обычные компоненты памяти, они могут быть использованы для ввода
/вывода, управляемого памятью.
Ввод/вывод, управляемый памятью, обеспечивает дополнительную
гибкость программирования. Для доступа к порту ввода/вывода,
расположенному в адресном пространстве памяти, могут
использоваться любые работающие с памятью команды. Например,
команда MOV позволяет пересылать данные между портом и любым
регистром. Команды AND, OR и TEST могут использоваться для
манипулирования отдельными битами в регистрах управления и
состояния периферийных устройств (см. Рисунок 8-1). Ввод/вывод,
управляемый памятью, может использовать для адресации портов
ввода/вывода полный набор команд и режимов адресации памяти.
     Физическая память
---------------------------N
|                         |
|       ПЗУ(ROM)          |
|                         |
|-------------------------|
|  Порт ввода/вывода      |
|-------------------------|
|  Порт ввода/вывода      |
|-------------------------|
|  Порт ввода/вывода      |
|-------------------------|
|                         |
|                         |
| Оперативная память (RAM)|
|                         |
|                         |
---------------------------0
          Рисунок 8-1. Ввод/вывод, управляемый памятью
Для оптимизации быстродействия ЦПУ i486 в конкретных точно
определенных обстоятельствах позволяет менять местами
последовательность и выполнять чтение раньше буферизованной
записи. (См. Справочное Руководство по аппаратному обеспечению
процессора i486, где дается более подробное описание работы
буфера записи). Используя ввод/вывод, управляемый памятью,
процессор i486 создает возможность выполнения чтения
ввода/вывода раньше предшествующей команды записи в память. Для
исключения этой возможности используйте для чтения команду ввода
/вывода.
Использование команды ввода/вывода для записи в порт может иметь
свои преимущества в том, что при этом гарантируется, что запись
будет завершена до начала выполнения следующей команды. Если
команды ввода / вывода записи используются для управления
системным программным обеспечением, то такая последовательность
событий желательна, поскольку она гарантирует, что следующая
команда будет выполнена в новом состоянии.
При разрешенном кешировании для предотвращения попытки
кеширования данных ввода/вывода следует использовать либо
внешнее программное обеспечение, либо механизм подкачки страниц
(бит PCD в элементе страничной таблицы).
Ввод/вывод, управляемый памятью, как и любые другие ссылки к
памяти, подлежит контролю и защите доступа. Защита памяти
рассматривается в Главе 6.
8.2  Команды ввода/вывода
-----------------------------------------------------------------
Команды ввода/вывода процессора i486 обеспечивают доступ к
портам ввода/вывода процессора для пересылки данных. Эти команды
в качестве операнда имеют адрес порта в адресном пространстве
ввода/вывода. Существует два вида команд ввода/вывода:
1. Команды, выполняющие пересылку отдельного элемента (байта,
   слова или двойного слова) в регистр или из регистра.
2. Команды, пересылающие строки элементов (строки байтов, слов
   или двойных слов), расположенных в памяти. Эти команды
   называются "строковыми командами ввода/вывода", или "блочные
   команды ввода/вывода".
Эти команды во время цикла шины устанавливают низкое состояние
(логический 0) сигнала M/IO#, указывая внешнему аппаратному
обеспечению на то, что происходит доступ к адресному
пространству ввода/вывода. При использовании ввода/вывода,
управляемого памятью, использовать команды ввода/вывода не имеет
смысла.
8.2.1  Регистровые команды ввода/вывода
-----------------------------------------------------------------
Команды ввода/вывода IN и OUT пересылают данные между портами
ввода/вывода и регистрами EAX (32-разрядный ввод/вывод), AX (16-
разрядный ввод/вывод) и AL (8-разрядный ввод/вывод). Команды IN
и OUT адресуют порты ввода/вывода либо напрямую, по адресу
одного из 256 портов, задаваемому непосредственно в команде,
либо косвенно, при помощи адреса в регистре DX, позволяющего
выбрать один из 64К адресов порта. Эти команды синхронизируют
выполнение программы с работой внешнего аппаратного обеспечения.
Буферы записи процессора i486 очищаются, а выполнение программы
откладывается до тех пор, пока не будет получен сигнал
готовности (ready) последнего цикла шины.
IN (Ввод из порта) пересылает байт, слово или двойное слово из
порта ввода в регистры AL, AX или EAX. Байтовая команда IN
пересылает из выбранного порта 8 битов в регистр AL. Команда IN,
работающая со словами, переносит из порта 16 битов в регистр AX.
Команда IN, работающая с двойными словами, переносит из порта 32
бита в регистр EAX.
OUT (Вывод из порта) пересылает байт, слово или двойное слово в
порт вывода из регистров AL, AX или EAX. Байтовая команда OUT
пересылает в выбранный порт 8 битов из регистра AL. Команда OUT,
работающая со словами, переносит в порт 16 битов из регистра AX.
Команда OUT, работающая с двойными словами, переносит в порт 32
бита из регистра EAX.
8.2.2  Блочные команды ввода/вывода
-----------------------------------------------------------------
Команды INS и OUTS пересылают блоки данных между портами
ввода/вывода и памятью. Блочные команды ввода/вывода используют
для адресации порта в адресном пространстве ввода/вывода регистр
DX. Эти команды задают через регистр DX:
     - 8-битовые порты с нумерацией от 0 до 65535.
     - 16-битовые порты с нумерацией 0, 2, 4, ... , 65532, 65534.
     - 32-битовые порты с нумерацией 0, 4, 8, ... , 65528, 65532.
Блочные команды ввода/вывода используют для адресации памяти
либо регистр SI, либо DI. При каждой пересылке регистр SI или DI
инкрементируется или декрементируется, что определяется флагом
направления приращений DF.
Будучи использованы с префиксами повторения, команды INS и OUTS
выполняют операции блочного ввода или вывода. Префикс повторения
REP модифицирует команды INS и OUTS таким образом, что они
выполняют пересылку между портом ввода/вывода и оперативной
памятью блоков данных. Эти блочные команды ввода/вывода являются
строковыми командами (более подробное описание строковых команд
см. в Главе 3). Они упрощают программирование и увеличивают
скорость пересылки данных, исключая необходимость в
использовании отдельных команд LOOP или промежуточных регистров
для хранения данных.
Строковые команды ввода/вывода работают со строками байтов, слов
или двойных слов. После каждой пересылки адрес памяти,
находящийся в регистрах ESI или EDI, инкрементируется или
декрементируется на 1 для байтовых операндов, на 2 для
операндов-слов или на 4 для операндов-двойных слов. Флаг DF
управляет тем, выполняется ли инкремент (флаг DF очищен) или
декремент (Флаг DF установлен) регистра.
INS (Ввод строки из порта) пересылает элемент строки байтов,
слов или двойных слов из порта ввода в оперативную память.
Команда INSB пересылает байт из выбранного порта в область
памяти, адресуемую регистрами ES и EDI. Команда INSW пересылает
слово. Команда INSD пересылает двойное слово. Префикс
переопределения сегмента для задания альтернативного сегмента
назначения использоваться не может. В комбинации с префиксом
повторения REP команда INS реализует циклическое считывание
порта и помещение считанных данных в последовательно
расположенные адреса памяти.
OUTS (Вывод строки в порт) пересылает элемент строки байтов,
слов или двойных слов в порта вывода из оперативной памяти.
Команда OUTSB пересылает байт в выбранный порта из области памяти
адресуемой регистрами ES и EDI. Команда OUTSW пересылает слово.
Команда OUTSD пересылает двойное слово. Префикс переопределения
сегмента для задания альтернативного сегмента источника
использоваться не может. В комбинации с префиксом повторения REP
команда OUTS реализует циклическое считывание данных в
последовательно расположенных адресах оперативной памяти и
запись их в порт вывода.
8.3  Защита и ввод/вывод
-----------------------------------------------------------------
Архитектура ввода/вывода процессора использует два механизма
защиты:
1. Поле IOPL регистра EFLAGS управляет доступом к командам ввода
   /вывода.
2. Битовый массив разрешения ввода/вывода в сегменте TSS
   управляет доступом к конкретным портам адресного пространства
   ввода/вывода.
Эти механизмы защиты доступны только при использовании
отдельного адресного пространства ввода/вывода. При
использовании ввода/вывода, управляемого памятью, защита
обеспечивается механизмами сегментации или подкачки страниц.
8.3.1  Уровень привилегированности ввода/вывода
-----------------------------------------------------------------
В системах, использующих защиту ввода/вывода, доступ к командам
ввода/вывода управляется полем IOPL регистра EFLAGS. Это
позволяет операционной системе регулировать уровень
привилегированности, необходимый для выполнения ввода/вывода. В
случае типичной модели колец защиты доступ к командам
ввода/вывода обеспечивается уровнями привилегированности 0 и 1.
Это позводяет операционной системе и драйверам устройств
выполнять ввод/вывод, но не дает прикладным программам и менее
привилегированным драйверам устройств возможности доступа к
адресному пространству ввода/вывода. Прикладные программы могут
обращаться к вводу/выводу только через операционную систему.
Следующие команды могут выполняться только при условии CPL <=
IOPL:
     IN      - Ввод
     INS     - Ввод строки
     OUT     - Вывод
     OUTS    - Вывод строки
     CLI     - Очистить флаг разрешения прерываний
     STI     - Установить флаг разрешения прерываний
Эти команды называются "чувствительными" командами, поскольку
они чувствительны к состоянию поля IOPL. В виртуальном режиме
8086 IOPL не используется; доступ к портам ввода/вывода
ограничивается только битовым массивом разрешения ввода/вывода
(см. Главу 23).
Для использования чувствительных команд процедура должна
выполняться на уровне привилегированности, как минимум равном
уровню привилегированности, задаваемому полем IOPL. Попытка
использования чувствительной команды менее привилегированной
процедурой приводит к исключению общей защиты. Поскольку каждая
задача имеет свою собственную копию регистра EFLAGS, каждая
задача может иметь и собственное поле IOPL.
Задача может изменить IOPL только при помощи команды POPF;
однако, такие изменения являются привилегированными. Никакая
процедура не может изменить своего IOPL, если она не работает на
уровне привилегированности 0. Попытка изменения IOPL менее
привилегированной процедурой не приводит к генерации ислючения;
IOPL просто остается без изменений.
Команда POPF может также использоваться для изменения состояния
флага IF (также как и команды CLI и STI); однако, изменение
флага IF командой POPF также чувствительно к IOPL. Процедура
может изменить установку флага IF при помощи команды POPF только
если она сама выполняется с CPL, как минимум равным уровню
привилегированности IOPL. Попытка менее привилегированной
процедуры изменить флаг IF не приводит к исключению; флаг IF
просто остается без изменений.
8.3.2  Битовый массив разрешения ввода/вывода
-----------------------------------------------------------------
Процессор 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.


Яндекс цитирования