Предназначены ли устройства PCIe для использования в многоплатформенных архитектурах?

Предназначены ли устройства PCIe для использования в многоплатформенных архитектурах?

Некоторые устройства PCIe содержат «PCI Expansion ROM» или «PCI Option ROM», в которых хранятся программы для инициализации устройств.

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

решение1

Вот проблемы с дополнительными ПЗУ PCI на архитектуре ARM:

  • Дополнительное ПЗУ, написанное на ассемблере x86, не будет понято процессором ARM.
  • Дополнительные ПЗУ, предназначенные для выполнения BIOS ПК (такие ПЗУ начинаются с 0x55AAи содержат несколько байтов для контрольной суммы и дополнительной информации), будут предполагать низкоуровневые детали архитектуры ПК, такие как аппаратное обеспечение VGA, порты ввода-вывода процессора Intel и т. д.
  • Вся концепция BIOS была тесно связана с архитектурой процессора и ПК x86 и никогда не использовалась ни в одной системе ARM.

Сейчас ...

  • UEFI, преемник BIOS, предназначен для использования на процессорах, отличных от x86.

  • Решение вышеуказанных проблем былоБайт-код EFI- байт-код, который будет интерпретироваться средой выполнения в UEFI, что сделает код независимым от ЦП.

  • Системы ARM, использующие UEFI, относительно новы (Surface RT, возможно, единственная такая система). Большинство систем ARM используют CFE, U-Boot или другие загрузочные прошивки, которые не работают как BIOS ПК.

А если я подключу его к компьютеру ARM, не получится ли инициализировать устройство PCIe?

У вас не было бы даже шанса, если бы система ARM не использовала UEFI. Если бы это было так, ваша система, вероятно, зависла бы при загрузке. EBC не так широко используется в прошивках загрузочного ПЗУ.

Хотя загрузочное ПЗУ работать не будет, операционная система, которая загрузится позже, все равно распознает и сможет нормально использовать оборудование.


Что делает загрузочное ПЗУ?

Старый BIOS до UEFI реализовал API через механизм прерываний x86. Ваша программа должна была бы установить различные регистры x86 в качестве параметров, а затем выдать INTинструкцию x86.

INTзаставляет процессор x86 искать адрес в таблице, а затем передает ему управление (это называетсяпрограммное прерывание- аппаратное обеспечение может вызвать это, обратившись к контроллеру прерываний, также подключенному к ЦП).

Перед обработкой дополнительных ПЗУ BIOS заполняет эту таблицу различными адресами, которые возвращаются в BIOS и выполняют функции API.

MS-DOS широко использует таблицу, полагаясь на BIOS для ее первоначальной функции -Басикявход/ОвыходСystem. Другие операционные системы не используют вызовы BIOS, получив управление, они используют собственные драйверы и механизмы для управления оборудованием.

Так как эта таблица прерываний находится в ОЗУ, ее можно изменять. Дополнительные ПЗУ могут «подключаться» к таблице прерываний — перезаписывать адрес определенного прерывания на что-то в ПЗУ — и делать так, чтобы вызовы API BIOS сначала направлялись в дополнительное ПЗУ.

Один вызов 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 снова берет на себя перечисление устройств и будет в значительной степени игнорировать информацию из x86 BIOS

Windows делает то же самое. x86 BIOS (и x86 реальный режим) существовали столько же, сколько и поддержка MS-DOS.

решение2

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

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

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

решение3

OptionROM может иметь несколько образов кода Расширение ПЗУ

Спецификация UEFI содержит некоторые пояснения относительно назначения такого многообразного ПЗУ:

The following is a list of the image combinations that may be placed in a PCI option
ROM. This is not an exhaustive list. Instead, it provides what will likely be the most common PCI option
ROM layouts. EFI complaint system firmware must work with all of these PCI option ROM layouts, plus
any other layouts that are possible within the PCI Firmware Specification. The format of a Legacy Option
ROM image is defined in the PCI Firmware Specification.
• Legacy Option ROM image
• IA-32 UEFI driver
• x64 UEFI driver
• AArch32 UEFI driver
• AArch64 UEFI driver
• Legacy Option ROM image + x64 UEFI driver
• Legacy Option ROM image + x64 UEFI driver + AArch64 UEFI driver
• x64 UEFI driver + AArch64 UEFI driver
• Itanium Processor Family UEFI driver
• EBC Driver
In addition to combinations of UEFI drivers with different processor binding, it is also possible to include
multiple drivers of different function but the same processor binding.

(https://uefi.org/sites/default/files/resources/UEFI_Spec_2_8_final.pdf)

Итак, как вы видите, OptionROM может иметь образы для разных архитектур. Например, устройство PCI может иметь образы кода как для ARM, так и для x86.

Системная прошивка может анализировать структуры заголовков образов кода в поисках правильного типа машины.

Тип аппарата

Но хотя это поле определено в edk2: https://github.com/tianocore/edk2/blob/0ecdcb6142037dd1cdd08660a2349960bcf0270a/MdePkg/Include/IndustryStandard/Pci22.h#L845 похоже, что он на самом деле не используется: https://github.com/tianocore/edk2/blob/master/MdeModulePkg/Bus/Pci/PciBusDxe/PciOptionRomSupport.c

Обновлять:

Ознакомьтесь с этим руководствомhttps://www.workofard.com/2020/12/aarch64-option-roms-for-amd-gpus/

В нем объясняется, как добавить драйвер AMD AARCH64 Gop в качестве еще одного образа кода в OptionROM графической карты PCI, чтобы графическая карта работала во время загрузки в системах AArch64.

Связанный контент