2012-10-05 17 views
2

崩潰下面的程序:上段錯誤關機程序使用mmap(MAP_FIXED)在Linux 2.6.18 &&的glibc 2.5

#include <stdio.h> 
#include <assert.h> 
#include <sys/mman.h> 
#include <sys/types.h> 
#include <sys/stat.h> 
#include <fcntl.h> 

void generate_test_file(int count) 
{ 
    FILE *f; 
    int i; 

    f = fopen("testfile", "w+"); 
    for (i=0;i<count;i++) { 
      fwrite(&i, 1, sizeof(i), f); 
    } 
    fclose(f); 

} 

void test_mmap_directly() 
{ 
    int fd; 
    void *area_short, *area_long; 

    generate_test_file(1024); 
    fd = open("testfile", O_RDONLY); 
    assert(fd>=0); 

    area_short = mmap(0, 4096, PROT_READ, MAP_PRIVATE, fd, 0); 
    assert(area_short != MAP_FAILED); 

    generate_test_file(1024*1024); 
    area_long = mmap(area_short, 4096*1024, PROT_READ, MAP_PRIVATE | MAP_FIXED, fd, 0); 
    assert(area_long != MAP_FAILED); 
    assert(area_short == area_long); 
} 

int main(int argc, char ** argv) 
{ 
    test_mmap_directly(); 
/* Crashes on shutdown for libc 2.5 and kernel 2.6.18 (CentOS 5) */ 
} 

崩潰在我的CentOS 5盒。這是一個已知的錯誤, 應該一般不使用MAP_FIXED或者 程序有問題。它也會在其他平臺上崩潰嗎?

感謝您的幫助,

  • 約翰內斯
+0

在第一個'mmap()'之後關閉'fd'並在第二個'generate_test_file()'之後重新打開它有重要意義嗎?什麼樣的文件系統是「testfile」居住的?我想知道如果文件的截斷/覆蓋導致保持打開的文件描述符不一致,這會導致第二個'mmap()'出現問題。另外,由於「MAP_FIXED」會導致重疊的映射區域被丟棄,所以第二個映射可能會殺死映射的共享庫或數據段或其他內容。 – twalberg

+0

看起來確實如此:第二個mmap調用殺死共享庫。關閉並重新打開文件並沒有什麼不同。 –

+1

* 4096 * 1024 *您通過MAP_FIXED在先前預約的4K上映射4M。由於您不控制地址空間,因此它可以覆蓋任何內容。 – bestsss

回答

0

你忘了文件描述符使用munmap上的指針和close。 如果你還沒有那麼問題很可能MAP_FIXED

我對我的Debian(內核2.6.32)測試,它使用MAP_FIXED標誌時造成段錯誤和沒有標誌的工作(除之後的第二MMAP失敗的斷言這是我認爲並不出乎意料的)。

man mmap的支持對MAP_FIXED的支持是實現定義的,並且其支持是不鼓勵的。我從來沒有使用它,所以我想不出任何解決方案,而不是省略它。

+0

感謝您的回答。可能MAP_FIXED不應該被使用,但我需要它在我的mmap_allocator中的一個特例(在github上可用:https://github.com/johannesthoma/mmap_allocator)。我已經找到了解決方法。最近的內核是否存在問題(比如3.6)? –

相關問題