:) 我正在尝试将一些遗留代码(大型程序)移植到 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
地方崩溃。也许我做错了。
想法?