某些 PCIe 設備包含“PCI Expansion ROM”或“PCI Option ROM”,其中儲存用於初始化設備的程式。
現在假設我有一個 PCIe RAID 控制器,通常在 x86 機器上使用。現在,如果我將其插入 ARM 機器,PCIe 裝置會無法初始化嗎?換句話說,大多數 PCIe 裝置都是 x86 專用的嗎?
答案1
以下是 ARM 架構上 PCI 選項 ROM 的問題:
- ARM CPU 無法理解以 x86 組譯語言編寫的選項 ROM。
- 由 PC BIOS 執行的選項 ROM(此類 ROM 開頭
0x55AA
有幾個位元組用於校驗和和附加資訊)將假定 PC 架構低階細節,例如 VGA 硬體、Intel CPU I/O 連接埠等。 - 整個 BIOS 概念與 x86 CPU 和 PC 架構緊密結合,從未用於任何 ARM 系統。
現在 ...
UEFI(BIOS 的後繼者)旨在用於 x86 以外的 CPU。
上述問題的解決方案是EFI字節碼- 由 UEFI 中的執行時間解釋的字節碼,使程式碼獨立於 CPU。
使用 UEFI 的 ARM 系統相對較新(Surface RT 甚至可能是唯一的此類系統)。大多數 ARM 系統使用 CFE、U-Boot 或其他不像 PC BIOS 那樣運作的啟動韌體。
現在,如果我將其插入 ARM 機器,PCIe 裝置會無法初始化嗎?
除非 ARM 系統使用 UEFI,否則您甚至沒有機會。如果是這樣,您的系統可能會在啟動時掛起。 EBC 在引導 ROM 韌體中並未廣泛使用。
雖然啟動 ROM 不起作用,但稍後啟動的作業系統仍然可以識別並能夠正常使用硬體。
引導ROM有什麼作用?
舊的 UEFI 之前的 BIOS 透過 x86 中斷機制實作了 API。您的程式必須將各種 x86 暫存器設定為參數,然後發出 x86INT
指令。
INT
使 x86 CPU 在表中尋找位址,然後將控制權轉移給它(這稱為軟體中斷- 硬體可以透過與也連接到 CPU 的中斷控制器通訊來導致這種情況發生。
在處理選項 ROM 之前,BIOS 會將此表填入傳回 BIOS 並執行 API 函數的各個位址。
MS-DOS 廣泛使用表,依靠 BIOS 來實現其原始功能 -乙專用積體電路我輸入/氧輸出S系統。其他作業系統一旦獲得控制權就不再使用 BIOS 調用,而是使用自己的驅動程式和機制來驅動硬體。
由於該中斷表位於RAM中,因此可以對其進行修改。選項 ROM 可以「掛鉤」中斷表 - 將特定中斷的位址覆蓋到 ROM 中的某些內容 - 並使 BIOS API 呼叫首先轉到選項 ROM。
BIOS 使用的一個 BIOS API 呼叫是13h
- 該調用從磁碟設備讀取扇區。需要從硬碟載入磁區 0 才能啟動作業系統(甚至 MS-DOS)。
BIOS 知道如何與軟碟和 IDE 設備通信,但除此之外一無所知。 SCSI 卡將有一個可重寫或「掛鉤」的選項 ROM 13h
,因此可以從 SCSI 磁碟機啟動。如果作業系統是 MS-DOS,則 MS-DOS 可以與 SCSI 磁碟機一起使用,因為它將用於13h
磁碟操作。
網路啟動是另一種使用選項 ROM 的情況。
如果是這樣,是否可以設計驅動程式來解決這個問題?
是的,他們確實這麼做了。 BIOS 選項 ROM 實際上僅支援啟動作業系統和可選的配置選單(「按 Ctrl-A 進入 RAID 配置」來自選項 ROM,您可以在 BIOS 呼叫其初始化程式碼時看到它)。
IIRC 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/
它解釋瞭如何將AMD AARCH64 Gop驅動程式作為另一個代碼映像新增至PCI顯示卡OptionROM中,以使顯示卡在AArch64系統中啟動時運作。