2014-12-02 5 views
0

Я пытаюсь запустить следующую программу на Ubuntu, но он сбой сегментации.SIGSEGV при вызове mmap дважды

То, что я пытаюсь сделать, это вызов ММАП дважды:

p1 = mmap(null, size: 16 * 4k, offset: 0); 
p2 = mmap(p1+(16*4K), 136 * 4k , offset: 16 * 4k); 

В основном, пытаясь создать два последовательных областей памяти зеркального отображения двух последовательных областей в файле. Это нормально, если 2-й mmap не удался, но я хотел бы понять, почему он вызывает ошибку сегментации.

#include <stdio.h> 
#include <stdlib.h> 
#include <sys/mman.h> 
#include <fcntl.h> 
#include <sys/types.h> 
#include <sys/stat.h> 
#include <errno.h> 
#include <unistd.h> 

int main() 
{ 
    int fd, ret; 
    void* p1; 
    void* p2; 
    unlink ("test.file");// don't care if it doesn't exists 

    fd = open("test.file", O_RDWR | O_CREAT | O_SYNC, ALLPERMS); 

    if(fd == -1) 
     return errno; 

    ret = ftruncate(fd, 4096*16); 
    if(ret != 0) 
     return errno; 

    p1 = mmap(NULL, 4096*16, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); 
    if(p1 == (void*)-1) 
     return errno; 

    ret = ftruncate(fd, 4096*150); 
    if(ret != 0) 
     return errno; 

    // dies here! 
    p2 = mmap(p1 + (4096*16), 4096*(150-16), PROT_READ | PROT_WRITE, MAP_SHARED |MAP_FIXED, fd, 4096*16); 
    if(p2 == (void*)-1) 
     return errno; 


    return 0; 
} 

ответ

3

может выделить сторожевые страницы до и после отображения для предотвращения переполнения вашей картирование, они должны по сегментации читать и писать. Другой вариант заключается в том, что вы попадаете на страницу защиты под стек. Проверьте pmap выход после первого mmap.

Попробуйте вместо этого использовать mremap.

+0

Привет, Максим, большое спасибо, можете ли вы указать мне некоторые ресурсы, чтобы получить дополнительную информацию об этом? –

+0

@AyendeRahien Я смог воспроизвести его, но не более с исходным кодом. Может быть рандомизация случайного пространства. –

Смежные вопросы