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