Почему чтение адреса ничего не возвращает при втором чтении? (используя 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). Я был бы очень признателен, если бы вы сказали мне, почему второе чтение не работает и что я могу сделать по-другому, чтобы заставить его работать. Спасибо!