我有一组关于/dev/mem
的问题:
网上的很多文章似乎都将/dev/mem
称为"Physical RAM"
的网关。但如果我是对的,/dev/mem
是处理器的"Physical Address Space"
的网关,可能包括许多硬件外设的控制寄存器,而不仅仅是RAM?如果我错了,请纠正我!
为了防止攻击者滥用/dev/mem
并更改内核内存,需要启用标记CONFIG_STRICT_DEVMEM
,这将阻止用户应用访问超过1MB的物理地址空间。我检查了我的PC(Ubuntu)上的配置文件,发现CONFIG_STRICT_DEVMEM = y
。我写了一个程序试图读取超过1 MB的物理内存,我能够阅读!没有分段错误或任何Operation NOT Permitted
错误。这怎么可能?
我的程序大致如下:
fd = open ( "/dev/mem", O_RDWR);
ptr = (int*) mmap(0, MAP_SIZE, PROT_READ, fd, myAddress & (~MAP_MASK));
printf("%d", *ptr);
答案 0 :(得分:13)
是的,你是对的,/ dev / mem允许你映射任何物理地址,包括非RAM内存映射IO。这可以用于快速而肮脏的黑客访问某些硬件设备而无需编写内核驱动程序。
CONFIG_STRICT_DEVMEM使核心检查{/ 1}}中devmem_is_allowed()
的/ dev / mem中的地址,并在那里解释说明:
arch/x86/mm/init.c
您的地址* On x86, access has to be given to the first megabyte of ram because that area
* contains bios code and data regions used by X and dosemu and similar apps.
* Access has to be given to non-kernel-ram areas as well, these contain the PCI
* mmio resources as well as potential bios/acpi data regions.
很可能是非RAM,因为BIOS通常会将IO内存放在4GB以下,这就是为什么即使使用STRICT_DEVMEM也可以映射它。
答案 1 :(得分:3)
以下产量是什么:
cat /dev/mem | wc
我明白了:
cat: /dev/mem: Operation not permitted
1908 11791 1048576
所以对我来说它确实停在1MB。
请注意,cat使用open而不是mmap,因此它不是一个完全相同的测试。
你确定你的阅读量超过1MB吗?