Linux 如何在启动时在 x86 IO 地址总线上找到设备?

How does Linux find devices on x86 IO address bus at boot?

所以设备以某种方式排列在 x86 设备总线上,具有独特的范围。 AFAIK,在过去,如果您使用 DOS 或某些实模式 OS,您可以通过 BIOS 配置这些范围。设备也有常规地址。 This site show a Table - Common Hex Addresses。但是 Linux 不使用 BIOS。我无法相信这些地址已被硬编码到任何 OS 中,包括 Linux。现代 Linux 内核肯定必须以某种方式动态发现此地址总线上的设备和地址范围。但是怎么办?!

一些设备地址是固定的,由平台“定义”。其他是动态的(可编程的),这些通常在引导期间由固件设置。这取决于我们是在谈论系统设备还是附加外围设备。

大多数设备都是通过典型的 PCI 总线扫描找到的,其中每个设备都通过 PCI 配置中的寄存器导出其各种 BAR space。这些 BAR(以及地址范围)由固件在启动时编程,可以引用内存或 I/O 端口地址。

另一种设备发现方式是通过 ACPI 表。内核通过扫描规定的内存区域寻找标记来找到 ACPI 表。这些表由固件在启动时构建。

关于 OSdev.org 的信息很多。

内核中有少量硬编码地址。您可以通过浏览 arch/x86 目录轻松查找这些内容。这些地址根本不会改变,因为它们是平台“定义”的一部分(我随意使用这个词)。几个例子包括 B8000 处的文本模式 VGA 内存和 400 处的 BIOS 数据区。

Linux内核源代码: