我曾在这个网站上研究过类似的问题(最后列出),但仍然觉得自己遗漏了几个要点,希望有人能在这里提供帮助:
proc文件系统的钩子将/proc/iomem inode连接到转储信息的函数?我找不到这个函数在proc中的位置。我在linux源代码树下为grep做了一个iomem,一无所获。所以也许这是一个procfs的问题.这个问题的答案可以帮助我找到下一个问题的答案。/proc/iomem有比我从dmesg或/sys/firmware/memmap中提取的BIOS E820信息更多的条目(这两个条目实际上是一致的)。例如,/sys/firmware/memmap似乎没有pci内存映射区域。驱动程序的init代码调用request_mem_region()并向映射中添加更多信息,因此应该有一个全局变量(所有资源的根?)还记得这个图表吗?关于堆栈溢出的问题,我已经研究过了:
发布于 2019-09-17 02:26:23
struct resource iomem_resource是您要寻找的东西,它是在kernel/resource.c (通过proc_create_seq_data())中定义和初始化的。在同一个文件中,实例struct seq_operations resource_op定义了当您(例如,从userland ) cat文件时会发生什么。iomem_resource是一个全局导出的符号,在整个内核(包括驱动程序)中都使用它来请求资源。您可以发现分散在devm_/request_resource()内核上的实例,这些实例根据固定设置或配置采用iomem_resource或其同级ioport_resource。采用配置的方法的例子有:( a)在嵌入式设置中流行的设备树;( b) E820或UEFI,可以在x86上找到更多。从问题中提出的b)开始,arch/x86/kernel/e820.c文件展示了如何通过insert_resource()将保留内存插入到/proc/iomem中的示例。这个优秀的链接提供了更多从BIOS请求内存映射细节的详细信息。
另一个用于设备驱动程序请求所需资源的替代序列(依赖于CONFIG_OF)是:
struct of_device_id。struct platform_device,它同时包含struct of_device_id和探测函数。因此,这个探测函数被调用。platform_get_resource(),从设备树读取reg属性。此属性定义特定设备的物理内存映射。devm_request_mem_region() (这只是对request_region()的调用)来实际分配资源并将其添加到/proc/iomem中。https://stackoverflow.com/questions/57965945
复制相似问题