首页 > 解决方案 > procfs 如何输出 /proc/iomem?

问题描述

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

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

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

我研究过的关于stackoverflow的问题:

标签: clinuxlinux-kernellinux-device-driverprocfs

解决方案


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

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

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

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

推荐阅读