一部の PCIe デバイスには、デバイスを初期化するためのプログラムを保存する「PCI 拡張 ROM」または「PCI オプション ROM」が含まれています。
さて、通常 x86 マシンで使用される PCIe RAID コントローラーがあるとします。これを ARM マシンに接続すると、PCIe デバイスの初期化に失敗するでしょうか? つまり、ほとんどの PCIe デバイスは x86 専用なのでしょうか?
答え1
ARM アーキテクチャ上の PCI オプション ROM に関する問題は次のとおりです。
- x86 アセンブリで記述されたオプション ROM は、ARM CPU では理解できません。
- PC BIOS によって実行されることを意図したオプション ROM (このような ROM は で始まり
0x55AA
、チェックサムと追加情報用の数バイトを持ちます) は、VGA ハードウェア、Intel CPU I/O ポートなどの PC アーキテクチャの低レベルの詳細を想定します。 - BIOS のコンセプト全体は x86 CPU と PC アーキテクチャに密接に結びついており、ARM システムでは使用されませんでした。
今 ...
UEFI は BIOS の後継であり、x86 以外の CPU で使用することを目的としています。
上記の問題に対する解決策はEFI バイトコード- UEFI のランタイムによって解釈され、コードを CPU から独立させるバイトコード。
UEFI を使用する ARM システムは比較的新しいものです (Surface RT が唯一のそのようなシステムである可能性もあります)。ほとんどの ARM システムは、PC BIOS のようには動作しない CFE、U-Boot、またはその他のブート ファームウェアを使用します。
さて、これを ARM マシンに接続すると、PCIe デバイスの初期化に失敗するでしょうか?
ARM システムが UEFI を使用していなければ、チャンスすらありません。もし使用していたら、システムはおそらく起動時にハングするでしょう。EBC はブート ROM ファームウェアでは広く使用されていません。
ブート ROM は動作しませんが、後で起動する OS は引き続きハードウェアを認識し、問題なく使用できます。
ブート ROM は何をするのですか?
UEFI 以前の古い BIOS は、x86 割り込みメカニズムを通じて API を実装していました。プログラムでは、さまざまな x86 レジスタをパラメータとして設定し、x86INT
命令を発行する必要がありました。
INT
x86 CPUがテーブル内のアドレスを検索し、制御をそこに移す(これをソフトウェア割り込み- ハードウェアは、CPU に接続されている割り込みコントローラと通信することによって、この現象を引き起こす可能性があります。
オプション ROM を処理する前に、BIOS はこのテーブルをさまざまなアドレスに設定し、BIOS に戻って API 機能を実行します。
MS-DOSはテーブルを広範囲に使用しており、その本来の機能はBIOSに依存しています。Bアシック私入力/お出力スシステム。他のオペレーティング システムでは、制御権を取得すると BIOS 呼び出しは使用されず、ハードウェアを駆動するための独自のドライバーとメカニズムが使用されます。
この割り込みテーブルは RAM 内にあるため、変更可能です。オプション ROM は割り込みテーブルに「フック」して、特定の割り込みのアドレスを ROM 内の何かに上書きし、BIOS API 呼び出しが最初にオプション ROM に送信されるようにします。
BIOS 自体が使用する BIOS API 呼び出しの 1 つは13h
、ディスク デバイスからセクターを読み取ります。OS (MS-DOS も含む) を起動するには、ハード ドライブからセクター 0 をロードする必要があります。
BIOS はフロッピーや IDE デバイスと通信する方法は知っていますが、それ以外は知りません。SCSI カードには、書き換えや「フック」を行うオプション ROM があり13h
、SCSI ドライブから起動できるようになります。オペレーティング システムが MS-DOS の場合、MS-DOS はディスク操作に使用するため、SCSI ドライブで動作できます13h
。
ネットワーク ブートもオプション ROM が使用される別の状況です。
もしそうなら、代わりにこれを処理するようにドライバーを設計することは可能でしょうか?
はい、サポートされています。BIOS オプション ROM は、実際には OS の起動とオプションの構成メニューのみをサポートしています (「Ctrl + A を押して RAID 構成に入ります」はオプション ROM からのもので、BIOS が初期化コードを呼び出す時点で表示されます)。
私の記憶が正しければ、Linuxはデバイスの列挙を再び処理し、x86 BIOSからの情報をほとんど無視するだろう。
Windows も同様です。x86 BIOS (および x86 リアル モード) は、MS-DOS サポートと同じくらい長い間存在し続けました。
答え2
オンボード ファームウェアを備えた PCIe デバイスのほとんどは x86 専用です。
オンボード ファームウェアは、Intel 互換環境で動作するように設計されています。
他のアーキテクチャ用に作られたデバイスもあります。主に GPU、ストレージ/RAID、ネットワーク カードです。これらの中には、ファームウェアをフラッシュして、あるアーキテクチャから別のアーキテクチャに変更できるものもあります。また、デュアル ファームウェアで、必要に応じてアーキテクチャを切り替えることができるものもあります。
配置されたアーキテクチャに適したファームウェアをロードできる RAID コントローラーも見たことがあります (UEFI 環境からの起動時に)。
これらのほとんどはデータ センター グレードで、非常に高価です。一般ユーザーが実際に目にすることはないものです。
オンボード ファームウェアのないデバイス (または、ホスト システムと対話しないオンボード ファームウェア) の場合、それらのデバイス用のドライバーがあるアーキテクチャであれば、どのようなアーキテクチャでも動作する可能性があります。
答え3
UEFI 仕様には、このようなマルチイメージ ROM の目的についての説明があります。
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/
AArch64 システムの起動時にグラフィック カードが動作するように、AMD AARCH64 Gop ドライバーを別のコード イメージとして PCI グラフィック カードの OptionROM に追加する方法について説明します。