Вот проблемы с дополнительными ПЗУ PCI для архитектуры ARM:
- Дополнительное ПЗУ, написанное на сборке x86, не будет понятно процессору ARM.
- Дополнительные ПЗУ, предназначенные для выполнения BIOS ПК (такие ПЗУ начинаются с
0x55AA
и имеют пару байтов для контрольной суммы и дополнительной информации), будут предполагать детали низкоуровневой архитектуры ПК, такие как оборудование VGA, порты ввода-вывода ЦП Intel и т.д.
- Вся концепция BIOS была тесно связана с архитектурой процессора и ПК x86 и никогда не использовалась ни для одной системы ARM.
Сейчас ...
UEFI, преемник BIOSes предназначен для использования на процессорах, отличных от x86.
Решением вышеуказанных проблем был байт-код EFI - байт-код, который будет интерпретироваться средой выполнения в UEFI, что делает код независимым от ЦП.
Системы ARM, использующие UEFI, являются относительно новыми (Surface RT может быть даже единственной такой системой). Большинство систем ARM используют CFE, U-Boot или другие загрузочные прошивки, которые не работают, как BIOS компьютера.
Теперь, если я подключу его к машине ARM, устройство PCIe не сможет инициализироваться?
У вас даже не было бы шансов, если бы система ARM не использовала UEFI. Если бы это было так, ваша система, вероятно, зависла бы при загрузке. EBC не широко используется в прошивке загрузочного ПЗУ.
Хотя загрузочное ПЗУ не будет работать, ОС, которая позднее загружается, все равно будет распознавать и будет в состоянии нормально использовать оборудование.
Что делает загрузочный диск?
Старый BIOS до UEFI реализовывал API через механизм прерываний x86. Ваша программа должна установить в качестве параметров различные регистры x86, а затем выполнить инструкцию x86 INT
.
INT
заставляет процессор x86 искать адрес в таблице, а затем передает ему управление (это называется программным прерыванием - аппаратное обеспечение может вызвать это, общаясь с контроллером прерывания, также подключенным к ЦПУ).
Перед обработкой дополнительных ПЗУ BIOS заполняет эту таблицу по разным адресам, которые возвращаются в BIOS и выполняют функции API.
MS-DOS использует таблицу широко, опираясь на BIOS для своей первоначальной функции - это Основныеоперации Я Nput /вывода utput S ystem. Другие операционные системы не используют вызовы BIOS, когда у них есть контроль, они используют свои собственные драйверы и механизмы для управления оборудованием.
Поскольку эта таблица прерываний находится в ОЗУ, ее можно изменить. Дополнительные ПЗУ могут "зацепиться" за таблицу прерываний - переписать адрес определенного прерывания на что-либо в ПЗУ - и сделать так, чтобы вызовы BIOS API сначала переходили в дополнительное ПЗУ.
Один вызов API BIOS, который использует сам BIOS, составляет 13h
- этот вызов считывает сектор с дискового устройства. Требуется загрузить сектор 0 с жесткого диска для загрузки ОС (даже MS-DOS).
BIOS знает, как общаться с дискетами и устройствами IDE, но больше ничего. Карта SCSI будет иметь дополнительное ПЗУ, которое будет перезаписывать или "перехватывать" 13h
- и это позволит загружаться с диска SCSI. Если операционная система MS-DOS, то MS-DOS может работать с диском SCSI, поскольку он будет использовать 13h
для операций с диском.
Загрузка по сети - это еще одна ситуация, когда используются дополнительные ПЗУ.
Если так, возможно ли, что драйверы могут быть разработаны, чтобы позаботиться об этом вместо этого?
Да, и они делают. Дополнительные ПЗУ BIOS действительно поддерживают только загрузку ОС и опциональное меню конфигурации («Нажмите Ctrl-A для входа в конфигурацию RAID» из Дополнительного ПЗУ, и вы видите его в тот момент, когда BIOS вызывает свой код инициализации).
IIRC Linux снова заботится о перечислении устройств и будет в значительной степени игнорировать информацию из BIOS x86
Windows тоже это делает. BIOS x86 (и реальный режим x86) зависали так же долго, как и для поддержки MS-DOS.