Pav*_*ath 19 linux memory linux-kernel
我有一系列问题/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);
Run Code Online (Sandbox Code Playgroud)
Rol*_*and 14
是的,你是对的,/ dev/mem允许你映射任何物理地址,包括非RAM内存映射IO.这可以用于快速和脏的黑客访问某些硬件设备而无需编写内核驱动程序.
CONFIG_STRICT_DEVMEM使得位于/ dev/MEM内核检查地址与 devmem_is_allowed()中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.
Run Code Online (Sandbox Code Playgroud)
你的地址0xFFFF0000很可能是非RAM,因为BIOS通常会将IO内存放在4GB以下,这就是为什么你能用STRICT_DEVMEM映射它的原因.