c - procfs 如何输出 /proc/iomem?
问题描述
我已经在这个网站上查看了类似的问题(列在最后),但仍然觉得遗漏了几点,希望有人可以在这里提供帮助:
proc
文件系统中是否有连接/proc/iomem
inode
到转储信息的函数的挂钩?我无法找到这个函数在 proc fs 中的位置。我grep
在linux源代码树下fs/proc
做了一个iomem
,一无所获。所以也许这更像是一个procfs
问题......这个问题的答案可能会帮助我挖掘下一个问题的答案....../proc/iomem
比我从中提取的 BIOS E820 信息具有更多的条目或dmesg
(/sys/firmware/memmap
这两个实际上彼此一致)。例如,/sys/firmware/memmap
似乎没有 pci 内存映射区域。驱动程序的初始化代码调用request_mem_region()
并添加更多信息到地图,所以某处应该有一个全局变量(所有资源的根?)记住这个图表?
我研究过的关于stackoverflow的问题:
解决方案
struct resource iomem_resource
是您要查找的内容,它在kernel/resource.c
(viaproc_create_seq_data()
) 中定义和初始化。在同一个文件中,实例struct seq_operations resource_op
定义了当您执行时会发生什么,例如cat
来自用户空间的文件。iomem_resource
是一个全局导出符号,在整个内核(包括驱动程序)中用于请求资源。您可以找到分散在内核中的实例,这些实例基于固定设置或基于配置采用devm_/request_resource()
其中一个iomem_resource
或其同级。ioport_resource
采用配置的方法示例是 a) 嵌入式设置中普遍存在的设备树,以及 b) E820 或 UEFI,在 x86 上可以找到更多。
从问题中提出的 b) 开始,该文件arch/x86/kernel/e820.c
显示了保留内存如何插入/proc/iomem
via的示例insert_resource()
。这个优秀的链接有更多关于从 BIOS 请求内存映射细节的动态细节。
CONFIG_OF
设备驱动程序如何请求所需资源的另一个替代顺序(依赖于)是:
- Open Firmware API 正在遍历设备树,并找到匹配的驱动程序。例如通过
struct of_device_id
. - 驱动程序定义了一个
struct platform_device
既包含 thestruct of_device_id
又包含一个 probe 函数的函数。因此调用了这个探测函数。 - 在探测函数内部,调用了从设备树
platform_get_resource()
中读取属性的调用。reg
此属性定义特定设备的物理内存映射。 - 调用
devm_request_mem_region()
(只是调用request_region()
)来实际分配资源并将其添加到/proc/iomem
.
推荐阅读
- mysql - 如何通过join sql查询多个匹配项
- java - Scala/Java 解析日期未知格式
- flask - Flask——简单的 LDAP 设置问题
- docker - 设置 Elastic Enterprise Search 和 App Search - Docker - ELK
- query-optimization - 如何解决 Keystone.js 中的“N+1”问题
- pdf - 使用 openssl 在 pdf 文档上使用自签名证书进行签名
- python - 使用 Keras 检索 ANN 输出层的线性叠加值存在问题
- mysql - Mysql如何为现有行创建递增ID
- javascript - JavaScript 未显示在命令中
- python-3.x - 将MongoDB的ObjectId作为字符串转换为时间戳的Python方法