我想在用户空间程序中编写一些内容,例如:从起始地址3
的物理地址0xF7F4900(260MB)
中写入值0x0
,而所有内核都位于0-240MB的范围内。
我该怎么做?有什么想法吗?
最好的祝福。
我以为使用mmap,但我认为它可以为我提供虚拟地址。
memfd = open("/dev/mem", O_RDWR);
map = mmap(0xF7F4900, sizeof(int), PROT_WRITE, MAP_SHARED, memfd, 0);
*map = 3;
最佳答案
将/dev/mem
视为文件,并写入该文件中的偏移量0xF7F4900
:
char value = 3;
int fd = open("/dev/mem", O_RDWR);
lseek(fd, 0xF7F4900, SEEK_SET);
write(fd, &value, 1);
close(fd);
如果要
mmap
,则同样适用。您不应尝试在过程中将其映射到0xF7F4900
,而是应将其映射到任意位置,如果从偏移量0进行映射,则应写入map[0xF7F4900]
;如果从页面边界map[0x900]
进行映射,则应写入0xF7F4000
。 。请注意,对
/dev/mem
的任意访问可能需要特殊的内核配置,并且完全被UEFI Secure boot禁用。