Аппаратные интерфейсы ПК — страница 48 из 52

а обеспечивает не только удобное операционное окружение, но и средства разработки и отладки программ. Операционную систему и необходимые программы можно загружать не только с привычных дисков (гибких, жестких, оптических), но и с компактных твердотельных носителей (см. п. 9.3). Эти носители могут подключаться к обычным интерфейсам устройств хранения.

Интересный вариант «твердотельного диска» — DiskOnChip — для микрокомпьютеров и микроконтроллеров, не имеющих стандартных интерфейсов устройств хранения, предлагает фирма M-Systems. Это микросхема, имеющая интерфейс 8/16-битной статической памяти, легко подключаемый к шине ISA (или локальной шине). Модель Millenium Plus объемом 32 Мбайт содержит массив флэш-памяти архитектуры NAND, модуль статической памяти SRAM (1 Кбайт), интерфейсные схемы, логику защиты записи и чтения и схемы обнаружения и исправления ошибок. Микросхема отображается на 8-Кбайтную страницу пространства памяти компьютера в области C8000-EFFFFh. По сигналу аппаратного сброса начальный блок из флэш-памяти выгружается в SRAM; если обнаруживается ошибка, то берется следующий (резервный) блок. Этот блок содержит процедуру инициализации «диска», которая обнаруживается тестом POST как модуль расширения BIOS. Процедура загружает из флэш-массива в системное ОЗУ драйвер своего «электронного диска» (блочного устройства), которое становится первым или последним логическим жестким диском (по выбору при конфигурировании). Далее к этому «диску» можно обращаться обычным способом (через

Int 13h
), c него же может и загружаться ОС. Интерфейс допускает каскадирование — объединение в единый диск до 4 микросхем, увеличивая его объем до 128 Мбайт, при этом все микросхемы отображаются через общее окно памяти (используют общий сигнал выборки). Встроенное ПО обеспечивает полную эмуляцию диска с прозрачным исправлением ошибок и переназначением дефектных секторов. Микросхема поддерживает длительную скорость записи 750 Кбайт/с, считывания — 2,4 Мбайт/с. Пиковая скорость считывания/записи достигает 20 Мбайт/с. В устройстве имеется уникальный идентификационный номер, область для однократного программирования (OTP), возможность защиты от записи отдельных зон и возможность ограничения доступа по паролю (нечитаемому).

12.8. Сервисы и прерывания BIOS

Системная BIOS предоставляет ряд сервисов низкого уровня, в основном предназначенных для обслуживания ввода-вывода и имеющих отношения к стандартным аппаратным интерфейсам. Традиционные сервисы BIOS обычно вызываются в реальном режиме или V86 посредством инструкций программных прерываний (

Int xx
). Большинство сервисов может быть вызвано и через фактически стандартизованные точки входа (адреса в области ROM BIOS) дальними вызовами процедур (
CALL Far
) с предварительным помещением в стек регистра флагов (сервисы построены как обработчики прерываний). Все традиционные сервисы BIOS работают в 16-разрядном режиме процессора, и ими можно пользоваться в реальном режиме, V86 и малопривлекательном 16-разрядном защищенном режиме.

Для процессоров 386+ оптимальным по эффективности является 32-разрядный защищенный режим. Для того чтобы из этого режима можно было пользоваться сервисами BIOS (правда, не всеми) без промежуточных переключений, по инициативе фирмы Phoenix ввели 32-разрядные вызовы BIOS32. Адрес точки входа BIOS32 заранее не известен, но известен способ его нахождения: в диапазоне адресов памяти 0E0000-0FFFFFh на границе параграфов (младшие 4 бита адреса нулевые) ищется строка-сигнатура "

_32_
" (число 325F5F33h) заголовка, за которой следует физический адрес точки входа. Сами сервисы вызываются дальними вызовами точки входа в сервис. Номер, параметры вызываемых функций и результаты передаются на регистрах процессора.

Прерывания, обслуживаемые системной BIOS, перечислены ниже. Кроме них несколько векторов используются как указатели на различные структуры данных.

Внутренние прерывания:

Int 00h
— деление на 0;

Int 01h
— пошаговый режим;

Int 03h
— точка останова;

Int 04h
— переполнение;

Int 06h
— недопустимая команда 286+;

Int 07h
— вызов отсутствующего NPU.

Аппаратные прерывания:

Int 02h
— немаскируемое прерывание;

Int 08h
— таймер 8253/8254;

Int 09h
— клавиатура;

Int 0Ah
IRQ2/9
;

Int 0Bh
IRQ3
;

Int 0Ch
IRQ4
;

Int 0Dh
IRQ5
;

Int 0Eh
IRQ6
— контроллер гибких дисков;

Int 0Fh
IRQ7
;

Int 70h
— CMOS-таймер;

Int 71h
IRQ9
(перенаправлено на
Int 0Ah
);

Int 72h
IRQ10
;

Int 73h
IRQ11
;

Int 74h
IRQ12
(контроллер мыши PS/2);

Int 75h
IRQ13
— исключение сопроцессора;

Int 76h
IRQ14
— контроллер жестких дисков;

Int 77h
IRQ15
.

ПРИМЕЧАНИЕ

Прерывания

Int 70h
-
77h
имеют место только в AT.

Функции ROM BIOS (16-битные сервисы):

Int 05h
(F000:FF54h) — печать экрана;

Int 10h
— видеосервис;

Int 11h
— чтение списка оборудования (слово из BDA 0040:0010h), возвращает в
АХ
:

 • биты 15:14 — число обнаруженных LPT-портов: 00 — 0, …, 11 — 3;

 • бит 13 — резерв;

 • бит 12 — обнаружен игровой адаптер;

 • биты 11:9 — число обнаруженных СОМ-портов: 000 — 0, …, 111 — 7;

 • бит 8 — наличие контроллера DMA;

 • биты 7:6 — число обнаруженных НГМД: 00 — 1, …, 11 — 4;

 • биты 5:4 — активный видеорежим: 00 — резерв, 10 — 80-колоночный цветной, 01 — 40-колоночный цветной, 11 — монохромный;

 • биты 3:2 — размер ОЗУ на системной плате (теперь обычно 00);

 • бит 1 — присутствие математического сопроцессора;

 • бит 0 — присутствие дисководов;

Int 12h
— размер непрерывной памяти;

Int 13h
— дисковый сервис (блочный ввод-вывод);

Int 14h
— обслуживание СОМ-портов;

Int 15h
— AT-функции (системный сервис, функции определяются значением
АН
/
АХ
):

 • 00-03h — управление и обмен данными с кассетным магнитофоном (были когда-то и такие «стриммеры»!) на старых PC;

 • 4fh — перехват клавиатуры;

 • 53xxh — сервисы управления потреблением АРМ (Advanced Power Management);

 • 8300h — запуск таймера, устанавливающего флаг в заданной ячейке;

 • 8301h — сброс того же таймера;

 • 84h — джойстик (см. п. 8.6);

 • 86h — программируемая задержка;

 • 87h — перемещение блока расширенной памяти;

 • 88h — получение размера расширенной памяти;

 • 89h — переключение в режим V86;

 • C0h — получение системной конфигурации, при успешном выполнении (

CF
=0,
AH
=0)
ES:BX 
указывает на таблицу данных конфигурации;

 • 80-82h, 85h, 90h, 91h — функции многозадачных ОС (BIOS устанавливает заглушки);

Int 16h
— клавиатурный ввод-вывод;

Int 17h
— обслуживание LPT-портов;

Int 18h
— процедура восстановления при неудаче начальной загрузки (прежде — ROM-Basic);

Int 19h
— начальная загрузка (вызов процедуры Bootstrap);

Int 1Ah
— системное время, дата, будильник и 16-битные вызовы сервисов PCI;

Int 1Bh
— обработчик нажатия клавиш
Ctrl+Break
;

Int 1Ch
— User Timer Interrupt, процедура, вызываемая обработчиком
Int 08h
каждые 55 мс; BIOS устанавливает простую заглушку (
IRET
), но программы могут перехватывать это прерывание; на время отработки этой процедуры все аппаратные прерывания запрещены (кроме NMI).

Int 33h
— поддержка мыши;

Int 4Ah
— обработчик будильника пользователя, установленного функцией BIOS
Int 1Ah
(6); прерывание вызывается асинхронно, так что при возврате из процедуры все регистры и флаги должны быть в том же состоянии, что и при входе; BIOS ставит заглушку (
IRET
);

Int 67h
— EMS-функции.

Указатели на таблицы:

Int 1Dh
— видеопараметры;

Int 1Eh
— параметры дискет;

Int 1Fh
— знакогенератор СGA;

Int 41h
— параметры HDD 0;

Int 46h
— параметры HDD 1;

Int 43h
— знакогенератор EGA.

12.8.1. Int 09h, Int 16h — поддержка клавиатуры

Поддержка клавиатуры заключается в обработке прерываний от устройства ввода и предоставлении сервисов ввода прикладным программам.

Прерывания, вызванные приходом кодов нажатия и отпускания клавиш, обрабатывает BIOS

Int 9h
. Каждый принятый скан-код (или цепочка) обрабатывается с учетом состояния клавиатурных флагов. Результат обработки (как правило, ASCII-символ в младшем байте и скан-код в старшем) помещается в клавиатурный буфер, расположенный в ОЗУ. По приему каждого символа указатель головы буфера увеличивается. Буфер организован в виде кольца, после достижения конца области буфера указатель головы установится на начало области. В случае переполнения буфера (указатель головы «догнал» указатель хвоста) очередное слово не записывается, и подается звуковой сигнал. Размер позволяет хранить описание шестнадцати фактов нажатий клавиш. Нажатие клавиш
Ctrl
,
Shift
,
Alt
и некоторых комбинаций в буфере не отмечается, но приводит к модификации бит ячеек флагов клавиатуры. Нажатие «системной» комбинации
Ctrl+Alt+Del
, клавиши
PrintScreen
(
SysRq
) и некоторых других к записи в клавиатурный буфер не приводит, а вызывает специальные процедуры.

Для обслуживания клавиатуры используются ячейки ОЗУ из области данных BIOS (BIOS Data Area):

♦ 0:0417, 0:418 — флаги клавиатуры;

♦ 0:0419 — аккумулятор кода

Alt
-набора;

♦ 0:041А — указатель головы буфера (Buffer Head), 2 байта (модифицируется при помещении символа в буфер);

♦ 0:041C — указатель хвоста буфера (Buffer Tail), 2 байта (модифицируется при извлечении символа из буфера);

♦ 0:041E-0:042D — область кольцевого буфера (16 слов).

Обработчик аппаратного прерывания до обработки принятого скан-кода вызывает прерывание BIOS

Int 15h
с
AH
=4Fh, а в
AL
находится принятый скан-код. Стандартный обработчик
Int 15h
(4Fh) просто выполняет возврат с
CF
=0, но его можно заменить специальным обработчиком, который будет при необходимости подменять принятые скан-коды на какие-либо иные (оставляя их в
AL
), что должно отмечаться установкой
CF
=1. В старых версиях BIOS такой возможности перехвата не было, ее наличие можно определить вызовом
Int 15h
(C0h).

Для клавиатуры USB или иного устройства ввода, заменяющего клавиатуру в качестве консоли, прерывание

Int 9h
должно вызываться программно при обработке каждого клавиатурного события. Обработчик этого прерывания должен выполнять те же действия: скан-код пропускать через
Int 15h
(4Fh) и помещать в клавиатурный буфер, а также модифицировать флаги клавиатуры.

Интерфейс прикладного уровня для клавиатуры представляет BIOS

Int 16h
. Его основное назначение — извлечение слов из клавиатурного буфера. Функция задается в регистре
АН
при вызове, результат помещается в регистр
АХ
.

АН
= 00h — чтение (с ожиданием готовности) и выборка слова из буфера (меняется указатель хвоста). Индикаторы клавиатуры обновляются в соответствии с состоянием флагов. Если буфер пуст, то на AT выполняется прерывание
Int 15h
(подфункция 90), что может использоваться ОС, например, для переключения задач. Чтобы программа не «зависала» на ожидании символа, предварительно стоит проверить готовность функцией 01h. Символы расширенной клавиатуры фильтруются — преобразуются в их аналоги 83-клавишной клавиатуры.

АН
= 01h — проверка готовности, чтение без выборки (указатели не изменяются). Признак наличия символа в буфере — установленный флаг
ZF
.

АН
= 02h — чтение состояния флагов (в
AL
— байт 0:417h, см. выше).

АН
= 03h — установка задержки и частоты автоповтора:
BL
— код задержки (00=250, 01=500, 02=750, 03=1000 мс),
ВН
— код частоты (см. п. 9.2.1).

АН
= 05h — запись слова из регистра
СХ
в буфер (меняется указатель головы). Признак успешной записи —
AL
=0, если в буфере нет места, то
AL
=1.

АН
= 10h и
AH
= 11h — функции, аналогичные 00h и 01h, но предназначены специально для 101/102-клавишных клавиатур — в них не выполняется фильтрация символов расширенной клавиатуры. Для ряда клавиш, отсутствующих в клавиатуре АТ-84, эти функции дадут результаты, отличающиеся от вызовов 00h и 01h.

AH
=12h — чтение расширенного состояния флагов (в
АХ
— слово
KbdShiftFlags101Rec
), в котором младший байт совпадает с тем, что дает функция 02h (слово из 0:417h), а старший байт похож на слово из 0:418h. Назначение бит
АХ
:

 • бит 0 — клавиша

Shift
(правая) нажата;

 • бит 1 — клавиша

Shift
(левая) нажата;

 • бит 2 — клавиша

Ctrl
(любая) нажата;

 • бит 3 — клавиша

Alt
(любая) нажата;

 • бит 4 — включен индикатор

Scroll Lock
;

 • бит 5 — включен индикатор

Num Lock
;

 • бит 6 — включен индикатор

Caps Lock
;

 • бит 7 — включен режим

Insert
;

 • бит 8 — клавиша

Ctrl
(левая) нажата;

 • бит 9 — клавиша

Alt
(левая) нажата;

 • бит 10 — клавиша

Ctrl
(правая) нажата;

 • бит 11 — клавиша

Alt
(правая) нажата;

 • бит 12 — клавиша

Scroll Lock
нажата;

 • бит 13 — клавиша

Num Lock
нажата;

 • бит 14 — клавиша

Caps Lock
нажата;

 • бит 15 — клавиша

SysReq
нажата.

Функции чтения буфера (00 и 10h) в регистре

AL
возвращают ASCII-код символа, в
АН
скан-код. Символы, полученные нестандартным способом (в русском регистре или
Alt
-набором), сопровождаются нулевым скан-кодом.
Alt
-набор позволяет ввести в буфер любой символ — для этого его код в десятичной системе набирается на цифровой клавиатуре при нажатой клавише
Alt
, результат заносится в буфер при отпускании клавиши
Alt
.

При

AL
=0 регистр
АН
содержит расширенный ASCII-код (Extended ASCII Keystroke). Дополнительные клавиши 101/102 клавиатур при использовании функций 10h-12h генерируют код E0h в младшем байте и скан-код, соответствующий аналогичным управляющим клавишам 83/84-клавишных клавиатур.

Функция записи (05h), несколько неожиданная для клавиатуры, позволяет легко имитировать работу оператора для различных демонстрационных программ. Если прикладная программа не перехватывает обслуживание клавиатуры на уровне аппаратного прерывания (

Int 9h
), то резидентная программа может ей «подбрасывать» слова в буфер, которые будут восприниматься как нажатие клавиш.

ASCII-коды буфера, соответствующие нажатию клавиш, приведены в [1, 7]. При русификации (или другой локализации) клавиатуры отслеживание переключения регистров (языков) ложится на обработчик аппаратного прерывания клавиатуры.

12.8.2. Int 10h — видеосервис

Int 10h — видеосервис — предназначен для работы с графическим адаптером. Его первичной задачей является управление видеорежимом (BIOS Video Mode), определяющим формат экрана. BIOS адаптера должна выполнять программирование всех стандартных и специфических управляющих регистров для установки (смены) требуемого видеорежима и выбранных параметров развертки — кроме нее о способах этих переключений остальное ПО может и не знать.

В пределах возможностей установленного видеорежима видеосервис предоставляет возможности отображения информации на различных уровнях. Простейший для программиста телетайпный режим позволяет посылать поток символов, которые будут построчно отображаться на экране с отработкой символов возврата каретки, перевода строки, обеспечивая «прокрутку» изображения при заполнении экрана. Есть функции и для полноэкранной работы с текстом, при которой доступны и атрибуты символа. В графическом режиме имеется возможность чтения и записи пиксела с указанными координатами. Однако видеосервисом

Int 10h
программисты пользуются далеко не всегда, поскольку работает он довольно медленно. Подробно рассматривать функции видеосервиса не будем (этому посвящены отдельные книги), отметим особо лишь функцию телетайпного вывода
Int 10h
(0Eh). При вызове
AH
=0Eh, в
AL
— код выводимого символа, в
BL
— цвет (только для графического режима). Символ выводится в текущую позицию курсора, и курсор сдвигается на следующую, переходя на новую строку после конца предыдущей и прокручивая экран при его заполнении. Специальные символы вызывают возврат на начало строки (
CR
, код 0Dh), перевод строки (
LF
, 0Ah) и короткий гудок (
BEL
, 07h). Этой функцией часто пользуются для вывода сообщений программами, работающими на нижнем уровне (например, модули инициализации ПЗУ расширений BIOS, загрузчики и другие, не имеющие еще доступа к сервисам операционных систем). Программа вывода получается простейшей, работает на всех адаптерах и во всех режимах, но довольно медленно.

12.8.3. Int 13h — поддержка дисков

Функции дискового сервиса вызываются программным прерыванием

Int 13h
.

Традиционно дисковый сервис подразделяет физические диски на дискеты (diskette) и фиксированные диски (fixed disk). Набор функций (табл. 7.8) для этих классов устройств несколько различается как по составу, так и по реализации. Классы различаются по диапазонам номеров физических устройств: для дискет отводятся номера 0-7Fh (реально только 0–3), а для фиксированных дисков — 80h-FFh.

Контроллеры дисковых интерфейсов, имеющие в своем составе дополнительные модули BIOS, перехватывают вектор

Int 13h
, беря на себя обслуживание своих устройств. Когда в IBM PC/XT появились жесткие диски со своим контроллером, модуль BIOS этого контроллера, инициализирующийся во время теста POST, вставал на место
Int 13h
, а указатель на исходный обработчик дискового сервиса (драйвер НГМД из системной BIOS) сохранялся на месте
Int 40h
. Хотя поддержка жестких дисков давно уже включена в системную BIOS, ради совместимости возможность использования прерывания
Int 40h
для вызова драйвера гибких дисков сохраняется. Интерфейс этого вызова совпадает с
Int 13h
, но номер устройства (в регистре
DL
) не должен превышать 7Fh.

Кроме функций дискового сервиса (

Int 13h
) c дисковыми устройствами связаны еще и векторы, обслуживающие аппаратные прерывания от контроллера НГМД —
Int 0Eh
(линия
IRQ 6
) и от контроллера жестких дисков —
Int 76h
(линия
IRQ 14
). При наличии двухканального порта ATA второй канал обычно задействует линию
IRQ 15
(вектор 77h). В XT контроллер жестких дисков занимал линию
IRQ 5
(вектор 0Dh). Дополнительные контроллеры дисков могут использовать и другие прерывания. Аппаратные прерывания вырабатываются контроллерами по завершении (нормальному и аварийному) внутренних операций. На эти прерывания BIOS не реагирует, а при инициализации их векторы направляются на программную заглушку (инструкцию
IRET
).

Стандартные драйверы дисковых функций BIOS (включая и расширенный сервис) имеют однозадачное происхождение. Во время выполнения функции значительное процессорное время может затрачиваться на ожидание завершения операции устройством. Драйверы многозадачного режима построены иначе: у них есть вызывающая часть, инициализирующая начало операции, и обработчик аппаратного прерывания от контроллера, сообщающий операционной системе о выполнении операции и результате.

Традиционный сервис BIOS

Традиционный дисковый сервис работает в 16-разрядном режиме процессора, все параметры вызова передаются через регистры процессора. Адрес сектора задается в системе CHS и размещен весьма специфично. Сервис вызывается программным прерыванием

Int 13h
, при вызове принимаются следующие соглашения:

номер функции задается в регистре

АН
и не должен превышать 3Fh;

логический номер диска задается в регистре

DL
(бит 7 = 0 — признак обращения к НГМД);

номер цилиндра (0-1023) задается в регистре

СН
(младшие 8 бит) и
CL[7:6]
(старшие 2 бита);

номер головки (0-255) задается в регистре

DH
;

номер начального сектора (1-63) задается в регистре

CL[5:0]
;

количество секторов, участвующих в операции, 8 бит — в регистре

AL
(0-255);

♦ указатель на начало буфера оперативной памяти для считываемых и записываемых данных (address of buffer) — в регистрах

ЕS:BX
;

результат выполнения операции определяется по флагу переноса:

СF
= 0 — успешное выполнение операции,
CF
= 1 — обнаружены ошибки (код состояния возвращается в регистре
АН
, код завершения последней операции с дискетами хранится по адресу 40:41h, с жесткими дисками — 40:74h);

таблица параметров диска для дискет (DPT) задана указателем в памяти по адресу 0:78h, для жестких дисков (HDPT) — 0:104h или 0:118h.

Список функций традиционного сервиса приведен в табл. 12.7, подробнее они описаны в [4, 9]. Устройства могут не поддерживать некоторые функции, о чем драйверы должны «честно сообщить» кодом возврата 01h.


Таблица 12.7. Функции традиционного дискового сервиса

Номер функции АННазначение параметровИспользование регистров указателей и таблиц
DLDH, CL, CHALES: BXDPT/HDPT
00hReset Disk System — сброс дисковой системы (всех контроллеров и устройств), позиционирование на нулевой цилиндр-----
01hRead Status of Last Operation — чтение состояния последней операции+----
02hRead Sectors into Memory — чтение секторов с диска в память+++++
03hWrite Sectors from Memory — запись секторов из памяти на диск++++
04hVerify Sectors — верификация секторов (холостое чтение без записи в память и проверка CRC/ECC)+++-+
05hFormat Desired Track — форматирование трека+++++
08hGet Drive Parameters — получение параметров диска-
09h¹Initialize Drive Parameters — инициализация таблиц параметров диска+---+
0Ah¹Read Long — «длинное» чтение (сектор и поле ЕСС)+++++
0Bh¹Write Long — «длинная» запись (сектор и поле ЕСС)+++++
0Ch¹Seek — поиск цилиндра++---
0Dh¹Alternative Disk Reset — альтернативный сброс (не затрагивая контроллера дискет)+----
10h¹Test Drive Ready — проверка готовности+----
11h¹Recalibrate — рекалибровка (позиционирование на нулевой цилиндр)+----
14h¹Controller Internal Diagnostics — диагностика контроллера жестких дисков-----
15hRead DASD Туре — получение типа диска: АН=0 — нет диска; АН=1 — дискета, без датчика смены диска; АН=2 — дискета, с датчиком смены диска; АН=3 — жесткий диск; иные значения — код ошибки. CX: DX содержат число 512-байтных секторов на диске+----
16h²Diskette Change Line Status — проверка статуса смены дискеты: CF=0: АН=0 — смены носителя не было; CF=1: AH=1 — недопустимый номер диска; АН=6 — была смена диска или определение смены не поддерживается; AH=80h — дисковод не готов или не установлен; иные значения — код ошибки+----
17h²Set Diskette Type for Format — установка типа дискеты для форматирования (перед форматированием)+
18h²Set Media Type for Format — установка типа носителя (для форматирования)+---
20h²Get Media Type — получение типа установленного носителя+----
24h¹Set Multiple Mode — установка параметров режима многосекторного обращения (в AL — число секторов за операцию)+-+--
25h¹Identify Drive ATA — идентификация накопителя (только для ATA-дисков)+--+-

¹ Только для фиксированных дисков.

² Только для дискет и других сменных носителей.

³ Назначение отличается от обычного.


Формально традиционный сервис позволяет работать с дисками, имеющими до 1024×256×63 = 16 515 072 секторов (около 8,4 Гбайт). Ряд операционных систем имеет ошибку, не позволяющую использовать полный объем, допустимый данным сервисом. Для дисков объемом более 15 481 935 секторов следует пользоваться только функциями расширенного сервиса (см. ниже). Однако при работе с устройствами ATA имеется еще и барьер в 528 Мбайт. Дело в том, что контроллер жесткого диска ATA, на который ориентированы драйверы

Int 13h
, имеет только 4-битный регистр номера головки (а в BIOS — 6 бит). Правда, этот же контроллер способен принимать 16-битный номер цилиндра (в BIOS — 10 бит). Понятно, что непосредственно без искажений через эти два фильтра (формат вызова и формат регистров контроллера) может пройти только вызов с самыми жесткими ограничениями по каждой координате. Тогда ограничение, полученное тем же перемножением диапазонов координат, получается около 528 миллионов байт:

(210 = 1024 цилиндра) × (24 = 16 головок) × (26 – 1 = 63 сектора) × 512 байт = 528 482 304 байт.

Для преодоления 528-мегабайтного барьера дисков ATA, не трогая программного интерфейса, в BIOS ввели расширение традиционного дискового сервиса. Интерфейс ATA в трехмерной геометрии позволяет реализовать довольно большой (но уже не запредельный) объем диска:

(216 = 65 536 цилиндров) × (24 = 16 головок) × (28 – 1 = 255 сектора) × 512 байт = 136,9 Гбайт.

Чтобы достичь хотя бы интерфейсного ограничения BIOS (8,4 Гбайт), стали применять трансляцию параметров вызова функций

Int 13h
, которые будем теперь называть логическими, в физические[6] параметры, передаваемые контроллерам ATA-дисков. В функции, которая сообщает параметры диска (функция 8), производится обратная трансляция, так что на стороне вызова программного интерфейса
Int 13h
присутствуют только логические параметры. Естественно, логический объем диска не может превышать физического: (С × H × S)ЛОГ≤ (С × H × S)ФИЗ.

Подробнее о преодолении барьеров и способах трансляции (LBA, Large Disk, ECHS) см. в [1, 4, 9]

Расширенный сервис BIOS

Чтобы получить возможность работы через BIOS с дисками объема более 8,4 Гбайт, потребовалось ввести новые функции дискового сервиса.

Расширенный дисковый сервис BIOS, Enhanced Disk Drive Services (EDD), продвигаемый фирмой Phoenix Technologies LTD, реализуется многими разработчиками BIOS и устройств массовой памяти. Он позволяет работать с устройствами, имеющими объем до 264 секторов, эффективно используя архитектуру процессоров IA-32 и IA-64. Сервис оперирует линейным логическим адресом сектора (LBA). Вместо традиционных таблиц параметров дисков в нем используются новые, дающие исчерпывающую информацию об устройствах, их физической организации и интерфейсе. Устройства могут иметь сменные носители и сами быть съемными в процессе работы компьютера (например, подключенные к шине USB или IEEE 1394), так что понятие «сменяемость носителя» несколько размывается. Такие устройства должны поддерживать механизм уведомления о смене носителя и программное блокирование смены носителя. По прогнозам емкости данного интерфейса должно хватить на 15–20 лет.

Расширения BIOS

Int 13h
используют ОС Windows 95, Windows 98, Windows 2000. Правда, это использование ограничено лишь начальной загрузкой и процессом установки (FDISK, FORMAT), поскольку в регулярной работе применяются собственные 32-разрядные драйверы. Расширения BIOS
Int 13h
не используют DOS (все версии), Windows 3.1x, Windows NT, Novell NetWare, OS/2 Warp, Linux, Unix.

В настоящее время определены три набора функций:

♦ доступ к фиксированным дискам (fixed disk access subset) — функции 41-44h, 47h и 48h;

♦ блокировка и смена носителя (device locking and ejecting subset) — функции 41h, 45h, 46h, 48h и 49h;

♦ поддержка расширенных дисков (enhanced disk drive (EDD) support subset) — функции 41h и 48h.

Расширенный сервис, как и традиционный, вызывается программным прерыванием

Int 13h
с номерами функций свыше 3Fh (регистр
АН
); номер устройства (регистр
DL
) допустим в диапазоне 80h-FFh. Основные параметры вызова — начальный адрес блока, число секторов для передачи и адрес буфера — передаются через адресный пакет (device address packet). Формат пакета в сравнении с передачей параметров традиционного сервиса через регистры процессора довольно просторный.

Поскольку расширение BIOS может и отсутствовать, имеется функция проверки его наличия (номер 41h). Расширение может действовать избирательно (не для всех устройств), так что проверку надо производить для конкретного устройства, интересующего программу. Проверка дает номер версии расширения и карту поддерживаемых наборов функций. Функции расширенного чтения, записи, верификации и поиска (42h, 43h, 44h и 47h) по смыслу не отличаются от их аналогов из традиционного сервиса. Для работы со сменными носителями введены функции отпирания/запирания, извлечения и проверки факта смены носителя (45h, 46h и 49h). От идеологии традиционного сервиса сильно отличается функция получения параметров устройства (48h). Она возвращает в ОЗУ буфер с набором параметров и детальным описанием устройства, позволяющим ОС и приложениям работать с ним, минуя BIOS. Функция установка аппаратной конфигурации (4Eh) позволяет управлять режимом передачи (PIO, DMA), а также предварительной выборкой (поиском).

Для эмуляции дисков на загружаемых CD-ROM к сервисам BIOS

Int 13h
добавляется несколько новых функций:

начать/завершить эмуляцию диска (4Ah/4Bh), начать эмуляцию диска и выполнить загрузку (4Ch);

прочитать секторы загрузочного каталога (4Dh); функции 41-48h позволяют обращаться к любым логическим секторам CD-ROM (в режиме LBA с размером сектора 2048 байт), когда для данного привода включена эмуляция.

Подробнее расширенный сервис рассмотрен в [4].

12.8.4. Int 14h — поддержка СОМ-портов

СОМ-порты поддерживаются сервисом BIOS

Int 14h
, который обеспечивает описанные ниже функции.

♦ 00h — инициализация (установка скорости обмена и формата посылок, заданных регистром

AL
; запрет источников прерываний). На сигналы
DTR
и
RTS
влияния не оказывает (после аппаратного сброса они пассивны).

♦ 01h — вывод символа из регистра

AL
(без аппаратных прерываний). Активируются сигналы
DTR
и
RTS
, и после освобождения регистра
THR
в него помещается выводимый символ. Если за заданное время регистр не освобождается, фиксируется ошибка тайм-аута и функция завершается.

♦ 02h — ввод символа (без аппаратных прерываний). Активируется только сигнал

DTR
(
RTS
переходит в пассивное состояние), и ожидается готовность принятых данных, принятый символ помещается в регистр
AL
. Если за заданное время данные не получены, функция завершается с ошибкой тайм-аута.

♦ 03h — опрос состояния модема и линии (чтение регистров

МSR
и
LSR
). Эту гарантированно быструю функцию обычно вызывают перед функциями ввода-вывода во избежание риска ожидания тайм-аута.

При вызове

Int 14h
номер функции задается в регистре
АН
, номер порта (0–3) — в регистре
DX
(0 —
COM1
, 1 —
COM2
…). При возврате из функций 0, 1 и 3 регистр
АН
содержит байт состояния линии (регистр LSR),
AL
— байт состояния модема (MSR). При возврате из функции 2 нулевое значение бита 7 регистра
АН
указывает на наличие принятого символа в регистре
AL
; ненулевое значение бита 7 — на ошибку приема, которую можно уточнить функцией 3.

Байт состояния линии (регистр

АН
) имеет следующий формат:

♦ бит 7 — ошибка тайм-аута (после вызова функции 2 — признак любой ошибки);

♦ бит 6 — регистр сдвига передатчика пуст (пауза передачи);

♦ бит 5 — промежуточный регистр передатчика пуст (готов принять символ для передачи);

♦ бит 4 — обнаружен обрыв линии;

♦ бит 3 — ошибка кадра (отсутствие стоп-бита);

♦ бит 2 — ошибка паритета принятого символа;

♦ бит 1 — переполнение (потеря символа);

♦ бит 0 — регистр данных содержит принятый символ.

Байт состояния модема (регистр

AL
при возврате из функций 0, 1, 3) имеет следующий формат:

♦ бит 7 — состояние линии

DCD
;

♦ бит 6 — состояние линии

RI
;

♦ бит 5 — состояние линии

DSR
;

♦ бит 4 — состояние линии

CTS
;

♦ бит 3 — изменение состояния

DCD
;

♦ бит 2 — изменение огибающей

RI
;

♦ бит 1 — изменение состояния

DSR
;

♦ бит 0 — изменение состояния

CTS
.

При инициализации порта биты регистра

AL
имеют следующее назначение:

♦ биты [7:5] — скорость обмена:

 • 000=110; 100=1200; 001=150; 101=2400;

 • 010=300; 110=4800; 011=600; 111=9600 бит/с;

♦ биты [4:3] — контроль паритета:

 • 01 — число единиц нечетное;

 • 11 — четное;

 • 0 и 10 — без контроля;

♦ бит 2 — количество стоп-бит: 0–1 бит, 1–2 бита (на скорости 110 бит/с — 1,5 стоп-бит);

♦ биты [1:0] — длина посылки: 00 — 5 бит, 01 — 6 бит, 10 — 7 бит, 11 — 8 бит.

В процессе начального тестирования POST BIOS проверяет наличие последовательных портов (регистров UART 8250 или совместимых) по стандартным адресам и помещает базовые адреса обнаруженных портов в ячейки

BIOS Data Area
0:0400, 0402, 0404, 0406. Эти ячейки хранят адреса портов с логическими именами
COM1
-
СОМ4
. Нулевое значение адреса является признаком отсутствия порта с данным номером. В ячейки 0:047С, 047D, 047Е, 047F заносятся константы, задающие тайм-аут для портов.

Обнаруженные порты инициализируются на скорость обмена 2400 бит/с, 7 бит данных с контролем на четность (even), 1 стоп-бит. Управляющие сигналы интерфейса

DTR
и
RTS
переводятся в исходное состояние («выключено» — положительное напряжение).

12.8.5. Int 17h — поддержка принтера

Сервисы BIOS

Int 17h
: обеспечивают инициализацию, вывод байта данных и опрос состояния принтера, подключенного к LPT-порту. При вызове функция задается в регистре
АН
, номер LPT-порта — в регистре DX.

АН
= 00h — вывод байта из регистра
AL
по протоколу Centronics (без аппаратных прерываний). Данные помещаются в выходной регистр, и, дождавшись готовности принтера (снятия сигнала
Busy
), формируется строб.

АН
 = 01h — инициализация интерфейса и принтера (установка исходных уровней управляющих сигналов, формирование импульса
Init#
, запрет аппаратных прерываний и переключение на вывод двунаправленного интерфейса).

АН
= 02h — опрос состояния принтера (чтение регистра состояния порта).

При возврате регистр

АН
содержит байт состояния, который собирается из бит регистра состояния
SR[7:3]
и программно формируемого флага тайм-аута. Биты 6 и 3 относительно байта, считанного из регистра состояния, инвертированы. Назначение бит байта состояния:

♦ бит 7 — не занято (сигнал

Busy
); нулевое значение означает, что принтер занят (буфер полон или состояние Off-Line, или ошибка);

♦ бит 6 — подтверждение (сигнал

Ack#
); единичное значение означает, что принтер подключен;

♦ бит 5 — конец бумаги (сигнал

PaperEnd
);

♦ бит 4 — принтер готов (сигнал

Select
); нулевое значение означает, что принтер в состоянии Off-Line;

♦ бит 3 — ошибка принтера (сигнал

Error#
); единичное значение соответствует ошибке;

♦ биты 2:1=00 (не используются);

♦ бит 0 — флаг тайм-аута, устанавливается при неудачной попытке вывода символа, если сигнал

Busy
не снимается в течение времени, определенного для данного порта в ячейках тайм-аута (в BIOS Data Area); в этом случае согласно протоколу Centronics строб данных не вырабатывается.

Перехват прерывания

Int 17h
является удобным способом внедрения собственных драйверов принтера. Потребность в них может возникать при подключении к порту принтера с интерфейсом ИРПР или необходимости перекодировки символов. Если разрабатываемый драйвер предназначен не только для перекодировки, но и изменения протокола (через
Int 17h
можно организовать вывод через LPT-порт по протоколу ИРПР и даже через СОМ-порт), следует внимательно отнестись к битам возвращаемого байта состояния. При их неправильном формировании попытки вывода на печать могут приводить к ошибочным сообщениям.

12.8.6. Int 1Ah и Int 15h — поддержка таймеров

Сервисы BIOS

Int 1Ah
позволяют считывать и модифицировать значения системного таймера, даты и времени, а также установки будильника часов реального времени CMOS RTC. Перечисленные ниже номера функций указываются при вызове в регистре
АН
.

1. 

АН
=0 — чтение системного таймера (двойного слова по адресу 40:006Eh в BIOS Data Area, инкрементируемого по прерываниям от канала 0 счетчика- таймера 8253/8254 примерно раз в 55 мс. Таймер обнуляется при выполнении теста POST после аппаратного сброса). Возвращает значение таймера, в
СХ
 — старшую часть, в
DX
— младшую.
AL
=0, если за последние 24 часа не было переполнения таймера. В современных версиях сброс
AL
возвращает счетчик переполнений таймера, хранящийся в ячейке 40:0070h (в старых версиях это был флаг).

2. 

АН
=1 — установка системного таймера (
СХ
— старшая часть, в
DX
— младшая) и сброс флага (счетчика) переполнения таймера в ячейке 40:0070h. В случае ошибки устанавливается флаг
CF
=1.

3. 

АН
=2 — чтение времени из RTC. Возвращает в упакованном BCD-формате час (в регистре
СН
), минуту (
CL
), секунду (
DH
) и признак коррекции летнего/зимнего времени (
DL
=1 — коррекция используется,
DL
=0 — нет). Признаком успешной операции является флаг
CF
=0. Во избежание ошибок некоторых BIOS при вызове флаг
CF
должен быть сброшен.

4. 

АН
=3 — установка времени в RTC, назначение регистров и признак результата аналогичен функции 2.

5. 

АН
=4 — чтение даты из RTC. Возвращает в упакованном BCD-формате век (в регистре
СН
), две старшие цифры года (
CL
), месяц (
DH
) и день (
DL
). Признаком успешной операции является флаг
CF
=0. Во избежание ошибок некоторых BIOS при вызове флаг
CF
должен быть сброшен.

6. 

АН
=5 — установка даты в RTC, назначение регистров и признак результата аналогичен функции 4.

7. 

АН
=6 — установка времени срабатывания будильника RTC. Возвращает в упакованном BCD-формате час (в регистре
СН
), минуту (
CL
) и секунду (
DH
). Если будильник уже установлен, переустановка не производится и возвращается флаг
CF
=1. При срабатывании будильник вызывает прерывание
Int 4Ah
.

8. 

АН
=7 — отмена установки будильника.

Функции BIOS

Int 15h
позволяют программировать таймер CMOS RTC — вводить задержку или запускать таймер установки флага, указывая время в микросекундах (СХ — старшее слово, DX — младшее). Нулевое значение интервала не вызывает никаких действий. Достижимое разрешение в зависимости от производительности ПК может достигать единиц миллисекунд, максимальная выдержка — около 70 часов. Перечисленные ниже номера функций указываются при вызове в регистре
АН
или
АХ
.

9. 

AH
=86h — задержка на заданное время. Управление будет возвращено вызвавшему процессу только через указанный интервал. По окончании задержки будет установлен бит 7 в ячейке BDA 0040:00A0. Таймер может оказаться занятым, тогда вызов сразу возвратит флаг
CF
=1 (при успехе
CF
=0, а в
AL
окажется маска, записанная в 8259А#2).

10. 

AX
=8300h — запуск таймера, устанавливающего флаг после указанной задержке бит 7 в ячейке, заданной регистрами
ES
:
BX
. При успешном запуске
CF
=0; если таймер занят (он один) —
CF
=1 и
AL
=0. Управление возвращается процессу сразу, а флаг будет установлен через заданное время. Перед завершением программа, запускавшая таймер, должна его сбросить функцией 8301h (во-первых, чтобы освободить; во-вторых, чтобы снять «адскую машинку», которая неожиданно сама может изменить значение ячейки памяти, вполне возможно уже задействованную другим, ничего не «подозревающим» процессом).

11. 

AX
=8301h — сброс того же таймера.

12.8.7. PCI BIOS

Функции PCI BIOS используются только для поиска и конфигурирования устройств PCI — процедур, требующих доступа к их конфигурационному пространству (см. п. 8.2). Регулярная работа с этими устройствами выполняется через обращения к регистрам устройств по адресам, полученным при конфигурировании, и обработке известных номеров прерываний от этих устройств. Для 16-битного интерфейса реального режима, V86 и 16-битного реального режима, функции PCI BIOS вызываются через прерывание

Int 1Ah
; номер функции задается при вызове в регистре
АХ
. Возможна и программная имитация прерывания дальним вызовом по физическому адресу 000FFE6EH (стандартная точка входа в обработчик
Int 1Ah
) с предварительным занесением в стек регистра флагов.

Признаком нормального выполнения является

CF
=0 и
АН
=0; при
CF
=1
АН
содержит код ошибки:

♦ 81h — неподдерживаемая функция;

♦ 83h — неправильный идентификатор производителя;

♦ 86h — устройство не найдено;

♦ 87h — неправильный номер регистра PCI.

Вызовы требуют глубокого стека (до 1024 байт). Для 32-разрядных вызовов защищенного режима все эти же функции вызываются через точку входа, найденную через каталог 32-разрядных сервисов (см. выше), при этом назначение входных и выходных регистров и флага

CF
сохраняется. До использования 32-разрядного интерфейса следует сначала найти его каталог и убедиться в наличии сервисов PCI. Функции PCI BIOS перечислены ниже:

АХ
= B101h — проверка присутствия PCI BIOS. При наличии PCI BIOS возвращает
CF
=0,
АН
=0 и
EDX
=20494350h (строка символов "PCI "); проверяться должны все три признака. При этом в
AL
находится описатель аппаратного механизма доступа к конфигурационному пространству и генерации специальных циклов PCI:

 • Бит 0 — поддержка механизма № 1 для доступа к конфигурационному пространству;

 • Бит 1 — поддержка механизма № 2 для доступа к конфигурационному пространству;

 • Биты 2:3=00 (резерв);

 • Бит 4 — поддержка генерации специального цикла по механизму № 1;

 • Бит 5 — поддержка генерации специального цикла по механизму № 2;

 • Биты 6:7=00 (резерв).

В регистрах

ВН
и
BL
возвращается старший и младший номер версии (BCD-цифры), в
CL
— максимальный номер шины PCI, присутствующий в системе (число шин +1, поскольку они нумеруются с нуля последовательно). В регистре
EDI
может возвращаться линейный адрес точки входа 32-разрядных сервисов BIOS. Этот адрес возвращается не всеми версиями BIOS (некоторые не изменяют
EDI
); для проверки можно при вызове обнулять
EDI
и проверять на нуль возвращенное значение.

АХ
= B102h — поиск устройства по идентификатору. При вызове в
СХ
указывается идентификатор устройства, в
DX
— идентификатор производителя, в
SI
— индекс (порядковый номер) устройства. При успешном возврате в
ВН
— номер шины, в
BL[7:3]
— номер устройства,
BL[2:0]
— номер функции. Для нахождения всех устройств с указанными идентификаторами вызовы выполняют, последовательно инкрементируя
SI
от 0 до получения кода возврата 86h.

AX
= B103h — поиск устройства по коду класса. При вызове в
ЕСХ[23:16]
указывается код класса, в
ЕСХ[15:8]
— подкласса, в
ЕСХ[7:0]
— интерфейс, в
SI
 — индекс устройства (аналогично предыдущему). При успешном возврате в
ВН
— номер шины, в
BL[7:3]
— номер устройства,
BL[2:0]
— номер функции.

АХ
= B106h — генерация специального цикла PCI. При вызове в
BL
указывается номер шины, в
EDX
— данные специального цикла.

АХ
= В108h — чтение байта конфигурационного пространства устройства PCI. При вызове в
ВН
— номер шины, в
BL[7:3]
— номер устройства,
BL[2:0]
— номер функции, в
DI
— номер регистра (0-FFh). При успешном возврате в
CL
— считанный байт.

АХ
= B109h — чтение слова конфигурационного пространства устройства PCI. При вызове в
ВН
— номер шины, в
BL[7:3]
— номер устройства,
BL[2:0]
— номер функции, в
DI
— номер регистра (0-FFh, четный). При успешном возврате в
СХ
— считанное слово.

АХ
= В10Ah — чтение двойного слова конфигурационного пространства устройства PCI. При вызове в
ВН
— номер шины, в
BL[7:3]
 — номер устройства,
BL[2:0]
— номер функции, в
DI
— номер регистра (0-FFh, кратный 4). При успешном возврате в
ЕСХ
— считанное двойное слово.

АХ
= B10Bh — запись байта конфигурационного пространства устройства PCI. При вызове в
ВН
— номер шины, в
BL[7:3]
— номер устройства,
BL[2:0]
— номер функции, в
DI
— номер регистра (0-FFh), в
CL
— записываемый байт.

АХ
= B10Ch — запись слова конфигурационного пространства устройства PCI. При вызове в
ВН
— номер шины, в
BL[7:3]
— номер устройства,
BL[2:0]
— номер функции, в
DI
— номер регистра (0-FFh, четный), в
СХ
— записываемое слово.

АХ
= B10Ah — запись двойного слова конфигурационного пространства устройства PCI. При вызове в
ВН
— номер шины, в
BL[7:3]
 — номер устройства,
BL[2:0]
— номер функции, в
DI
— номер регистра (0-FFh, кратный 4), в
ЕСХ
— записываемое двойное слово.

12.9. Расширения ROM BIOS