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?
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
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
@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