如何使用mmap()映射物理内存

whh*_*000 5 linux mmap virtual-memory linux-device-driver

我正在尝试访问物理内存地址,0x30000000并且正在尝试使用完成此操作mmap()。当我将此地址映射到虚拟地址指针时,无法从内存中读取正确的值。当我使用调试器(带JTAG的TI Code Composer Studio)查看内存时,可以看到内存中的值,但是我的代码中没有相同的值吗?我使用mmap()正确吗?

off_t          dev_base = 0x30000000;
size_t         ldev = 0x3FFFFFF;
int offset = 0x00;


memfd = open("/dev/mem", O_RDWR | O_SYNC);
mapped_base = (int*)mmap(0, ldev, PROT_READ|PROT_WRITE, MAP_SHARED, memfd, dev_base);

if (mapped_base == MAP_FAILED)
{
    errx(1, "mmap failure");
}

printf("mapped_base = %08p\n", mapped_base);


printf("The value at address [%08p] = %08p\n", offset + ((int)mapped_base), mapped_base[offset/4]);

munmap(mapped_base, ldev);
close(memfd);
Run Code Online (Sandbox Code Playgroud)

Ans*_*pta 0

传递给 mmap 调用的偏移量应该以页为单位,这是新 mmap2 系统调用的区别。

mmap 手册页。

http://man7.org/linux/man-pages/man2/mmap.2.html