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

标签 linux linux-device-driver mmap virtual-memory

我正在尝试访问物理内存地址 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);

最佳答案

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

mmap 手册页。

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

关于linux - 如何使用 mmap() 映射物理内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22998959/

相关文章:

linux 如何在具有不同主机名的多台机器中更改目录

网络驱动器上的 python fsync() 挂起

linux - Linux 安装后将驱动器更改为 ext4 恢复 Windows 驱动器数据

C : mmap initialize at 0xffffffff

c++ - 将指针传递给由 exec() 生成的进程

linux - Sed 在模式上多次插入行

Linux/内核模块 : Can a driver be used by two user programs?

linux - 如何为 i2c 设备启用适当的驱动程序

linux - 在 ARM 的其他 cpu 内核中运行内核函数

c++ - 在 64 位系统的低地址分配内存的最可靠/可移植的方法是什么?