Почему чтение адреса ничего не возвращает при втором чтении? (используя mmap)

Я создаю программу на RPi3, используя Buildroot в качестве дистрибутива Linux, и мне нужно писать на заданный физический адрес. Я читал, что лучший подход - сначала использовать 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). Я был бы очень признателен, если бы вы сказали мне, почему второе чтение не работает и что я могу сделать по-другому, чтобы заставить его работать. Спасибо!

0 ответов

Другие вопросы по тегам