procfs 如何输出 /proc/iomem?
How procfs outputs /proc/iomem?
我在这个网站上调查了类似的问题(列在最后),但仍然觉得遗漏了几点,希望有人能在这里提供帮助:
proc
文件系统中是否有挂钩将 /proc/iomem
inode
连接到转储信息的函数?我找不到这个函数在 proc fs 中的位置。我在 linux 源代码树 fs/proc
下为 iomem
做了一个 grep
,什么也没得到。所以也许这更像是一个 procfs
问题...这个问题的答案可能会帮助我挖掘下一个问题的答案..
/proc/iomem
的条目比我从dmesg
或/sys/firmware/memmap
提取的BIOS E820信息多(这两个其实是一致的)。例如,/sys/firmware/memmap
似乎没有 pci 内存映射区域。驱动程序的初始化代码调用 request_mem_region()
并向地图添加更多信息,所以某处应该有一个记住这张图的全局变量(所有资源的根?)?
我查过的关于Whosebug的问题:
- Expose information to /proc/iomem
- Content of /proc/iomem
struct resource iomem_resource
就是你要找的,它在kernel/resource.c
中定义和初始化(通过proc_create_seq_data()
)。在同一个文件中,实例 struct seq_operations resource_op
定义了当您 cat
来自 userland 的文件时发生的情况。
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
)是:
- Open Firmware API 正在遍历设备树,并找到匹配的驱动程序。例如通过
struct of_device_id
。
- 驱动程序定义了一个
struct platform_device
,其中包含 struct of_device_id
和一个探测函数。这个探测函数因此被调用。
- 在探测函数中,调用
platform_get_resource()
从设备树中读取 reg
属性。 属性 定义了特定设备的物理内存映射。
- 调用
devm_request_mem_region()
(这只是对request_region()
的调用)以实际分配资源并将其添加到/proc/iomem
。
我在这个网站上调查了类似的问题(列在最后),但仍然觉得遗漏了几点,希望有人能在这里提供帮助:
proc
文件系统中是否有挂钩将/proc/iomem
inode
连接到转储信息的函数?我找不到这个函数在 proc fs 中的位置。我在 linux 源代码树fs/proc
下为iomem
做了一个grep
,什么也没得到。所以也许这更像是一个procfs
问题...这个问题的答案可能会帮助我挖掘下一个问题的答案../proc/iomem
的条目比我从dmesg
或/sys/firmware/memmap
提取的BIOS E820信息多(这两个其实是一致的)。例如,/sys/firmware/memmap
似乎没有 pci 内存映射区域。驱动程序的初始化代码调用request_mem_region()
并向地图添加更多信息,所以某处应该有一个记住这张图的全局变量(所有资源的根?)?
我查过的关于Whosebug的问题:
- Expose information to /proc/iomem
- Content of /proc/iomem
struct resource iomem_resource
就是你要找的,它在kernel/resource.c
中定义和初始化(通过proc_create_seq_data()
)。在同一个文件中,实例struct seq_operations resource_op
定义了当您cat
来自 userland 的文件时发生的情况。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
)是:
- Open Firmware API 正在遍历设备树,并找到匹配的驱动程序。例如通过
struct of_device_id
。 - 驱动程序定义了一个
struct platform_device
,其中包含struct of_device_id
和一个探测函数。这个探测函数因此被调用。 - 在探测函数中,调用
platform_get_resource()
从设备树中读取reg
属性。 属性 定义了特定设备的物理内存映射。 - 调用
devm_request_mem_region()
(这只是对request_region()
的调用)以实际分配资源并将其添加到/proc/iomem
。