mmap无法正常工作(返回随机0xdeadbeef)

时间:2016-01-05 00:24:50

标签: c++ c linux embedded

我在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/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 个答案:

答案 0 :(得分:0)

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

  1. 如果失败,您需要检查mmap的返回值。
  2. 您假设与CPU共享内存的外围设备是与之相关的数据缓存。这是可能的,但不太可能。如果他们不是一定会看到过时的数据。
  3. 话虽如此,我怀疑你所看到的是与这两个问题有关,并怀疑0xdeadbeef的内存值是指示访问内存时出现错误的RTL设计器的不良方式。