共享内存成功重新映射后立即 SIGBUS

共享内存成功重新映射后立即 SIGBUS

我正在使用 POSIX 共享内存。最初我映射四个共享内存缓冲区。其中之一超出了其分配的大小,因此我调用 mremap:

void * remap_shm(void *old_address, size_t old_size, size_t new_size)
{

    void * return_ptr;

    return_ptr = mremap(old_address, old_size, new_size, MREMAP_MAYMOVE);

    if (return_ptr <= 0){
        printf("Error on remap! %s\n", strerror(errno)); }

    return return_ptr;
}

这成功地获得了指向新映射的指针,但在重新映射之后,我立即尝试写入旧映射的末尾并收到 SIGBUS 错误。但是,我仍然可以使用新指针从原始缓冲区(第一个 ~8MB)中读取数据,但我无法读取/写入超过原始 ~8MB 的末尾,即使它已被重新映射到更大的大小。

旧内存为 8003584,新内存是该大小的两倍 (16007168)。这些大小甚至是 4,096(页面大小)的倍数。这是从共享对象调用的(如果相关的话)。

我知道内存映射页面可能会发生 SIGBUS 错误,但为什么我会在这里遇到这个错误?一切看起来都正确,如所述 https://www.man7.org/linux/man-pages//man2/mremap.2.html

感谢您对此的任何想法。

相关内容