gpt4 book ai didi

c - mmap64() 适用于 Red Hat 6.6 但不适用于 Red Hat 7.2

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:06:55 24 4
gpt4 key购买 nike

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。

据我所知,代码没有区别。

返回的 errno 是“无效参数”或 errno #22 (EINVAL)。查看此引用 http://linux.die.net/man/3/mmap64 ,我看到 EINVAL 错误的 3 种可能性:

  1. 我们不喜欢地址、长度或偏移量(例如,它们太大,或未在页面边界对齐)。 -> 在我的情况下很可能是罪魁祸首。
  2. (自 Linux 2.6.12 起)长度为 0。 -> 不可能,我在调试打印中检查了长度 (regionSize) 值,它是 0x20000。
  3. 标志既不包含 MAP_PRIVATE 也不包含 MAP_SHARED,或者包含这两个值。 -> 不可能是这样,正如您从我的函数调用中看到的那样,只有 MAP_SHARED 标志作为参数给出。

所以我现在卡住了。不确定如何调试。这个问题是 100% 可重现的。任何人都知道两个操作系统版本之间可能发生什么变化导致这种情况的提示?

最佳答案

将评论转为答案(将一些评论剪裁为不相关)。

如果您正在构建 64 位可执行文件,为什么不简单地使用不带后缀的 mmap()?这对您的问题有什么影响吗?

但是,我认为您的问题是所谓的regionAddrmmap64() 的最后一个参数在概要中称为 offset,并且:

offset must be a multiple of the page size as returned by sysconf(_SC_PAGE_SIZE).

regionAddr 的值是页面大小的倍数吗?在我看来,十六进制中的尾随零太少(它是 512 的倍数,但不是 4K 或更大的倍数)。


请注意,该问题最初显示的 regionAddr 值不同——另请参阅下面的评论。

regionAddr = 0x858521600;

and

addr = (unsigned char*) mmap64(NULL, regionSize, PROT_READ|PROT_WRITE, MAP_SHARED, FileDesc, (unsigned long long)regionAddr);

根据修改后的信息(regionAddr 中的值是 0x332C0000 或十进制 828521600),不太明显出了什么问题。

关于c - mmap64() 适用于 Red Hat 6.6 但不适用于 Red Hat 7.2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38468671/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com