2

Некоторые устройства PCIe содержат "ПЗУ расширения PCI" или "Дополнительное ПЗУ PCI", в котором хранятся программы для инициализации устройств.

Допустим, у меня есть RAID-контроллер PCIe, который обычно используется на компьютерах с архитектурой x86. Теперь, если я подключу его к машине ARM, устройство PCIe не сможет инициализироваться? Другими словами, большинство устройств PCIe x86 специфичны?

2 ответа2

6

Вот проблемы с дополнительными ПЗУ 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.

1

Большинство устройств PCIe с встроенной микропрограммой имеют спецификацию x86.
Встроенное ПО предназначено для совместной работы с Intel-совместимой средой.

Есть устройства, сделанные для других архитектур. В основном GPU, хранилище / рейд и сетевые карты. Некоторые из них даже позволяют перепрошивке прошивки переходить с одной архитектуры на другую. Другие имеют двойную прошивку и могут переключаться между архитектурами по мере необходимости.
Я даже видел некоторые raid-контроллеры, которые могли быть загружены (во время загрузки из среды UEFI) с соответствующей прошивкой для архитектуры, в которой он был размещен.
Большинство из них класса дата-центров и очень дорогие. Обычный пользователь никогда не встретится в дикой природе.

Для устройств без встроенной прошивки (или лучше сказать: встроенная прошивка, которая не взаимодействует с хост-системой) возможно, что они работают в любой архитектуре, для которой есть драйверы.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .