mmap 未按预期工作(return 随机 0xdeadbeef)

mmap does not work as expected (return random 0xdeadbeef)

我在linux7arm上写c++,当我映射物理地址space的页面到本地时,物理地址指的是一个内存块(可以被其他外设accessed/changed)地址 space 并尝试读取它,它工作正常并显示预期的数据,但并非一直如此。如果我在一个循环中为 运行 我编译的 c 程序编写一个脚本,然后只打印出数据,它会随机打印 0xdeadbeef。这可能与物理内存有关还是我的代码有问题!

int page_size = sysconf(_SC_PAGE_SIZE);

if ((mem_file = open("/dev/mem", O_RDWR|O_SYNC)) < 0) {
    close(mem_file);
    printf("Error : Unable to open /dev/mem\n");
}
local_address = mmap(
                 NULL,
                 page_size,  // length of the mapped mem
                 PROT_READ,
                 MAP_SHARED,
                 mem_file,
                 (uint32_t)page_address   // starting physical address
                        );

volatile char * start_address=(char *)local_address;
printf("\n");
for(i=0;i<page_size;i++) {
    printf("%x",*(start_address+i)); 
{
printf("\n");
munmap . . . 

您的代码有两个可能的问题:

  1. 您需要检查 mmap 的 return 值以防失败。
  2. 您假设与 CPU 共享内存的外围设备是与之一致的数据缓存。这是可能的,但不太可能。如果不是,您一定会看到过时的数据。

话虽如此,我怀疑您所看到的是否与这两个问题有关,并且怀疑内存值 0xdeadbeef 是糟糕的 RTL 设计器指示访问内存时出现错误的方式。