2016-05-18 17 views
2

メモリが豊富な64ビットマシンで、mmapを使用して2GBを超える連続メモリを割り当てるのに問題があります。 次のコードはうまく動作します。しかし、連続してmmapされたページの数を2GBを少し上回ると、私のマシンではmmapが失敗します。Mmapは2GBを超える連続したデータを割り当てることができません

#include <sys/mman.h> 
#include <stdio.h> 
#include <signal.h> 
#include <stdlib.h> 
#include <time.h> 
#include <errno.h> 
#include <unistd.h> 

#define PAGE_SIZE (4*1024) 
#define START_ADDRESS 0x8000000 
#define START_ADDRESS2 0x800000000 
#define N_ITERATIONS 524288 

// one more iteration and mmap fails 
//#define N_ITERATIONS 524289 

void allocate(void* base_address) 
{ 
    int i; 
    for (i = 0; i < N_ITERATIONS; ++i) { 
     void* current_addr = base_address + PAGE_SIZE * i; 
     void* ret = mmap((void*)current_addr, PAGE_SIZE, PROT_EXEC|PROT_READ|PROT_WRITE, 
       MAP_NORESERVE | MAP_FIXED | MAP_PRIVATE|MAP_ANONYMOUS, 0, 0); 
     if (ret == MAP_FAILED) { 
      fprintf(stderr, "Error mmap. errno: %d\n", errno); 
      exit(-1); 
     } 
     printf("%d\n", i); 
    } 
} 

int main() 
{ 
    allocate((void*)START_ADDRESS); 
    allocate((void*)START_ADDRESS2); 
    return 0; 
} 

連続したデータの2GB以上を割り当てるからカーネルを防ぐ何

-t: cpu time (seconds)    unlimited 
-f: file size (blocks)    unlimited 
-d: data seg size (kbytes)   unlimited 
-s: stack size (kbytes)    8192 
-c: core file size (blocks)   unlimited 
-m: resident set size (kbytes)  unlimited 
-u: processes      515550 
-n: file descriptors    65535 
-l: locked-in-memory size (kbytes) unlimited 
-v: address space (kbytes)   unlimited 
-x: file locks      unlimited 
-i: pending signals     515550 
-q: bytes in POSIX msg queues  819200 
-e: max nice      0 
-r: max rt priority     0 
-N 15:        unlimited 

-a ulimitの?

+0

さて、クリスタルボールを見ると、私の見解には32ビットの符号付き限界があります。 IOW:[ask]を参照し、アドバイスに従ってください。 – Olaf

+0

私は 'ulimit'を見ることから始めます。また、実際に64ビット用にコンパイルしていることを確認してください。 'printf("%zu "、sizeof(void *))'は面白いかもしれません。 – EOF

+0

@EOFはい、64ビットでコンパイルされていることを確認しました。私はそこに 'ulimit'の出力を貼り付けました。すべてがうまくいくようです。 – JC1

答えて

3

base_addressPAGE_SIZE * iであふれています。

したがって、アドレス0xffffffff86000000に割り当てようとしています。

iの代わりに長いロングを入れても機能します。

関連する問題