因此,设备安排在x86设备总线上,并以某种方式具有独特的范围。 AFAIK,在过去,如果您使用DOS或某些实模式操作系统,您可以通过BIOS配置这些范围。设备也有常规地址。 This site show a Table - Common Hex Addresses。但Linux不使用BIOS。我无法相信这些地址已经硬编码到包括Linux在内的任何操作系统中了。现代Linux内核肯定必须以某种方式动态发现此地址总线上的设备以及地址范围。但是如何?!
答案 0 :(得分:2)
某些设备地址已定义,并且已定义"通过平台。其他是动态的(可编程的),这些通常在引导期间由固件设置。这取决于我们是在谈论系统设备还是附加外设。
大多数设备都是通过典型的PCI总线扫描找到的,其中每个设备通过PCI配置空间中的寄存器输出各种BAR。这些BAR(以及地址范围)由引导时的固件编程,可以指存储器或I / O端口地址。
设备发现的另一种方法是通过ACPI表。内核通过扫描指定的内存区域查找ACPI表来查找标记。这些表由引导时的固件构建。
有关OSdev.org的大量信息。
内核中有少量硬编码地址。您可以通过浏览arch / x86目录轻松查看这些内容。这些地址根本不会改变,因为它们是平台的一部分"定义" (我松散地使用那个词)。一些示例包括B8000处的文本模式VGA存储器和400处的BIOS数据区域。
Linux内核源代码:
arch/x86/pci/direct.c
- I / O端口CF8h
/ CFCh
访问PCI配置空间