POSIX 공유 메모리를 사용하고 있습니다. 처음에는 4개의 공유 메모리 버퍼를 매핑했습니다. 그 중 하나가 할당된 크기를 초과하므로 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.
이에 대한 의견을 보내주셔서 감사합니다.