我正在尝试将驻留在64位地址上的设备内存映射到64位OS上的32位进程。
我正在使用以下几行

baseaddr = addr & ~(sysconf(_SC_PAGE_SIZE) - 1);
fd = open("/dev/mem", O_RDONLY | O_SYNC);
base_ptr = mmap(0, 4096, PROT_READ, MAP_PRIVATE, fd, baseaddr);

baseaddr是uint64_t,并且高于4GB。

我用-D_FILE_OFFSET_BITS=64编译。
当我运行程序时,它将返回EINVAL
它在没有-D_FILE_OFFSET_BITS=64的情况下可以工作,但是只使用了baseaddr的低32位-我通过pmap -d的输出得出结论,显示了我想要的地址的低32位。

有什么想法我做错了吗?

最佳答案

您应该在这里使用mmap64。该地址必须映射到32位进程可以使用的区域。但是,我强烈建议您获得此应用程序的真实64位版本。您正驶向此处的一个兔子洞,如果您 catch 了我的漂流,那个洞里有很多兔子便便...

关于c - 如何将64位地址mmap()转换为32位进程?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59649038/

10-12 17:24
查看更多