Assembler - язык неограниченных возможностей


Символьные устройства


Драйвер символьного устройства должен содержать в поле атрибутов драйвера (смещение 04 в заголовке) единицу в самом старшем бите. Тогда остальные биты трактуются следующим образом:

    бит 15: 1

    бит 14: драйвер поддерживает функции чтения/записи IOCTL

    бит 13: драйвер поддерживает, функцию вывода до занятости

    бит 12: 0

    бит 11: драйвер поддерживает функции открыть/закрыть устройство

    биты 10 – 8: 000

    бит 7: драйвер поддерживает функцию запроса поддержки IOCTL

    бит 6: драйвер поддерживает обобщенный IOCTL

    бит 5: 0

    бит 4: драйвер поддерживает быстрый вывод (через INT 29h)

    бит 3: драйвер устройства «часы»

    бит 2: драйвер устройства NUL

    бит 1: драйвер устройства STDOUT

    бит 0: драйвер устройства STDIN

IOCTL — это большой набор функций (свыше пятидесяти), доступных как различные подфункции INT 21h АН = 44h и предназначенных для прямого взаимодействия с драйверами. Но о IOCTL — чуть позже, а сейчас познакомимся с тем, как устроен, возможно, самый простой из реально полезных драйверов.

В качестве первого примера рассмотрим драйвер, который вообще не обслуживает никакое устройство, реальное или виртуальное, а просто увеличивает размер буфера клавиатуры BIOS до 256 (или больше) символов. Этого можно было бы добиться обычной резидентной программой,но BIOS хранит в своей области данных только ближние адреса для этого буфера, то есть смещения относительно сегментного адреса 0040h. Так как драйверы загружаются в память первыми, еще до командного интерпретатора, они обычно попадают в область линейных адресов 00400h – 10400h, в то время как с резидентными программами это может не получиться.

Наш драйвер будет обрабатывать только одну команду, команду инициализации драйвера 00h. Для нее буфер запроса выглядит следующим образом: