Сервисы и прерывания BIOS
Системная BIOS предоставляет ряд сервисов низкого уровня, в основном предназначенных для обслуживания ввода-вывода и имеющих отношения к стандартным аппаратным интерфейсам. Традиционные сервисы BIOS обычно вызываются в реальном режиме или V86 посредством инструкций программных прерываний (Int xx). Большинство сервисов может быть вызвано и через фактически стандартизованные точки входа (адреса в области ROM BIOS) дальними вызовами процедур (CAL L f a r) с предварительным помещением в стек регистра флагов (сервисы построены как обработчики прерыаний). Все традиционные сервисы BIOS работают в 16-разрядном режиме процессора, и ими можно пользоваться в реальном режиме, V86 и малопривлекательном 16-разрядном защищенном режиме.
Для процессоров 386+ оптимальным по эффективности является 32-разрядный защищенный режим. Для того чтобы из этого режима можно было пользоваться сервисами BIOS (правда, не всеми) без промежуточных переключений, по инициативе фирмы Phoenix ввели 32-разрядные вызовы BIOS32. Адрес точки входа BIOS32 заранее не известен, но известен способ его нахождения: в диапазоне адресов памяти OEOOOO-OFFFFFh на границе параграфов (младшие 4 бита адреса нулевые) ищется строка-сигнатура "_32_" (число 325F5F33H) заголовка, за которой следует физический адрес точки входа. Сами сервисы вызываются дальними вызовами точки входа в сервис. Номер, параметры вызываемых функций и результаты передаются на регистрах процессора.
Прерывания, обслуживаемые системной BIOS, перечислены ниже. Кроме них несколько векторов используются как указатели на различные структуры данных.
12.8. Сервисы и прерывания BIOS____________________________________ 481
Внутренние прерывания:
¦ 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 7Ih — IRQ9 (перенаправлено на Int 0Ah);
¦ Int 72h- IRQ10;
¦ Int 73h — IRQ11;
¦ Int 74h — IRQ 12 (контроллер мыши PS/2);
¦ Int 75h — IRQ 13 — исключение сопроцессора;
¦ Int 76h — IRQ14— контроллер жестких дисков;
¦ Int 77h-IRQ15.
ПРИМЕЧАНИЕ
Прерывания Int 70h-77h имеют место только в AT.
Функции ROM BIOS (16-битные сервисы):
¦ Int 05h (FOOO:FF54h) - печать экрана;
¦ Int 10h — видеосервис;
¦ Int llh — чтение списка оборудования (слово из BDA 0040:001 0h), возвра
щает в АХ:
• биты 15:14 — число обнаруженных LPT-портов: 00 —0,... 11 — 3;
• бит 13 — резерв;
• бит 12 — обнаружен игровой адаптер;
482______ Глава 12. Архитектурные компоненты IBM PC-совместимого компьютера
• биты 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 — АТ-функции (системный сервис, функции определяются значени
ем АН/АХ):
• 00-ОЗЬ — управление и обмен данными с кассетным магнитофоном (были когда-то и такие «стриммеры»!) на старых PC;
• 4fh — перехват клавиатуры;
• 53xxh — сервисы управления потреблением АРМ (Advanced Power Management);
• 8300h — запуск таймера, устанавливающего флаг в заданной ячейке;
• 830 lh — сброс того же таймера;
• 84h — джойстик (см. п. 8.6);
• 86h — программируемая задержка;
• 87h — перемещение блока расширенной памяти;
• 88h — получение размера расширенной памяти;
• 89h — переключение в режим V86;
• COh — получение системной конфигурации, при успешном выполнении (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 lAh— системное время, дата, будильник и 16-битные вызовы сервисов PCI;
¦ Int IBh — обработчик нажатия клавиш Ctrl+Break;
12.8. Сервисы и прерывания BIOS____________________________________ 483
¦ Int I C h — User Timer Interrupt, процедура, вызываемая обработчиком I n t 0 8 h каждые 55 мс; BIOS устанавливает простую заглушку (IRET), но программы могут перехватывать это прерывание; на время отработки этой процедуры все аппаратные прерывания запрещены (кроме NMI).
¦ Int ЗЗп — поддержка мыши;
¦ Int 4Ah — обработчик будильника пользователя, установленного функцией
BIOS Int lAh(6); прерывание вызывается асинхронно, так что при возврате
из процедуры все регистры и флаги должны быть в том же состоянии, что и при
входе; BIOS ставит заглушку (IRET);
¦ Int 67h - EMS-функции.
Указатели на таблицы:
¦ Int IDh — видеопараметры;
¦ Int lEh — параметры дискет;
¦ Int IFh — знакогенератор СGA;
¦ Int 41h — параметры HDD 0;
¦ Int 46h — параметры HDD 1;
¦ Int 43h — знакогенератор EGA.