我正在使用 Buildroot 作为 linux 发行版在 RPi3 上构建程序,我需要写入给定的物理地址。我读过最好的方法是首先使用mmap
,然后获取您通常写入的虚拟地址。在我的例子中,测试程序必须在给定的地址写一个字符。
奇怪的是,当我从映射后的虚拟地址读取值时,第一次可以工作,但第二次,相同的地址没有指向任何东西。这是我的程序的一个片段:
...
int mem_fd = open("/dev/mem", O_RDWR | O_SYNC);
if (0 > mem_fd) {
fprintf(stderr, "Could not open memory!\n");
return -1;
}
map_base = mmap(NULL, page_size, PROT_READ | PROT_WRITE, MAP_SHARED, mem_fd, ATTEST_START & ~map_mask);
map_target = map_base + (ATTEST_START & map_mask);
*((unsigned char *) map_target) = (char) ((rand() % 25) + 65);
printf("After assignment %p, val is %c\n", map_target, *((unsigned char *) map_target)); // here I can read the value
printf("After assignment %p, val is %c\n", map_target, *((unsigned char *) map_target)); // here it is empty!!!
...
ATTEST_START
是注册的物理地址(register_phys_mem
在 OP-TEE 可信操作系统中使用 , )。如果您能告诉我为什么第二次阅读不起作用,以及我可以做些什么不同的事情来使它起作用,我将非常感激。谢谢!