我想在用户空间程序中编写一些内容,例如:从起始地址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禁用。

08-06 17:52
查看更多