procfs 如何输出 /proc/iomem?

How procfs outputs /proc/iomem?

我在这个网站上调查了类似的问题(列在最后),但仍然觉得遗漏了几点,希望有人能在这里提供帮助:

  1. proc 文件系统中是否有挂钩将 /proc/iomem inode 连接到转储信息的函数?我找不到这个函数在 proc fs 中的位置。我在 linux 源代码树 fs/proc 下为 iomem 做了一个 grep,什么也没得到。所以也许这更像是一个 procfs 问题...这个问题的答案可能会帮助我挖掘下一个问题的答案..

  2. /proc/iomem的条目比我从dmesg/sys/firmware/memmap提取的BIOS E820信息多(这两个其实是一致的)。例如,/sys/firmware/memmap 似乎没有 pci 内存映射区域。驱动程序的初始化代码调用 request_mem_region() 并向地图添加更多信息,所以某处应该有一个记住这张图的全局变量(所有资源的根?)?

我查过的关于Whosebug的问题:

  1. struct resource iomem_resource就是你要找的,它在kernel/resource.c中定义和初始化(通过proc_create_seq_data())。在同一个文件中,实例 struct seq_operations resource_op 定义了当您 cat 来自 userland 的文件时发生的情况。
  2. iomem_resource 是全局导出的符号,在整个内核(包括驱动程序)中用于请求资源。您可以找到分散在 devm_/request_resource() 内核中的实例,这些实例基于固定设置或基于配置采用 iomem_resource 或其兄弟 ioport_resource。采用配置的方法示例是 a) 在嵌入式设置中普遍存在的设备树,以及 b) E820 或 UEFI,它们在 x86 上可以找到更多。

从问题中提出的 b) 开始,文件 arch/x86/kernel/e820.c 显示了保留内存如何通过 insert_resource() 插入到 /proc/iomem 的示例。 这个优秀的 link 有更多关于从 BIOS 请求内存映射详细信息的动态的详细信息。

关于设备驱动程序如何请求所需资源的另一个替代序列(依赖于 CONFIG_OF)是:

  1. Open Firmware API 正在遍历设备树,并找到匹配的驱动程序。例如通过 struct of_device_id
  2. 驱动程序定义了一个 struct platform_device,其中包含 struct of_device_id 和一个探测函数。这个探测函数因此被调用。
  3. 在探测函数中,调用 platform_get_resource() 从设备树中读取 reg 属性。 属性 定义了特定设备的物理内存映射。
  4. 调用devm_request_mem_region()(这只是对request_region()的调用)以实际分配资源并将其添加到/proc/iomem