2014-04-08 77 views
-1

當linux 2.6.37.6上的大小> 1GB時,我的mmap失敗,errno 12失敗。mmap> 1GB失敗,errno 12

任何想法?我有64GB的RAM

# swapon -s 
Filename    Type  Size Used Priority 
/dev/sda1        partition 65537160 0 -1 

# ulimit -a 
core file size   (blocks, -c) 0 
data seg size   (kbytes, -d) unlimited 
scheduling priority    (-e) 0 
file size    (blocks, -f) unlimited 
pending signals     (-i) 495694 
max locked memory  (kbytes, -l) 64 
max memory size   (kbytes, -m) unlimited 
open files      (-n) 1024 
pipe size   (512 bytes, -p) 8 
POSIX message queues  (bytes, -q) 819200 
real-time priority    (-r) 0 
stack size    (kbytes, -s) 8192 
cpu time    (seconds, -t) unlimited 
max user processes    (-u) 495694 
virtual memory   (kbytes, -v) unlimited 
file locks      (-x) unlimited 

編輯:添加UNAME -a

#[email protected]:~# uname -a 
Linux maverick-5 2.6.37.6 #5 SMP Fri Feb 14 16:21:40 PST 2014 x86_64 GNU/Linux 

編輯:添加免費

#free 
     total  used  free  shared buffers  cached 
Mem:  63459224  317692 63141532   0  25800  36280 
-/+ buffers/cache:  255612 63203612 
Swap:  65537160   0 65537160 

編輯:它是一種具有64GB RAM的64位系統:

# cat /proc/meminfo 
MemTotal:  63459224 kB ... 

編輯:添加MMAP代碼

... 
*fd = open(file_path, O_RDWR, 0644); 
if (*fd==-1){ 
    printf("open file failed \n"); 
    exit(); 
} 
system("ulimit -m -v"); 
mem = mmap(0,0x80000000,PROT_READ|PROT_WRITE,MAP_NORESERVE|MAP_PRIVATE,*fd,0); 
if (mem == MAP_FAILED){ 
    printf("map failed failed %d %d\n", errno, mem); 
    exit(); 
} 
+2

你可以顯示你的'mmap'調用以及你傳遞給它的標誌嗎? – Joe

+1

32位或64位系統?你有1GB的地址空間嗎? –

+1

/dev/sda1是交換分區,64 GB是交換大小,但不是RAM。請運行'uname -a'和'free'來提供問題的更多細節;也發佈你的程序的代碼。 – osgx

回答

0

應始終測試系統調用的結果。閱讀mmap(2)所以代碼

mem = mmap(0,size_of_segment, PROT_READ|PROT_WRITE, 
      MAP_NORESERVE|MAP_PRIVATE,*fd,0); 
if (mem == MMAP_FAILED) 
    { perror("mmap size_of_segment"); exit(EXIT_FAILURE); }; 

我們不知道是什麼size_of_segment包含,什麼是*fd。實際上,當mmap時,我不確定是否使用MAP_NORESERVE-文件是明智之舉。使用MAP_NORESERVEMAP_ANONYMOUS(保留地址空間而不消耗交換空間)或省略MAP_NORESERVE;如果你想訪問和修改文件中的d,用MAP_SHARED

mem = mmap(0,size_of_segment, PROT_READ|PROT_WRITE, 
      MAP_SHARED,*fd,0); 
if (mem == MMAP_FAILED) 
    { fprintf (stderr, "mmap size_of_segment=%ld *fd=%d failed %s\n", 
       (long)size_of_segment, *fd, strerror(errno)); 
     exit(EXIT_FAILURE); }; 

在我的系統ENOMEM是12,然後perror打印(或strerror給出)Cannot allocate memory這是相當不言自明。該mmap(2)手冊頁講述:

ENOMEM No memory is available, or the process's maximum number of 
      mappings would have been exceeded. 

但是POSIX mmap講述了一個不同的故事;也許你有太多的內存映射。查看/proc/1234/maps以瞭解pid 1234的過程。

+0

我只讀了'ENOMEM'的兩個原因(和3個'EINVAL') –

+0

Hrm。似乎我實際上在看'mmap(3p)'。 –

+0

我添加了更多代碼以使事情更清晰。我同時嘗試了MAP_NORESERVE | MAP_ANONYMOUS | MAP_PRIVATE和MAP_PRIVATE。我也得到不能分配內存,我不明白,因爲我只使用2/64的內存。/proc/PID/maps也看起來不可疑。 – hlitz

0

問題是每進程虛擬內存限制將設置爲1GB(使用ulimit -a進行檢查)。可以使用ulimit -v將其設置爲60gb左右,然後您的mmap()調用將成功。

相關問題