/proc/io* 是如何填充的?

How is /proc/io* populated?

所以如果我理解正确的话,cat /proc/iomem 列出了映射到这个和那个设备寄存器的内存地址,ioports 也是如此。如果你拿起一些关于 Linux 设备驱动程序的书,它会说明一些关于 iomem 由调用 request_region() 或类似内容的驱动程序填充的内容。

但是设备驱动程序如何从一开始就知道硬件寄存器的位置呢?例如,对于大多数人来说,rtc0 似乎占据了 0070:0071 - Linux/the 设备驱动程序如何知道我系统的晶体管和电线已连接,以便恰好翻转这些位对应于读取来自 RTC 的信号?

If you pick up some book on Linux device drivers, it will state something about iomem being populated by the driver calling request_region() or something like that.

/proc/iomem中的信息来自调用request_mem_region().
的驱动程序 参见 Content of /proc/iomem

how does the device driver know where the hardware register is located

设备寄存器的地址通常由电路板(对于外部外围设备)或 SoC 设计人员(对于集成外围设备)指定,然后在电路板或 SoC 文档中传达。某些板(例如 PC ISA 适配器板)可能允许通过某些 DIP 开关指定地址。

设备驱动的编写者就可以
(a) 在驱动程序本身或板文件中硬编码设备地址,或者
(b) 使用某种总线配置方法(例如 PCI 配置 space)或
检索设备地址 (c) 使用(手写的)配置列表(例如设备树、FEX、ATAG)检索设备地址,或
(d) 尝试在运行时探测设备。

请注意,将系统配置和设备地址传送给设备驱动程序是一个长期存在的问题。
IBM PC 分配地址的方法随后被硬编码,最终导致了针对 x86 PC 的 plug and play 倡议。
每个 ARM 板的独特 Linux 内核构建问题导致该架构采用 Device Tree(来自 PowerPC)。