如何将64位地址mmap()转换为32位进程?

问题描述 投票:5回答:2

我正在尝试将驻留在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位。]

任何想法我在做什么错?

我正在尝试将驻留在64位地址上的设备内存映射到64位OS上的32位进程。我正在使用以下行baseaddr = addr&〜(sysconf(_SC_PAGE_SIZE)-1); fd = open(“ / dev / mem”,...

c mmap
2个回答
2
投票

您应该在这里使用mmap64。该地址必须映射到32位进程可以使用的区域。但是,我strong


0
投票

这里是答案:http://man7.org/linux/man-pages/man2/mmap2.2.html我猜想在32位进程中,您只能将mmap偏移量提高到2 ^ 44。

© www.soinside.com 2019 - 2024. All rights reserved.