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 . . .
您的代码有两个可能的问题:
- 您需要检查 mmap 的 return 值以防失败。
- 您假设与 CPU 共享内存的外围设备是与之一致的数据缓存。这是可能的,但不太可能。如果不是,您一定会看到过时的数据。
话虽如此,我怀疑您所看到的是否与这两个问题有关,并且怀疑内存值 0xdeadbeef 是糟糕的 RTL 设计器指示访问内存时出现错误的方式。
我在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 . . .
您的代码有两个可能的问题:
- 您需要检查 mmap 的 return 值以防失败。
- 您假设与 CPU 共享内存的外围设备是与之一致的数据缓存。这是可能的,但不太可能。如果不是,您一定会看到过时的数据。
话虽如此,我怀疑您所看到的是否与这两个问题有关,并且怀疑内存值 0xdeadbeef 是糟糕的 RTL 设计器指示访问内存时出现错误的方式。