gpt4 book ai didi

c - 带有 MAP_FIXED 的 mmap 上的 SIGBUS | map 文件 | MAP_SHARED

转载 作者:太空宇宙 更新时间:2023-11-04 02:34:51 28 4
gpt4 key购买 nike

:) 我正在尝试将一些遗留代码(大型程序)移植到 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);

... 其中 SMAddr0x8000000 , SMA_WINDOW_SIZE127926272 , 和 readOnly是假的。所以基本上它试图将文件映射到地址 0x8000000大小为 122MB。

版本之间可能发生了什么变化,我不知道。但我确实注意到它映射的文件只有 1.5MB。我不确定为什么它需要映射的文件大小远远超过文件大小,但我知道这是必需的,而且我知道出于某种原因在选择“122MB”大小时有很多细微差别。

实际文件大小和分配的大小之间的不匹配在过去可能没有问题但现在不会了吗?我知道SIGBUS表示尝试访问无效的内存区域。鉴于 mmap 不采用任何类型的分配指针,这一定是它在内部做的事情。

我尝试捕捉和阻止 SIGBUS (认为​​它可能会被忽略?),但程序仍然崩溃并显示 SIGBUS在同一个地方。也许我做错了。

想法?

最佳答案

从这里1 :

The mmap() function can be used to map a region of memory that is larger than the current size of the object. Memory access within the mapping but beyond the current end of the underlying objects may result in SIGBUS signals being sent to the process. The reason for this is that the size of the object can be manipulated by other processes and can change at any moment. The implementation should tell the application that a memory reference is outside the object where this can be detected; otherwise, written data may be lost and read data may not reflect actual data in the object.

Note that references beyond the end of the object do not extend the object as the new end cannot be determined precisely by most virtual memory hardware. Instead, the size can be directly manipulated by ftruncate().

所以最有可能的错误是你的程序试图访问位于文件之外的映射内存区域。然而,mmap 调用应该会成功。你得到的返回值是多少?

关于c - 带有 MAP_FIXED 的 mmap 上的 SIGBUS | map 文件 | MAP_SHARED,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38960139/

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