I ran this piece of code on centOS 5.3 x86_64 and ubuntu amd64 jaunty
server kernel:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/mman.h>
#include <string.h>
#define SIZE (size_t)1024 * 1024 * 1024 * 16 /* 16GB */
int main(void) {
void *buf = mmap(NULL, SIZE, PROT_READ | PROT_WRITE,
MAP_SHARED | MAP_ANONYMOUS, -1, 0);
if (MAP_FAILED == buf) {
fprintf(stderr, "map failed\n");
exit(EXIT_FAILURE);
}
return EXIT_SUCCESS;
}
However strace shows that mmap fails with -ENOMEM
This is the strace output:
[~/test]$ strace ./big_mmap_lab
execve("./big_mmap_lab", ["./big_mmap_lab"], [/* 47 vars */]) = 0
brk(0) = 0xae0f000
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1,
0) = 0x2b3761c6c000
uname({sys="Linux", node="oucs1198.otago.ac.nz", ...}) = 0
access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=161548, ...}) = 0
mmap(NULL, 161548, PROT_READ, MAP_PRIVATE, 3, 0) = 0x2b3761c6d000
close(3) = 0
open("/lib64/libc.so.6", O_RDONLY) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0p\332A\3464\0\0\0"...,
832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=1713160, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1,
0) = 0x2b3761c95000
mmap(0x34e6400000, 3494168, PROT_READ|PROT_EXEC,
MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x34e6400000
mprotect(0x34e654c000, 2097152, PROT_NONE) = 0
mmap(0x34e674c000, 20480, PROT_READ|PROT_WRITE,
MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x14c000) = 0x34e674c000
mmap(0x34e6751000, 16664, PROT_READ|PROT_WRITE,
MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x34e6751000
close(3) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1,
0) = 0x2b3761c96000
arch_prctl(ARCH_SET_FS, 0x2b3761c96210) = 0
mprotect(0x34e674c000, 16384, PROT_READ) = 0
mprotect(0x34e561b000, 4096, PROT_READ) = 0
munmap(0x2b3761c6d000, 161548) = 0
mmap(NULL, 17179869184, PROT_READ|PROT_WRITE,
MAP_SHARED|MAP_ANONYMOUS, -1, 0) = -1 ENOMEM (Cannot allocate memory)
write(2, "map failed\n", 11map failed
) = 11
exit_group(1) = ?
[~/test]$ vim big_mmap.c
Isn't the address space of amd64 architecture very big? Also please
try the above code on other distribution and tell me which
distribution allows this mmap.
Thanks!
Mark
--
To unsubscribe from this list: send an email with
"unsubscribe kernelnewbies" to [email protected]
Please read the FAQ at http://kernelnewbies.org/FAQ