繁体   English   中英

mmap64()在Red Hat 6.6中有效,但在Red Hat 7.2中无效

[英]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错误:

  1. 我们不喜欢addr,length或offset(例如,它们太大或在页面边界上未对齐)。 ->在我的情况下很可能是罪魁祸首。
  2. (从Linux 2.6.12开始)长度为0 。->不可能,我在调试打印中检查了长度(regionSize)值,它是0x20000。
  3. 标志既不包含MAP_PRIVATE也不包含MAP_SHARED,也不包含这两个值。 ->不能像我从函数调用中看到的那样,仅将MAP_SHARED标志用作参数。

所以我现在被困住了。 不知道如何调试它。 此问题是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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM