# BIOS
# Основная информация
BIOS (Базовая система ввода-вывода) была создана для предоставления общих низкоуровневых функций ранним программистам компьютерных систем. Основными целями были: скрыть (насколько это возможно) различия в моделях ПК и аппаратном обеспечении от ОС и приложений, а также упростить разработку ОС и приложений (поскольку службы BIOS обрабатывали большую часть интерфейса аппаратного уровня).
Эти службы BIOS все еще используются (особенно во время загрузки) и часто называются "функциями BIOS". В Real mode к ним можно легко получить доступ с помощью программных прерываний, используя язык ассемблер.
# Функции BIOS
Чтобы получить доступ к функции BIOS, вы обычно устанавливаете регистр процессора AH (или AX, или EAX) на определенное значение, а затем выполняете код операции INT. Значение в AH (или AX, или EAX) в сочетании с конкретным номером прерывания, выбранным для конкретной функции BIOS. (Другие регистры процессора содержат любые "аргументы" функции, а также часто возвращаемые значения функции.)
Проще всего создать список функций BIOS, указав номер прерывания и значение AH (или AX, или EAX), которое выбирает функцию. Также проще всего ссылаться на конкретные функции BIOS таким образом в обсуждениях. Например, INT 0x13, AH=0 - это функция BIOS, которая сбрасывает жесткие диски или дискеты.
Примечание: значения INT и AH всегда указаны в шестнадцатеричной системе счисления. Случайное использование десятичного значения в коде операции INT является очень распространенным источником ошибок при использовании функций BIOS.
В какой-то степени функции BIOS организованы по номеру прерывания:
- INT 0x10 = Функции отображения видео (включая VESA/VBE)
- INT 0x13 = доступ к хранилищу данных (жёсткие диски, дискеты)
- INT 0x15 = функции размера памяти
- INT 0x16 = функции клавиатуры
Исчерпывающий список функций BIOS доступен в RBIL.
К сожалению, индустрия ПК никогда не была хороша в поддержании стандартов. Таким образом, каждый производитель ПК и каждый производитель BIOS случайным образом создавали новые функции BIOS. Также можно "зацепить" любое из этих прерываний и вставить дополнительные функции, имитирующие функции BIOS. Ранние производители оборудования и программного обеспечения для ПК часто делали это. Таким образом, в итоге появились буквально тысячи функций BIOS (или имитаций). Список RBIL огромен и в основном заполнен функциями, которые работают только в сочетании с каким-либо полностью устаревшим компьютером, BIOS, аппаратным или программным обеспечением.
# Основные функции
К сожалению, RBIL четко не указывает, какие функции BIOS являются "общими" (в некотором смысле). То есть те, которые всегда доступны и которыми пользуются все. Частично это связано с тем, что "стандартные" функции BIOS росли с течением времени, поэтому, если вы вернетесь достаточно далеко назад, вы обычно можете найти компьютер, который не поддерживает почти никаких конкретных функций BIOS.
Но определенно есть набор, который обычно используется в большинстве современных ОС.
- INT 0x10, AH = 1 -- установить курсор
- INT 0x10, AH = 3 -- позиция курсора
- INT 0x10, AH = 0xE -- отобразить символ
- INT 0x10, AH = 0xF -- получить страницу видео и режим
- INT 0x10, AH = 0x11 -- установить шрифт 8x8
- INT 0x10, AH = 0x12 -- определить EGA/VGA
- INT 0x10, AH = 0x13 -- отобразить строку
- INT 0x10, AH = 0x1200 -- альтернативный экран ввода
- INT 0x10, AH = 0x1201 -- отключить эмуляцию курсора
- INT 0x10, AX = 0x4F00 -- размер видеопамяти
- INT 0x10, AX = 0x4F01 -- VESA получить информацию о режиме
- INT 0x10, AX = 0x4F02 -- выбрать видеорежимы VESA
- INT 0x10, AX = 0x4F0A -- VESA 2.0 интерфейс защищённого режима
- INT 0x11 -- определение железа
- INT 0x13, AH = 0 -- сброс дискеты/жёсткого диска
- INT 0x13, AH = 2 -- чтение дискеты/жёсткого диска в режиме CHS
- INT 0x13, AH = 3 -- записать на дискету/жёсткий диск в режиме CHS
- INT 0x13, AH = 0x15 -- определить второй диск
- INT 0x13, AH = 0x41 -- проверьте наличие расширений INT 13
- INT 0x13, AH = 0x42 -- чтение жесткого диска в режиме LBA
- INT 0x13, AH = 0x43 -- запись на жесткий диск в режиме LBA
- INT 0x12 -- получите низкий объем памяти
- INT 0x15, EAX = 0xE820 -- получить полную карту памяти
- INT 0x15, AX = 0xE801 -- получить непрерывный размер памяти
- INT 0x15, AX = 0xE881 -- получить непрерывный размер памяти
- INT 0x15, AH = 0x88 -- получить непрерывный размер памяти
- INT 0x15, AH = 0xC0 -- обнаружение шины MCA
- INT 0x15, AX = 0x0530 -- обнаружение APM BIOS
- INT 0x15, AH = 0x5300 -- обнаружение APM
- INT 0x15, AX = 0x5303 -- подключение APM с использованием 32-бит
- INT 0x15, AX = 0x5304 -- отключение APM
- INT 0x16, AH = 0 -- считывание кода клавиатуры (с блокировкой)
- INT 0x16, AH = 1 -- считывание кода клавиатуры (без блокировки)
- INT 0x16, AH = 3 -- частота повторения кода клавиатуры
# Заметки ASM
Каждая функция BIOS (как описано в RBIL) имеет определенный набор регистров "результата". Помимо перечисленных регистров, функции BIOS должны идеально сохранять все остальные значения регистров. Ранние версии Bochs (ниже 2.3) имели небольшую проблему с этим. Нижние половины всех 32-битных расширенных регистров (т.е. EBX, ECX) были сохранены должным образом, но верхние слова некоторых регистров были уничтожены.
Сами функции BIOS никогда не должны сбоить. При любой ошибке они будут:
- почти всегда устанавливать флаг переноса (тест с помощью JC),
- иногда возвращать "ah = 0x86 (неподдерживаемая функция)",
- иногда возвращать "ah = 0x80 (недопустимая команда)"
- или (у серьёзно глючных BIOS) возвращать ничего.
Старайтесь всегда проверять эти возвращаемые ошибки, потому что во многих случаях функции BIOS могут возвращать действительные (но очень неправильные) данные, а не код ошибки.
# BIOS в защищённом режиме (Protected Mode)
К сожалению, в защищенном режиме почти все функции BIOS становятся недоступными, и попытка вызвать их, тем не менее, приведет к исключениям или неправильным ответам (из-за другого способа обработки значений сегментов). Однако некоторые новые сервисы (такие как SMBIOS, PCI, PnP или VBE) предлагают интерфейс, совместимый с 32-битным защищенным режимом.
Если вам необходимо использовать функции BIOS в Real Mode после переключения процессора в защищенный режим, см. раздел Virtual 8086 Mode или, возможно, выйдите из Защищенного режима и на мгновение вернитесь в Real Mode. Оба метода имеют серьезные проблемы, и поэтому любые вызовы BIOS должны выполняться до того, как какое-либо физическое устройство будет запрограммировано вашим кодом:
- Вызовы BIOS могут использовать прерывания, что означает, что вам необходимо перенаправить IRQ или сопоставить PIC обратно в исходную конфигурацию.
- Вызовы BIOS могут обращаться к устройствам, которые вы уже настроили - в частности, вызовы PIT и PIC
- BIOS могут самостоятельно входить в защищенный режим для доступа к регистрам MMIO, что выходит за рамки Virtual 8086 Mode.
- В реальном режиме (Real Mode) у вас нет возможности управлять прерываниями, и ваши драйверы могут застрять из-за потери прерываний.
- В реальном режиме вы не контролируете время, производительность и гарантии безопасности.
Единственное устройство, которое в основном освобождено от этих проблем, - это видеокарта BIOS, которая обычно не входит в комплект вашей материнской платы и поэтому также не может полагаться на службы BIOS. Большинство современных операционных систем - как коммерческих, так и любительских - используют монитор или эмулятор v8086 для поддержки графических устройств без встроенного драйвера.
# BIOS в длинном режиме (Long Mode)
Как и в защищенном режиме, функции BIOS недоступны и в длительном режиме. К сожалению, нет виртуального режима 8086 (Virtual 8086 Mode), который пришел бы на помощь. Необходимо на мгновение переключиться в реальный режим или эмулировать процессор и интерпретировать коды операций с помощью программного обеспечения. Всю необходимую информацию для последнего подхода можно найти в документации Intel и AMD.
# Дополнительная информация из BIOS
Большая часть полезной информации, которую вы получите из BIOS, будет получена при вызове функций BIOS. Однако существует небольшое количество дополнительной информации, которую можно получить.
Некоторые результаты обнаружения/состояния BIOS хранятся в области данных BIOS.
Дополнительная информация хранится в CMOS-чипе.