This occurs in the 2.6.26-2-amd64 Linux kernel when trying to mmap a 5GB file with copy-on-write semantics (PROT_READ | PROT_WRITE and MAP_PRIVATE). Displaying files smaller than 4 GB or using only PROT_READ is great. This is not a problem with limited resources, as indicated in this question ; The size of the virtual limit is unlimited.
Here is the code reproducing the problem (the actual code is part of Boost.Interprocess ).
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <unistd.h>
main()
{
struct stat b;
void *base;
int fd = open("foo.bin", O_RDWR);
fstat(fd, &b);
base = mmap(0, b.st_size, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0);
if (base == MAP_FAILED) {
perror("mmap");
return 1;
}
return 0;
}
and here is what happens:
dd if=/dev/zero of=foo.bin bs=1M seek=5000 count=1
./test-mmap
mmap: Cannot allocate memory
Here is the corresponding strace output (just compiled 4.5.20) as given by nos.
open("foo.bin", O_RDWR) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=5243928576, ...}) = 0
mmap(NULL, 5243928576, PROT_READ|PROT_WRITE, MAP_PRIVATE, 3, 0) = -1 ENOMEM (Cannot allocate memory)
dup(2) = 4
[...]
write(4, "mmap: Cannot allocate memory\n", 29mmap: Cannot allocate memory
) = 29
source
share