【发布时间】:2016-12-21 22:58:37
【问题描述】:
:) 我正在尝试将一些遗留代码(大型程序)移植到 CentOS 7,但遇到了障碍。代码的核心是一个相当尴尬的结构,它使用 mmap 来分配硬编码地址并将文件映射到它。该文件就像一个数据库(并且由一个数据库构建)并且包含指向映射内存不同部分的硬编码指针。非常丑陋,但它就是这样。整个程序都是围绕这种结构构建的,没有人会资助重写。
问题出现在 mmap 行上。这以前有效,但不再在 CentOS 7 上:
mmapAddr = mmap ((void *) SMAddr, SMA_WINDOW_SIZE, PROT_READ | (readOnly ? 0 : PROT_WRITE),MAP_FILE | MAP_FIXED | MAP_SHARED, SMFileDesc, 0);
... 其中SMAddr 是0x8000000,SMA_WINDOW_SIZE 是127926272,readOnly 是假的。所以基本上它试图将一个文件映射到地址0x8000000,大小为122MB。
版本之间可能发生了什么变化,我不知道。但我确实注意到它映射的文件只有 1.5MB。我不确定为什么它需要映射比文件大小更多的东西,但我知道它是必需的,而且我知道出于某种原因选择大小“122MB”时存在很多细微差别。
实际文件大小和分配大小之间的不匹配在过去是否正常,但现在不行了?我知道SIGBUS 意味着试图访问无效的内存区域。鉴于 mmap 不采用任何类型的分配指针,这必须是它在内部做的事情。
我尝试捕获并阻止SIGBUS(认为它可能会被忽略?),但程序仍然在同一位置以SIGBUS 崩溃。也许我做错了。
想法?
【问题讨论】: