2016-05-18 11 views
2

Ich habe Probleme beim Zuweisen von mehr als 2 GB zusammenhängender Speicher mit mmap in einer 64-Bit-Maschine mit viel Speicher. Der folgende Code wird glücklich ausgeführt. Aber wenn die Anzahl der zusammenhängend mmaped Seiten auf etwas über 2GB mmap in meinem Gerät fehlschlägt.Mmap kann nicht mehr als 2 GB zusammenhängende Daten zuweisen

#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; 
} 

ulimit -a

-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 

Was von mehr als 2 GB Zuteilen von zusammenhängenden Daten, die den Kernel verhindert?

+0

Nun, einen Blick auf die Kristallkugel, habe ich im Nachhinein Ihre Maschine 32 Bit signierten Limit. IOW: Siehe [fragen] und folgen Sie den Anweisungen. – Olaf

+0

Ich würde mit dem Blick auf "Ulimit" beginnen. Stellen Sie außerdem sicher, dass Sie tatsächlich für 64-Bit kompilieren, also könnte 'printf ("% zu ", sizeof (void *)) 'interessant sein. – EOF

+0

@EOF Ja, ich habe überprüft, dass es in 64 Bits kompiliert. Ich habe die Ausgabe von "ulimit" dort oben eingefügt, alles scheint mir gut zu sein. – JC1

Antwort

3

Sie sind überfüllt Ihre base_address mit PAGE_SIZE * i.

So versuchen Sie, auf Adresse in der Nähe von 0xffffffff86000000 zuweisen.

Setzen Sie eine lange lange stattdessen für i und es wird funktionieren.

Verwandte Themen