BIOS

Материал из SynapseOS wiki
Перейти к навигации Перейти к поиску

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

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

Также до BIOS можно "достучаться" используя v8086.

Функции 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 случайным образом создавали новые функции BIOS. Также возможно "подключить" любое из этих прерываний и вставить дополнительные функции, имитирующие функции BIOS. Ранние производители оборудования и программного обеспечения для ПК часто делали это. Таким образом, в итоге появились буквально тысячи функций BIOS (или имитаций). Список RBIL огромен и в основном заполнен функциями, которые работают только в сочетании с каким-либо полностью устаревшим компьютером, BIOS или частью аппаратного или программного обеспечения.

Общие функции 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 - частота повторения с клавиатуры

Примечания к использованию функций BIOS в ассемблере

Каждая функция BIOS (как описано в RBIL) имеет определенный набор регистров "результата". Предполагается, что помимо перечисленных регистров, функции BIOS должны идеально сохранять все остальные значения регистров. В ранних версиях Bochs (ниже 2.3) была небольшая проблема с этим. Нижние половины всех 32-битных расширенных регистров (т.е. EBX, ECX) были сохранены должным образом, но верхние слова некоторых регистров были удалены.


Сами функции BIOS никогда не должны давать сбоев. При любой ошибке они будут:


  • почти всегда устанавливается флаг переноса (тест с помощью JC),
  • иногда возвращает AH = 0x86 (неподдерживаемая функция),
  • иногда возвращает AH = 0x80 (недопустимая команда),
  • или (для серьезно глючащих BIOS) возврат без изменений.


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

BIOS в защищенном режиме

К сожалению, в защищенном режиме почти все функции BIOS становятся недоступными, и попытка вызвать их, тем не менее, приведет к исключениям или ненадежным ответам (из-за различного способа обработки значений сегмента). Однако некоторые более новые службы (такие как SMBios, PCI, PnP или VBE) предлагают интерфейс, совместимый с 32-битным защищенным режимом.


  • Вызовы BIOS могут использовать прерывания, что означает, что вам необходимо перенаправлять IRQ-запросы или возвращать PIC к его исходной конфигурации.
  • Вызовы BIOS могут обращаться к устройствам, которые вы уже настроили, в частности к PIT и PIC
  • Вызовы BIOS могут самостоятельно входить в защищенный режим для доступа к регистрам MMIO, что выходит за рамки виртуального режима 8086.
  • В реальном режиме у вас нет возможности управлять прерываниями, и ваши драйверы могут зависать из-за потери прерываний.
  • В реальном режиме вы не можете контролировать время, производительность и гарантии безопасности.

Единственное устройство, которое в основном не подвержено этим проблемам, - это Video BIOS, который обычно не поставляется в комплекте с вашей материнской платой и, следовательно, также не может полагаться на службы BIOS. Большинство современных операционных систем - как коммерческих, так и любительских - используют монитор или эмулятор v8086 для поддержки графических устройств без встроенного драйвера, поэтому многие BIOS были протестированы с такой настройкой.

BIOS в длительном режиме

Как и в защищенном режиме, функции BIOS недоступны и в длительном режиме. К сожалению, нет виртуального режима 8086, который пришел бы на помощь. Необходимо мгновенно переключиться в реальный режим или эмулировать центральный процессор и интерпретировать коды операций программным обеспечением. Всю необходимую информацию по последнему подходу можно найти в документации Intel и AMD.

Дополнительная информация из BIOS

Большая часть полезной информации, которую вы получаете из BIOS, поступает при вызове функций BIOS. Однако существует небольшое количество дополнительной информации, которую можно получить.

  • Некоторые результаты обнаружения / состояния BIOS хранятся в области данных BIOS.
  • Дополнительная информация хранится в чипе CMOS.

Ссылки