Re: 2.6.23-mm1

From: KAMEZAWA Hiroyuki
Date: Wed Oct 17 2007 - 02:59:28 EST


I noticed 32bit binary on x86_64 behavior is changed on 2.6.23-mm1.

This is a result of pmap after process returns -ENOMEM.(see attached program)
== on 2.6.23 ==
errno 12
3531: ./malloc
0000000000001000 6272K ----- [ anon ]
0000000000621000 100K r-x-- /lib/ld-2.5.so
000000000063a000 4K r---- /lib/ld-2.5.so
000000000063b000 4K rw--- /lib/ld-2.5.so
000000000063c000 8K ----- [ anon ]
000000000063e000 1244K r-x-- /lib/libc-2.5.so
0000000000775000 8K r---- /lib/libc-2.5.so
0000000000777000 4K rw--- /lib/libc-2.5.so
0000000000778000 12K rw--- [ anon ]
000000000077b000 123700K ----- [ anon ]
0000000008048000 4K r-x-- /home/kamezawa/malloc
0000000008049000 4K rw--- /home/kamezawa/malloc
000000000804a000 3929824K ----- [ anon ]
00000000f7f02000 8K rw--- [ anon ]
00000000f7f04000 100K ----- [ anon ]
00000000f7f1d000 4K rw--- [ anon ]
00000000f7f1e000 131812K ----- [ anon ]
00000000fffd7000 84K rw--- [ stack ]
00000000fffec000 72K ----- [ anon ]
00000000ffffe000 4K r-x-- [ anon ]
total 4193272K
==

== on 2.6.23-mm1==
errno 12
3504: ./malloc
0000000000621000 100K r-x-- /lib/ld-2.5.so
000000000063a000 4K r---- /lib/ld-2.5.so
000000000063b000 4K rw--- /lib/ld-2.5.so
000000000063e000 1244K r-x-- /lib/libc-2.5.so
0000000000775000 8K r---- /lib/libc-2.5.so
0000000000777000 4K rw--- /lib/libc-2.5.so
0000000000778000 12K rw--- [ anon ]
0000000008048000 4K r-x-- /home/kamezawa/malloc
0000000008049000 4K rw--- /home/kamezawa/malloc
0000000055555000 4K rw--- [ anon ]
0000000055556000 100K ----- [ anon ]
000000005556f000 8K rw--- [ anon ]
0000000055671000 2789016K ----- [ anon ]
00000000ffa17000 84K rw--- [ stack ]
00000000ffa2c000 5960K ----- [ anon ]
00000000ffffe000 4K r-x-- [ anon ]
total 2796560K
==

Maybe get_unmapped_area() had some change.
Is this intended ?

Thanks,
-Kame
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/mman.h>
#include <errno.h>



#define PAGESIZE (4096)

int main(int argc, char *argv[])
{
char *c,*safe;
pid_t pid;
char buffer[256];
int err;
pid = getpid();
sprintf(buffer,"/usr/bin/pmap %d", pid);
safe = malloc(1024*1024);
while (1) {
c = mmap(NULL, PAGESIZE, PROT_NONE, MAP_ANON | MAP_PRIVATE, 0, 0);
if (c == MAP_FAILED) {
err = errno;
break;
}
}
free(safe);
printf("errno %d\n",err);
system(buffer);
}