一些 PCIe 设备包含“PCI 扩展 ROM”或“PCI 选项 ROM”,其中存储了初始化设备的程序。
现在假设我有一个 PCIe RAID 控制器,通常用于 x86 机器。现在,如果我将其插入 ARM 机器,PCIe 设备是否会初始化失败?换句话说,大多数 PCIe 设备都是 x86 专用的吗?
答案1
以下是 ARM 架构上 PCI 选项 ROM 的问题:
- 用 x86 汇编语言编写的选项 ROM 不能被 ARM CPU 理解。
- 由 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 实现其原始功能 -乙专用集成电路我输入/哦输出年代系统。其他操作系统一旦获得控制权,就不会使用 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 系统启动时工作。