C 如何将mmap()64位地址转换为32位进程?
我正在尝试将驻留在64位地址上的设备内存映射到64位操作系统上的32位进程。 我用的是下面几行C 如何将mmap()64位地址转换为32位进程?,c,mmap,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); baseaddr为uint64_t,高于4GB 我用-D\u FILE\u OFFS
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\u FILE\u OFFSET\u BITS=64编译。
当我运行程序时,它返回EINVAL
。
它以前没有使用-D\u FILE\u OFFSET\u BITS=64
,但它只使用baseaddr的低32位,我通过pmap-D的输出得出结论,显示了我所需地址的低32位
你知道我做错了什么吗?你应该在这里使用mmap64
。地址必须映射到32位进程可以使用的区域。但是,我强烈建议您获得此应用程序的真正64位版本。你正朝一个兔子洞走去,洞里有很多兔子屎,如果你明白我的意思的话…好的,我的最终解决方案是添加混合的32/64汇编代码,切换到长模式,加载带有所需值的长寄存器,然后在没有任何包装的情况下进行系统调用,并切换回受保护状态。工作起来很有魅力。32位进程如何处理64位地址?这不是矛盾吗?检查您是否拥有该函数。是的,-D_FILE_OFFSET_BITS=64
应该自动将调用重定向到mmap()
到mmap64()
@Pyjong您不应该直接使用mmap64
。定义\u文件\u偏移量\u位=64
时应注意这一点。如果mmap返回INVAL
,请检查addr
、length
和offset
参数是否都与页面对齐。检查手册页,了解其可能返回EINVAL
的所有原因。addr
和baseaddr
变量是什么类型?(顺便说一句,忘了mmap64
或mmap2
--D\u FILE\u OFFSET\u BITS=64
应该定义mmap
->mmap64
,并将设为off\u t
64位)。如果可以,我会使用64位编译器。@Pyjong为什么?GCC和Clang都可以编译为32位和64位executables@phuclv我必须遵守我工作区的构建系统:/但是的,否则我会同意。32位或64位应用程序不应该与-D\u FILE\u OFFSET\u BITS=64
有关,因为off\u t
将是64位。