c - procfs 如何输出/proc/iomem?

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

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

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

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

我查过的关于stackoverflow的问题:

最佳答案

  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显示如何将保留内存插入到 /proc/iomem 中的示例通过insert_resource() . 这个优秀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 .

关于c - procfs 如何输出/proc/iomem?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57965945/

相关文章:

c - 我想将左平衡二叉树的数组表示形式从 In-order 转换为 Level order representation :

c++ - 声明由指针指示的类型的变量

linux - Debian 8 -> Debian 9 中的 Vi 变化

linux - 从头开始创建简单的微型 ELF

linux - make modules_install 重启配置过程

c - 独立的 C 应用程序

将字符串中的值转换为 float 组

linux - 将输入数据组织为 3D 配置

linux - tar 文件未存档

Android内核在没有生根的情况下运行fanotify?