【发布时间】:2012-05-07 06:07:27
【问题描述】:
如何获取 Linux 识别的所有物理设备的内存映射。我已经查看了 /proc/iomem 和 /proc/ioports。但是,我无法找到每个设备的内存映射。关于如何实现这一点的任何想法?
【问题讨论】:
标签: linux memory linux-kernel device
如何获取 Linux 识别的所有物理设备的内存映射。我已经查看了 /proc/iomem 和 /proc/ioports。但是,我无法找到每个设备的内存映射。关于如何实现这一点的任何想法?
【问题讨论】:
标签: linux memory linux-kernel device
这个问题已经很老了,但是我在尝试安装 Linux 时已经为这个问题苦苦挣扎了几天(仍然是新手)。
根据我收集到的信息,每个设备都通过它是块设备还是字符设备以及主要:次要编号来唯一标识。
在 /sys/dev, 文件夹中,每个块/字符设备都有符号链接,位于它们各自的文件夹中。这些是指向 /sys 文件夹中物理设备信息的链接。
/dev 文件夹中有并行的 block/char 文件夹,每个文件夹都有对应的符号链接。这些符号链接指向 /dev 文件夹中的实际设备文件。
所以如果你能得到一个设备的major:minor,你就可以将/dev 中的设备映射到/sys 中的设备。对于驱动器,您可以使用 lsblk 获取major:minor。
【讨论】:
您机器的外围设备寄存器位于何处?我相信以前的答案已经为您提供了宝贵的意见。 /proc/iomem 和 /proc/vmallocinfo 的组合为您提供了很多信息。请注意,使用vmalloc,您需要深入内核源代码以将函数名称与设备驱动程序相关联。
但真正的问题是您想确切知道什么?您需要这些信息的目的是什么?
在我看来,您正在尝试直接访问设备的物理内存,您应该依赖 ioctl、sysfs 或驱动程序提供的现有服务与设备“对话”。
不要忘记这一点:如果 Linux 没有向您显示您想要的信息,可能是因为您没有在寻找正确的信息,或者您正试图绕过现有的服务。从用户空间的角度来看,即应用程序,您永远不应该关心物理内存位置。
【讨论】:
据我所知,唯一通用的方法是/proc/iomem。这向您展示了哪些内存范围分配给了谁的内核视图。
如果您想了解更多详细信息,您需要查看每个单独的驱动程序。
您可能会从/proc/vmallocinfo 获得更多信息,因为ioremap() 使用vmalloc(尽管可能并非适用于所有架构)。
【讨论】:
当我记得我的内核编码时间正确时,iomem/ports 的输出只是列出了驱动程序在那里注册的内容。所以它更多的是每个驱动程序而不是每个设备的输出。
由于当今大多数设备都是 pci 设备,lspci -v 可能是您能得到的最好的,它显示了使用的内存和 io 端口。
【讨论】: