2010-09-21 32 views
2

我正在嘗試使用mmap在Mac OS X上對文件系統I/O進行基準測試。使用MMAP讀取OS X時的頁面錯誤

#include <unistd.h> 
#include <fcntl.h> 
#include <dirent.h> 
#include <sys/stat.h> 
#include <sys/types.h> 
#include <sys/mman.h> 
#include <stdio.h> 
#include <math.h> 

char c; 

int main(int argc, char ** argv) 
{ 
     if (argc != 2) 
     { 
       printf("no files\n"); 
       exit(1); 
     } 
     int fd = open(argv[1], O_RDONLY); 
     fcntl(fd, F_NOCACHE, 1); 
     int offset=0; 
     int size=0x100000; 
     int pagesize = getpagesize(); 
     struct stat stats; 
     fstat(fd, &stats); 
     int filesize = stats.st_size; 
     printf("%d byte pages\n", pagesize); 
     printf("file %s @ %d bytes\n", argv[1], filesize); 
     while(offset < filesize) 
     { 
       if(offset + size > filesize) 
       { 
         int pages = ceil((filesize-offset)/(double)pagesize); 
         size = pages*pagesize; 
       } 
       printf("mapping offset %x with size %x\n", offset, size); 
       void * mem = mmap(0, size, PROT_READ, 0, fd, offset); 
       if(mem == -1) 
         return 0; 
       offset+=size; 
       int i=0; 
       for(; i<size; i+=pagesize) 
       { 
         c = *((char *)mem+i); 
       } 

       munmap(mem, size); 
     } 
     return 0; 
} 

這個想法是,我將映射文件或其中的一部分,然後通過解引用導致頁面錯誤。我慢慢失去了理智,因爲這根本不起作用,而且我之前在Linux上做過類似的事情。

回答

8

改變這一行

void * mem = mmap(0, size, PROT_READ, 0, fd, offset); 

void * mem = mmap(0, size, PROT_READ, MAP_PRIVATE, fd, offset); 

而且,不-1比較mem。改爲:

if(mem == MAP_FAILED) { ... } 

它更具可讀性和更便攜。

一般建議:如果您使用的是與以前不同的UNIX平臺,則打開手冊頁是一個不錯的主意。對於mmapOS X,可以找到here。它說

符合的應用程序必須指定MAP_PRIVATE或MAP_SHARED。

因此,在第四 參數指定0是在OS X OK,我相信 這是一般的BSD真。

+0

+1確實這解決了我的問題。 – Novikov 2010-09-22 05:08:24