0

我正在使用 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 可信操作系统中使用 , )。如果您能告诉我为什么第二次阅读不起作用,以及我可以做些什么不同的事情来使它起作用,我将非常感激。谢谢!

4

0 回答 0