
Традиционный сервис bios
Традиционный дисковый сервис имеет программный интерфейс, сохранившийся еще со времен IBM PC/XT. Параметры вызова передаются через 16-разрядные регистры процессора, что накладывает ограничение на возможности адресации. В традиционном сервисе используется трехмерная адресация CHS. Сервис вызывается программным прерыванием Int 13h, при вызове принимаются следующие соглашения:
* номер цилиндра (0-1023) задается в регистре СН (младшие 8 бит) и СL[7:6] (старшие 2 бита);
* номер головки (0-255) задается в регистре DH;
* номер начального сектора (1-63) задается в регистре СL[5:0];
* количество секторов, участвующих в операции, 8 бит — в регистре AL (0-255);
* указатель на начало буфера оперативной памяти для считываемых и записываемых данных (address of buffer) — в регистрах ES: ВХ;
* результат выполнения операции определяется по флагу переноса: CF = 0 — успешное выполнение операции, CF = 1 — обнаружены ошибки (код состояния возвращается в регистре <АН, код завершения последней операции с дискетами хранится по адресу 40:41h, с жесткими дисками — 40:74h);
* таблица параметров диска для дискет (DPT) задана указателем в памяти по адресу 0:78h, для жестких дисков (HDPT) — 0:104h или 0:
Список функций традиционного сервиса приведен в табл. 1. Устройства могут не поддерживать некоторые функции, о чем драйверы должны «честно сообщить» кодом возврата 01h.
Таблица 1. Функции традиционного дискового сервиса
1 Только для фиксированных дисков.
2 Только для дискет и других сменных носителей.
3 Назначение отличается от обычного.
Формально традиционный сервис позволяет работать с дисками, имеющими до 1024*256*63=16 515 072 секторов (около 8,4 Гбайт). Ряд операционных систем имеет ошибку, не позволяющую использовать полный объем, допустимый данным сервисом. Для дисков объемом более 15 481 935 секторов следует пользоваться только функциями расширенного сервиса. Однако при работе с устройствами АТА имеется еще и барьер в 528 Мбайт. Дело в том, что контроллер жесткого диска АТА, на который ориентированы драйверы Int 13h, имеет только 4-битный регистр номера головки (а в BIOS — 6 бит). Правда, этот же контроллер способен принимать 16-битный номер цилиндра (в BIOS — 10 бит). Понятно, что непосредственно без искажений через эти два фильтра (формат вызова и формат регистров контроллера) может пройти только вызов с самыми жесткими ограничениями по каждой координате. Тогда ограничение, полученное тем же перемножением диапазонов координат, получается около 528 миллионов байт:
(210 = 1024 цилиндра) х (24 = 16 головок) х (26 - 1 = 63 сектора) х 512 байт = 528 482 304 байт.
Для преодоления 528-мегабайтного барьера дисков АТА, не трогая программного интерфейса, в BIOS ввели расширение традиционного дискового сервиса. Интерфейс АТА в трехмерной геометрии позволяет реализовать довольно большой (но уже не запредельный) объем диска:
(216 = 65 536 цилиндров)*(24 = 16 головок)* (28 - 1 = 255 сектора)* 512 байт = = 136,9 Гбайт.
Чтобы достичь хотя бы интерфейсного ограничения BIOS (8,4 Гбайт), стали применять трансляцию параметров вызова функций Int 13h, которые будем теперь называть логическими, в физические1 параметры, передаваемые контроллерам АТА-дисков. В функции, которая сообщает параметры диска (функция 8), производится обратная трансляция, так что на стороне вызова программного интерфейса Int 13h присутствуют только логические параметры. Естественно, логический объем диска не может превышать физического: (С х Н х 5)лог <=(С х Н х 8)физ.
Традиционно дисковый сервис подразделяет физические диски на дискеты (diskette, номера 0-7Fh) и фиксированные диски (fixed disk, номера 80h-FFh). Набор функций для этих классов устройств несколько различается как по составу, так и по реализации (выполняются разными модулями). Контроллеры дисковых интерфейсов, имеющие в своем составе дополнительные модули BIOS, перехватывают вектор Int 13h, беря на себя обслуживание своих устройств. Помимо функций дискового сервиса (Int 13h) с дисковыми устройствами связаны еще и векторы, обслуживающие аппаратные прерывания от контроллера НГМД — Int OEh (линия IRQ б) и от контроллера жестких дисков — Int 76h (линия IRQ 14). При наличии двухканального порта АТА второй канал обычно задействует линию IRQ 15 (вектор 77h). В XT контроллер жестких дисков занимал линию IRQ 5 (вектор ODh). Дополнительные контроллеры дисков могут использовать и другие прерывания. Аппаратные прерывания вырабатываются контроллерами по завершении (нормальном и аварийном) внутренних операций. На эти прерывания BIOS не реагирует, а при инициализации их векторы направляются на программную заглушку (инструкцию IRET).
Традиционные сервисы пользуются таблицами параметров: таблица параметров дискет (Diskette Parameter Table, DPT) задается указателем в памяти по адресу 0:78h, таблица параметров жестких дисков (Hard Disk Parameter Table, HDPT) — по адресу 0:104h или 0:118h. Стандартная таблица HDPT морально устарела: она не позволяет различать физическую и логическую геометрию, зато в ней есть параметры предварительной компенсации записи и парковки, которые уже очень давно не используются. В расширенной версии BIOS, в которой реализована трансляция геометрии, таблица параметров имеет иной вид — в ней представлена и физическая, и логическая геометрия диска. Параметры жестких дисков заносятся в таблицы во время начального тестирования компьютера (во время теста POST). Они задаются утилитой CMOS Setup или определяются автоматически по фактически подключенным устройствам (в зависимости от настройки Setup). Таблицы параметров жестких дисков не позволяют описывать диски размером более 33,8 Гбайт, поскольку предел физической геометрии — это 65 536 х 16 х 63. Однако для современных ОС, оперирующих большими дисками, это не проблема — они попросту данными таблицами не пользуются, а работают в режиме LBA.
9
Традиционно все программы, записанные в микросхеме BIOS, можно разделить по выполнению следующих функций:
-
инициализация и начальное тестирование всех основных (стандартных) узлов компьютера — расположенных на системной плате, подключенных к шине IDE и вставленных в слоты расширения. Для этого используется программа POST (Power On Self Test), также записанная в микросхеме BIOS. Отметим, что "нестандартные" платы расширения, например старые интерфейсы сканеров не тестируются;
-
загрузка операционной системы с внешнего устройства — гибкого диска, винчестера, компакт-диска или ПЗУ сетевой карты. В самых первых персональных компьютерах был вариант, когда можно было загрузить интерпретатор языка Basic, который находился в дополнительной микросхеме ПЗУ;
-
обслуживание аппаратных прерываний, например, от клавиатуры и таймера, обработка программных прерываний BIOS, которые предназначены для управления обменом данными между операционной системой компьютера и подключенными к нему периферийными устройствами, выполнение базовых функций, например, вывод на экран монитора символов и работа с дисковыми устройствами;
-
настройка и конфигурирование узлов системной платы и устройств, подключенных к ней, что выполняется с помощью программы BIOS Setup.
Системная 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, перечислены ниже. Кроме них несколько векторов используются как указатели на различные структуры данных.
Внутренние прерывания:
-
Int 00h — деление на 0. Процессор автоматически вызывает это прерывание после выполнения команд DIV или IDIV, если результат операции деления (частное) не умещается в поле результата;
-
Int 01h — пошаговый режим. Если установлен флаг трассировки процессора (TF=1), CPU вызывает это прерывание после каждой команды. Отладчики, которые позволяют вам осуществлять пошаговое выполнение программы, используют это прерывание, чтобы перехватывать управление и выдавать регистры, память и т.п. Трассировка отключается (TF=0) при выполнении любой команды INT, так что само INT 01H выполняется не в пошаговом режиме. После выхода из прерывания (через IRET) все флаги восстанавливаются, так что следующая команда вновь вызовет пошаговое прерывание. Обычный способ начать трассировку - это поместить в стек слово, содержащее все нужные флаги (включая TF=1), поместить в стек требуемые значения CS и IP, а затем выполнить IRET, чтобы начать трассировку с указанного адреса;
-
Int 03h — точка прерывания. Вектор прерывания INT 03H используется отладчиками, чтобы перехватывать управление, когда программа достигает указанного пользователем адреса. Код операции для INT 03H занимает один байт (0ccH), так что им можно временно замещать начало любой команды, не боясь запортить следующую команду;
-
Int 04h — переполнение. Вектор INT 04H может использоваться как один из способов оптимизации программ, содержащих большое число арифметических операций. Выданная после любой арифметической операции, команда INTO осуществляет проверку на арифметическое переполнение, и, если флаг переполнения взведен (OF=1), вызывает прерывание INT 04H;
-
Int 06h — недопустимая команда 286+;
-
Int 07h — вызов отсутствующего NPU.
Аппаратные прерывания:
-
Int 02h — немаскируемое прерывание. Немаскируемое прерывание (NMI) - это единственное прерывание, не запрещаемое командой CLI. Поэтому его можно использовать в специальных случаях, которые требуют немедленного действия. Это прерывание спроектировано для обработки катастрофических ситуаций, таких как сбой питания. В системе, обеспечивающей целостность данных, NMI может, например, выводить образ памяти на диск с целью избежать потери данных. В стандартной системе PC BIOS, NMI аппаратно вызывается в случае "ошибки четности" памяти. Когда это происходит, PC зависает;
-
Int 08h — таймер 8253/8254. Это аппаратно генерируемое прерывание (IRQ 0) вызывается по каждому тику часов реального времени PC. Часы тикают каждые 55мс, или около 18.2 раз в секунду. Код ROM-BIOS для этого прерывания обновляет значение часов на 0:046 сек. этот код также выключает двигатели гибких дисков по истечении примерно двух секунд без операций ввода/вывода;
-
Int 09h — клавиатура. Это аппаратно генерируемое прерывание (IRQ 1) выполняется при каждом нажатии и отпускании клавиши. Код ROM-BIOS интерпретирует это, сохраняя значения в буфере клавиатуры по адресу 0:041e. Он также обрабатывает специальные случаи клавиш PrtSc и SysReq, и отслеживает состояние клавиш Shift и различных Lock;
-
Int 0Ah — IRQ2/9;
-
Int 0Bh — IRQ3;
-
Int 0Ch — IRQ4;
-
Int 0Dh — IRQ5;
-
Int 0Eh — IRQ6 — контроллер гибких дисков. Int 0Eh - это аппаратно генерируемое прерывание (IRQ 6), вызываемое контроллером флоппи-дисков. Код ROM-BIOS взводит бит 7 в переменной BIOS "seek_status" (0:043e), указывая, что запущена операция поиска на дискете. прерывание Int 13h использует этот флаг, чтобы определить, не требуется ли рекалибрация контроллера перед следующей операцией;
-
Int 0Fh — IRQ7;
-
Int 70h — CMOS-таймер;
-
Int 71h — 1RQ9 (перенаправлено на Int 0Ah);
-
Int 72h — IRQ10;
-
Int 73h — IRQ11;
-
Int 74h — IRQ12 (контроллер мыши PS/2);
-
Int 75h — IRQ13 — исключение сопроцессора;
-
Int 76h — IRQ14 — контроллер жестких дисков;
-
Int 77h — 1RQ15.
Функции ROM BIOS 16-битные сервисы:
-
Int 05h (F000:FF54h) - печать экрана. Int 05h, к ужасу фирмы Intel (которая считала его зарезервированным прерыванием), используется в PC для вызова программы ROM BIOS, печатающей экран. Это прерывание вызывается обработчиком прерывания INT 09H при распознавании клавиши PrtSc. Оно может также вызываться из программы, и вы можете перехватывать это прерывание, если хотите предоставить свою программу печати экрана.;
-
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);
• бит 0 — присутствие дисководов;
-
Int 12h — размер непрерывной памяти. INT 12H возвращает AX = число килобайт памяти в PC. Это то же значение, которое хранится в 0:413. Оно не включает переключаемую расширенную память (см. Спецификацию Expanded-памяти). Оно также не включает "extended-память" с адресами выше 1 мегабайта. См. функции EMM и INT 15H для PC, это значение берется из переключателей. Машины PCjr, XT и большинство им подобных выполняют просмотр памяти во время POST, чтобы определить объем памяти. AT считывает свою CMOS-память, чтобы определить объем RAM. Префикс программного сегмента (PSP) любой программы также содержит значение размера памяти; обращение к PSP:0002 - обычный способ определить, сколько памяти доступно программе. (DOS или иная управляющая программа может предоставить вашей программе не всю имеющуюся память);
-
Int 13h — дисковый сервис (блочный ввод-вывод). Этот сервис предоставляет прямой доступ адаптерам дискеты и твердого диска. Рекомендуется там, где это возможно, использовать INT 25H и INT 26H , чтобы предоставить драйверам устройств DOS выполнять всю низкоуровневую обработку. Разумеется, для таких операций, как форматирование диска или установка защиты от копирования, прерывание INT 13H может оказаться единственной альтернативой;
-
Int 14h — обслуживание СОМ-портов. Эти функции BIOS предоставляют доступ к двум портам RS-232. Начиная с 0:0400, хранятся базовые адреса до 4-х последовательных портов, однако POST проверяет и инициализирует лишь два первых порта;
-
Int 15h — АТ-функции (системный сервис, функции определяются значением АН/АХ):
• 00-0Зh — управление и обмен данными с кассетным магнитофоном (были когда-то и такие «стриммеры») на старых PC;
• 4fh — перехват клавиатуры;
• 53xxh — сервисы управления потреблением АРМ (Advanced Power Managient);
• 8300h — запуск таймера, устанавливающего флаг в заданной ячейке;
• 8301h — сброс того же таймера;
• 84h — джойстик;
• 86h — программируемая задержка;
• 87h — перемещение блока расширенной памяти;
• 88h — получение размера расширенной памяти;
• 89h — переключение в режим V86;
•C0h — получение системной конфигурации, при успешном выполнении (CF=0, AH=0) ES: BX указывает на таблицу данных конфигурации;
•80-82h, 85h, 90h, 91h — функции многозадачных ОС (BIOS устанавливает заглушки);
-
Int 16h — клавиатурный ввод-вывод. Это - интерфейс прикладного уровня с клавиатурой. Нажатия клавиш на самом деле обрабатываются асинхронно на заднем плане. Когда клавиша получена от клавиатуры, она обрабатывается прерыванием INT 09H и помещается в циклическую очередь;
-
Int 17h — обслуживание LPT-портов. Эти функции предоставляют доступ к портам параллельных принтеров (LPT1 и т.д.) адреса портов принтеров хранятся, начиная с 0:0408;
-
Int 18h — процедура восстановления при неудаче начальной загрузки (прежде - ROM-Basic). Этот вектор содержит точку входа для интерпретатора ROM-BASIC, который установлен только на зарегистрированных компьютерах IBM. Клоны (родственники) не имеют BASIC в ROM-памяти и должны использовать отдельную программу, обычно GWBASIC. Если ROM-BIOS не может найти диск для загрузки, он берет этот вектор. это делает возможным для внешнего модуля ROM-Scan изменить этот вектор так, чтобы он указывал на него, вызывая его при сбое или отсутствии дисков;
-
Int 19h — начальная загрузка (вызов процедуры Bootstrap). Этот вектор рассматривается после POST , чтобы попытаться загрузить и выполнить какой-либо код "начального вызова" на дискете или твердом диске. Данные в секторе 1 дорожки 0 головки 0 дисковода 0 для первого откликнувшегося диска (дискеты или твердого диска) загружаются по абсолютному адресу 0000:7c00, и управление передается по этому адресу. если опрос всех дисков неудачен, управление передается на прерывание INT 18H. На твердом диске, этот код в "корневом секторе" в действительности определяет активный раздел диска, а затем загружает и выполняет корневой сектор для этого раздела. Это передает управление активной операционной системе диска.
З а м е ч а н и е:
Вы можете использовать этот сервис, чтобы перезагрузить DOS после изменения каких-либо значений в Списке оборудования или иных переменных BIOS (не забудьте установить по адресу 0:0472 значение 1234H). После перезагрузки DOS примет во внимание все ваши изменения;
-
Int 1Ah — системное время, дата, будильник и 16-битные вызовы сервисов PCI. Этот сервис предоставляет доступ к системным часам. PC BIOS работает со "счетчиком тиков" - числом 55-мс интервалов, прошедших с момента включения или сброса PC. AT BIOS предоставляет также доступ к значениям часов реального времени, которые постоянно обновляются независимо от работы процессора и хранятся в CMOS-памяти компьютера AT;
-
Int 1Bh — обработчик нажатия клавиш Ctrl+Break. Этот вектор (0:006c) берется, когда BIOS распознает нажатие клавиши Ctrl-Break. INT 1bH первоначально указывает на IRET, но DOS устанавливает его на локальную программу, которая взводит внутренний флаг DOS. DOS время от времени проверяет этот флаг и действует в соответствии с действующим режимом обработки прерываний;
-
Int 1Ch — User Timer Interrupt. Этот вектор (0:0070) BIOS берет по каждому тику аппаратных часов (каждые 55 миллисекунд; приблизительно 18.2 раз в секунду). первоначально он указывает на IRET, но может быть изменен пользовательской программой, чтобы адресовать фоновую программу пользователя, базирующуюся на таймере. Поскольку программа INT 1cH выполняется во время низкоуровневого аппаратного прерывания, вы должны помнить, что система еще не сбросила контроллер прерываний и потому другие аппаратные прерывания, в том числе прерывание от клавиатуры, не будут происходить при работе INT 1cH (т.е. вы не получите ввода пользователя). Большинство popup-программ предпочитают перехватывать вектор INT 08H , вызывать первоначальный вектор, а затем уже выполнять операции, зависящие от времени, после того как BIOS закончит свою обслугу.
-
Int 33h — поддержка мыши;
-
Int 4Ah — обработчик будильника пользователя, установленного функцией BIOS Int lAh(6); прерывание вызывается асинхронно, так что при возврате из процедуры все регистры и флаги должны быть в том же состоянии, что и при входе; BIOS ставит заглушку (IRET);
-
Int 67h — EMS-функции.
Указатели на таблицы:
-
Int 1Dh — видеопараметры. Этот вектор (0:0074) указывает на совокупность видео параметров, используемых прерыванием INT 10H для установки регистров видеоконтроллера и некоторых значений данных BIOS при инициализации режима видео. Можно создать RAM-резидентную версию этой таблицы и модифицировать параметры, чтобы изменить работу некоторых экранных режимов. Например, таким способом команда DOS "Mode" сдвигает экран влево или вправо;
-
Int 1Eh — параметры дискет. Этот вектор (0:0078) указывает на таблицу параметров дискеты, которую сервисная служба BIOS INT 13H использует для различных операций с дискетами. В эту таблицу входят такие значения, как "head-settle time" и "step rate time", оказывающие огромное влияние на скорость операций ввода-вывода дискеты;
-
Int IFh — знакогенератор CGA. Этот вектор (0:007c) указывает на таблицу, определяющую изображения старших 128 символов (коды ASCII 128-255). Ее использует ROM-BIOS, когда выводит на экран символы в графическом (с битовой разверткой) режиме. При запуске системы этот указатель устанавливается на F000:0000, так что старшие 128 символов в графическом режиме выдаются как случайный "мусор". Команда DOS 3.x "GrafTabl" может использоваться для загрузки таблицы старших 128 символов и соответствующей переустановки данного вектора;
-
Int 41h — параметры HDD0;
-
Int 46h — параметры HDD1;
-
Int 43h — знакогенератор EGA.