[英]mmap64() works in Red Hat 6.6 but not in Red Hat 7.2
对mmap64()的函数调用如下:
addr = (unsigned char*) mmap64(NULL, regionSize, PROT_READ|PROT_WRITE, MAP_SHARED, FileDesc, (unsigned long long)regionAddr);
参数通常具有如下值:
regionSize = 0x20000;
FileDesc = 27;
regionAddr = 0x332C0000;
显然,在代码中,这些值并不是像这样硬编码的,但是我只想向您展示它们的典型值。
问题:
mmap64()调用可在Red Hat Linux 6.6(内核版本:2.6.32-504.16.2.el6.x86_64)中完美运行。 它在Red Hat Linux 7.2(内核版本:3.10.0-327.13.1.el7.x86_64)中失败。
据我所知,代码没有差异。
返回的错误号是“无效的参数”或错误号22(EINVAL)。 查看此参考http://linux.die.net/man/3/mmap64 ,我看到3种可能的EINVAL错误:
所以我现在被困住了。 不知道如何调试它。 此问题是100%可重现的。 任何人都对两个操作系统版本之间可能发生的更改有何提示?
将评论转换为答案(某些评论被修剪为不相关)。
如果要构建64位可执行文件,为什么不直接使用不带后缀的mmap()
? 这对您的问题有什么影响吗?
但是,我认为您的问题是您所说的regionAddr
。 在概要中, mmap64()
的最后一个参数称为offset
,并且:
offset必须是
sysconf(_SC_PAGE_SIZE)
返回的页面大小的sysconf(_SC_PAGE_SIZE)
。
您的regionAddr
值是页面大小的倍数吗? 在我看来,十六进制中的尾随零太少了(它是512的倍数,但不是4K或更大的倍数)。
请注意,该问题最初在regionAddr
上显示为其他值-另请参见以下注释。
regionAddr = 0x858521600;
和
addr = (unsigned char*) mmap64(NULL, regionSize, PROT_READ|PROT_WRITE, MAP_SHARED, FileDesc, (unsigned long long)regionAddr);
使用修改后的信息( regionAddr
值为0x332C0000
或十进制828521600),显然出了什么问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.