mmap无法按预期工作(返回随机0xdeadbeef)

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

本文关键字:返回 随机 0xdeadbeef 工作 mmap      更新时间:2023-10-16

我在linux7arm上编写c++,物理地址指的是一个内存块(可以由其他外围设备访问/更改)。当我将一页物理地址空间映射到本地地址空间并尝试读取它时,它运行良好,并显示预期的数据,但不是一直显示。如果我写一个脚本在循环中运行我编译的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/memn");
}
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的返回值,以防它失败
  2. 您假设与CPU共享内存的外围设备是与其一致的数据缓存。这是可能的,但不太可能。如果没有,你一定会看到过时的数据

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