Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何将mmap()64位地址转换为32位进程?_C_Mmap - Fatal编程技术网

C 如何将mmap()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

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