【问题标题】:How procfs outputs /proc/iomem?procfs 如何输出 /proc/iomem?
【发布时间】:2019-09-17 00:39:49
【问题描述】:

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

  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() 并向地图添加更多信息,所以在某个地方应该有一个全局变量(所有资源的根?)记住这个图表?

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

【问题讨论】:

  • 好像在kernel/resource.c

标签: c linux linux-kernel linux-device-driver procfs


【解决方案1】:
  1. struct resource iomem_resource 是您要查找的内容,它在 kernel/resource.c 中定义和初始化(通过 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 显示了保留内存如何通过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

【讨论】:

  • OF 对于 x86 来说并不典型,而且,看看提到的 E820,我认为这是 OP 的情况。
  • @0andriy OF 是一个例子,这就是我所说的典型。 iomem_resource 变量——这是 OP 的第二个问题的答案——适用于使用 OF 或 e820 探测驱动程序。无论如何,我会修改答案以减少歧义。
  • 谢谢大家,这几乎解决了我所有的问题,除了这块 - 如果 E820 输出不包括 PCI mmap 区域,那么这意味着当内核接管时,pci mmap 还没有设置?如果是这样,那么 request_resource() 必须有一些设置主机桥寄存器的低级代码,以便将来 pci 设备请求的地址可以转发到 pci 桥。但是我在request_resource()中没有找到这段代码。
  • (太长,必须分成两个回复)另一个猜测是,在将控制权交给内核之前,BIOS 确实为所有可能的未来 pci 请求保留了巨大的空间,但它只是没有报告它通过E820,内核以其他方式将其挖掘出来?这样至少 request_resource() 不需要调整主机桥寄存器,因为设备只是从更大的区域内请求子区域,而更大的区域已经完全映射/转发到 pci 网桥。这有道理吗?
  • @QnA,PCI是self-discovery总线,你说的隐藏在drivers/pci/setup-res.c下.同样对于基于 PCI-ACPI 的平台,信息根据 PCI 固件规范通过 MCFG 表传播。
猜你喜欢
  • 2013-12-26
  • 2017-01-06
  • 2020-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-02
  • 1970-01-01
相关资源
最近更新 更多