Во-первых, следует понимать, что оборудование x86 имеет таблицу дескрипторов прерываний, которая находится в оперативной памяти. На исходном процессоре 8086 это было исправлено в ячейке памяти 0, первой ячейке памяти, но его можно перенести в более поздние и современные процессоры. BIOS изначально устанавливает это в ячейке памяти 0.
IDT - это список 32-битных указателей на подпрограммы в других местах памяти (которые могут быть ПЗУ или ОЗУ), пронумерованные от 0x00 до 0xFF.
В наши дни первые 32 из них зарезервированы для использования самого процессора. Например, общая ошибка защиты вызовет вызов подпрограммы, на которую указывает вектор 0x0D.
Любая подпрограмма, указанная в одном из этих векторов, может быть вызвана с помощью команды программного прерывания INT
. Таким образом, INT 0x0D
будет вызывать ту же процедуру, что и при вызове общей ошибки защиты.
BIOS эпохи DOS использует многие из них для представления стандартного интерфейса для вызовов BIOS. Некоторые из тех, которые BIOS традиционно использует, совпадают с тем, что использует процессор.
Сама DOS также использовала одно прерывание, 0x21
, чтобы позволить программам стандартный способ вызова функций DOS.
Теперь общеизвестное прерывание BIOS - 0x13
, что позволяет читать или записывать сектор на дисковое устройство.
Во время процесса загрузки область памяти ПЗУ сканируется и вызывается код инициализации любого ПЗУ. На устройствах ISA и PCI может отображаться ПЗУ, которое будет вызываться во время загрузки. ПЗУ устройств может изменять векторы, расширяя или заменяя функциональность BIOS. Карты RAID, предназначенные для работы с DOS и 9x версиями Windows, могут сделать это.
Процедура BIOS инициализирует видеодисплей и позволяет установить режим отображения. Очень часто у видеокарт есть ПЗУ, которое переопределяет это прерывание, чтобы позволить использовать видеокарту во время процесса загрузки BIOS (и DOS, если вы действительно этого хотите).
В конце концов, ничто не останавливает программу, которая инициализирует изменение этих векторов для расширения или замены функций BIOS. Когда некоторые BIOS не могли получить доступ к секторам жесткого диска через барьер 8 Гбайт, некоторые поставщики предоставили загрузочный диск с утилитой, подключенной к Int 0x13, в обход ограничения BIOS.
Так что все это было очень распространено, когда DOS была распространенной операционной системой. В наши дни BIOS, если он все еще существует (UEFI является его преемником), в значительной степени используется только для инициализации и экрана загрузки, а операционная система напрямую обращается к оборудованию - исключение составляют вещи, связанные с управлением питанием.