如何将 mmap() 64 位地址转换为 32 位进程?
How to mmap() 64-bit address into 32-bit process?
我正在尝试将驻留在 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
编译。
当我 运行 程序时它 returns EINVAL
。
它在没有 -D_FILE_OFFSET_BITS=64
的情况下工作,但它只使用 baseaddr 的低 32 位 - 我通过 pmap -d 的输出得出结论,显示我想要的地址的低 32 位。
知道我做错了什么吗?
你应该在这里使用 mmap64
。该地址必须映射到 32 位进程可以使用的区域。但是,我强烈 建议您获得此应用程序的真正 64 位版本。你正朝着这里的兔子洞前进,如果你明白我的意思,那个洞里有很多兔子便便......
好的,我的最终解决方案是添加混合的 32/64 汇编代码,切换到长模式,加载具有所需值的长寄存器,然后在没有任何包装器的情况下进行系统调用并切换回受保护模式。很有魅力。
我正在尝试将驻留在 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
编译。
当我 运行 程序时它 returns EINVAL
。
它在没有 -D_FILE_OFFSET_BITS=64
的情况下工作,但它只使用 baseaddr 的低 32 位 - 我通过 pmap -d 的输出得出结论,显示我想要的地址的低 32 位。
知道我做错了什么吗?
你应该在这里使用 mmap64
。该地址必须映射到 32 位进程可以使用的区域。但是,我强烈 建议您获得此应用程序的真正 64 位版本。你正朝着这里的兔子洞前进,如果你明白我的意思,那个洞里有很多兔子便便......
好的,我的最终解决方案是添加混合的 32/64 汇编代码,切换到长模式,加载具有所需值的长寄存器,然后在没有任何包装器的情况下进行系统调用并切换回受保护模式。很有魅力。