从[1]可以知道/dev/mem是一个可以从用户空间访问物理地址的工具,通过它可以访问所有的物理地址,并且可以使用mmap函数将物理地址空间映射到用户地址空间。
它是系统主存的一个映象(image),它用来检查系统或者给系统打补丁。在/dev/mem文件中的字节地址对应于系统中的物理地址。引用不存在的地址将会导致错误。
当只读或者只写位被设置时,检查和打补丁可能会造成不可预测的结果。从linux2.6.26开始,和某些平台相关,内核开始引入了一个选CONFIG_STRICT_DEVMEM,它限制了通过这个文件可以访问的内存区域。例如在X86平台上,不能访问RAM区域,只能访问内存映射的PCI区域。
/dev/kmem与/dev/mem是一样的,但是它访问的是内核的虚拟地址,而不是物理地址。从2.6.26开始,这个文件只有在CONFIG_DEVKMEM被选中时,才会被使能。/dev/port和/dev/mem是类似的,不过通过/dev/port可以访问IO。[2]
从[3]中提交的补丁的主要作用就是限制通过/dev/mem可以访问的地址区域:只有非内存(non-memory)区域可以被访问,除非在这个补丁中引入的选项被选中,才可以访问内存区域。
X server需要通过/dev/mem访问PCI区域,但是不需要访问内存;/dev/mem的文件权限和SELinux的权限仅仅让X server非常非常的强大。除了BIOS占用的内存区域外,没有合法的应用会使用真实的物理内存。其他使用/dev/mem的应用就是rootkit及其类似的工具。注意:通过/dev/mem mmap访问内存,已经不允许使用很长时间了,这是在2008年的文章。
想通过/dev/mem来查找内核BUG的话,可以使能配置选项。这个选项是CONFIG_PROMISC_DEVMEM,通过配置它就可以访问所有的物理地址,包括RAM,PCI映射区域,BIOS代码和数据。从它的帮助可以看到,如果我们不配置这个选项的话,仅仅只有BIOS代码和数据区域,PCI映射区域可以被访问。不过目前这个选项已经被取消了,所以如果想获得足够多的权限的话,就禁用CONFIG_STRICT_DEVMEM吧。
ref
1. https://lwn.net/Articles/147901/