PCIe 设备是否设计用于多平台和架构?

Kon*_* Ho 2 pci-express

一些 PCIe 设备包含“PCI 扩展 ROM”或“PCI 选项 ROM”,用于存储初始化设备的程序。

现在假设我有一个 PCIe RAID 控制器,它通常用于 x86 机器上。现在,如果我将其插入 ARM 机器,PCIe 设备会无法初始化吗?换句话说,大多数 PCIe 设备是否特定于 x86?

Law*_*ceC 6

以下是 ARM 架构上 PCI 选项 ROM 的问题:

  • ARM CPU 无法理解用 x86 程序集编写的选项 ROM。
  • 打算由 PC BIOS 执行的选项 ROM(此类 ROM0x55AA以校验和和附加信息开头并有几个字节)将假定 PC 架构的低级细节,例如 VGA 硬件、Intel CPU I/O 端口等。
  • 整个 BIOS 概念与 x86 CPU 和 PC 架构紧密结合,从未用于任何 ARM 系统。

现在 ...

  • UEFI,BIOSes 后继者旨在用于 x86 以外的 CPU。

  • 上述问题的解决方案是EFI 字节码——一种将由 UEFI 中的运行时解释的字节码,使代码独立于 CPU。

  • 使用 UEFI 的 ARM 系统相对较新(Surface RT 甚至可能是唯一的此类系统)。大多数 ARM 系统使用 CFE、U-Boot 或其他不像 PC BIOS 那样工作的引导固件。

现在,如果我将其插入 ARM 机器,PCIe 设备会无法初始化吗?

除非 ARM 系统使用 UEFI,否则您甚至没有机会。如果是这样,您的系统可能会在启动时挂起。EBC 并未广泛用于引导 ROM 固件。

虽然启动 ROM 不起作用,但稍后启动的操作系统仍然可以识别并能够很好地使用硬件。


引导 ROM 有什么作用?

旧的 pre-UEFI BIOS 通过 x86 中断机制实现了一个 API。您的程序必须将各种 x86 寄存器设置为参数,然后发出 x86INT指令。

INT导致 x86 CPU 在表中查找地址,然后将控制转移给它(这称为软件中断- 硬件可以通过与也连接到 CPU 的中断控制器通信来导致这种情况发生)。

在处理选项 ROM 之前,BIOS 将此表填充到返回 BIOS 并执行 API 功能的各种地址。

MS-DOS使用表广泛地,依靠BIOS用于其原来的功能-一ASICNPUT / ö安输出小号ystem。其他操作系统一旦拥有控制权就不再使用 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 一样。