Программирование драйверов Windows

       

Пространство ввода/вывода


В некоторых реализациях процессорных архитектур доступ к регистрам устройств осуществляется при помощи специальных команд процессора &#8212 инструкций ввода/вывода. Они ссылаются на специальные наборы выводов процессора и определяют отдельное шинно-адресное пространство для устройств ввода/вывода. Адреса на этих шинах широко известны как порты (ports)

и не имеют никакого отношения к адресации памяти. В архитектуре Intel x86 адресное пространство ввода/вывода имеет размер 64 КБ (16 разрядов), а в языке ассемблера определено две инструкции для чтения и записи в этом пространстве: 'IN'

и 'OUT' (точнее, две группы инструкций, внутри которых различие имеет место по разрядности считываемых/записываемых данных).

Поскольку при создании драйвера следует избегать привязки к аппаратной платформе, Microsoft рекомендует избегать и использования реальных инструкций IN/OUT. Вместо этого следует использовать макроопределения HAL. Соответствие между традиционными инструкциям DOS/Windows ассемблера и макроопределениями HAL приводится в таблице 5.2.

Таблица 5.2. Макроопределения HAL для доступа к портам ввода/вывода

Ассемблер х86 Аналог HAL Описание
IN AL,DX



IN AL,port

READ_PORT_UCHAR Чтение 1 байта из порта ввода/вывода
IN AX,DX

IN AX,port

READ_PORT_USHORT Чтение 16-ти разрядного слова из порта ввода/вывода
IN EAX,DX

IN EAX,port

READ_PORT_ULONG Чтение 32-х разрядного слова из порта ввода/вывода
INSB READ_PORT_BUFFER_UCHAR Чтение массива байт из порта ввода/вывода
INSW READ_PORT_BUFFER_USHORT Чтение массива 16-ти разрядных слов из порта ввода/вывода
INSD READ_PORT_BUFFER_ULONG Чтение массива 32-х разрядных слов из порта ввода/вывода
OUT DX,AL

OUT port,AL

WRITE_PORT_UCHAR Запись 1 байта в порт ввода/вывода
OUT DX,AX

OUT port,AX

WRITE_PORT_USHORT Запись 16-ти разрядного слова в порт ввода/вывода
OUT DX,EAX

OUT port,EAX

WRITE_PORT_ULONG Запись 32-х разрядного слова в порт ввода/вывода
OUTSB WRITE_PORT_BUFFER_UCHAR Запись массива байт в порт ввода/вывода
OUTSW WRITE_PORT_BUFFER_USHORT Запись массива 16-ти разрядных слов в порт ввода/вывода
OUTSD WRITE_PORT_BUFFER_ULONG Запись массива 32-х разрядных слов в порт ввода/вывода



Содержание раздела