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

Pyj*_*ong 5 c mmap

我正在尝试将驻留在 64 位地址上的设备内存映射到 64 位操作系统上的 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);
Run Code Online (Sandbox Code Playgroud)

baseaddr 是 uint64_t 并且大于 4GB。

我用-D_FILE_OFFSET_BITS=64. 当我运行程序时,它返回EINVAL. 它之前没有-D_FILE_OFFSET_BITS=64,但它只使用 baseaddr 的低 32 位 - 我通过 pmap -d 的输出得出结论,显示我想要的地址的低 32 位。

任何想法我做错了什么?

Pyj*_*ong 0

好的,我的最终解决方案是添加混合 32/64 汇编代码,该代码切换到长模式,加载具有所需值的长寄存器,然后在没有任何包装器的情况下进行系统调用,然后切换回受保护模式。奇迹般有效。