Move the BRK_START to a fixed, safe address (XCC)
authorBarret Rhoden <brho@cs.berkeley.edu>
Wed, 26 Oct 2016 19:19:07 +0000 (15:19 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Wed, 26 Oct 2016 19:50:34 +0000 (15:50 -0400)
commit2b3db81ca2196148550a44038438633027ffb2af
tree899391b893087a704826e3a2acd7b27499a321cd
parentca3cccc2d3c6bc6b36f00631954e41581870972f
Move the BRK_START to a fixed, safe address (XCC)

The VM code often wants to mmap blobs at various fixed addresses, such
as the guest kernel.  Our old glibc heap would start right at the top of
the program's loading point, which meant that we couldn't safely use any
of that memory.  The current vmrunkernel just has a huge array that
covers the memory regions it expects to use.  This is less than ideal.

This commit just specifies a region of the process's virtual address
space that glibc will use for its sbrk() allocations (e.g. malloc()).
Any program can safely mmap with MAP_FIXED below this address (up to the
binary's end point, which the kernel reports in procinfo->program_end.

Here's a before and after.  Note the old 0x21000 bytes has moved from
0x647000 to its new location at 0x100000000000.

bash-4.3$ cat /proc/self/maps
00100000-00120000 rwxp 00000000 01:00 146 /lib/ld-2.19.so
00320000-00321000 r--p 00020000 01:00 146 /lib/ld-2.19.so
00321000-00322000 rw-p 00021000 01:00 146 /lib/ld-2.19.so
00322000-00323000 rw-p 00000000 00:00 0 [heap]
00400000-00443000 r-x- 00000000 01:00 102 /bin/busybox
00443000-00444000 r-xp 00043000 01:00 102 /bin/busybox
00643000-00644000 rw-p 00043000 01:00 102 /bin/busybox
00644000-00647000 rw-p 00000000 00:00 0 [heap]
00647000-00668000 rwx- 00000000 00:00 0 [heap]
400000000000-400000001000 rw-p 00000000 01:00 146 /lib/ld-2.19.so
400000001000-400000002000 rw-p 00000000 00:00 0 [heap]
400000002000-400000141000 r-xp 00000000 01:00 182 /lib/libc-2.19.so
400000141000-400000341000 ---p 0013f000 01:00 182 /lib/libc-2.19.so
400000341000-400000345000 r--p 0013f000 01:00 182 /lib/libc-2.19.so
400000345000-400000347000 rw-p 00143000 01:00 182 /lib/libc-2.19.so
400000347000-40000034a000 rw-p 00000000 00:00 0 [heap]
40000034a000-40000034b000 rw-p 00000000 00:00 0 [heap]
40000034b000-40000034f000 rw-- 00000000 00:00 0 [heap]
40000034f000-400000351000 rwx- 00000000 00:00 0 [heap]
400000351000-400000353000 rw-- 00000000 00:00 0 [heap]
7f7fff8ff000-7f7fff9ff000 rw-- 00000000 00:00 0 [heap]

bash-4.3$ cat /proc/self/maps
00100000-00120000 rwxp 00000000 01:00 146 /lib/ld-2.19.so
00320000-00321000 r--p 00020000 01:00 146 /lib/ld-2.19.so
00321000-00322000 rw-p 00021000 01:00 146 /lib/ld-2.19.so
00322000-00323000 rw-p 00000000 00:00 0 [heap]
00400000-00443000 r-x- 00000000 01:00 102 /bin/busybox
00443000-00444000 r-xp 00043000 01:00 102 /bin/busybox
00643000-00644000 rw-p 00043000 01:00 102 /bin/busybox
00644000-00647000 rw-p 00000000 00:00 0 [heap]
100000000000-100000021000 rwx- 00000000 00:00 0 [heap]
400000000000-400000001000 rw-p 00000000 01:00 146 /lib/ld-2.19.so
400000001000-400000002000 rw-p 00000000 00:00 0 [heap]
400000002000-400000141000 r-xp 00000000 01:00 182 /lib/libc-2.19.so
400000141000-400000341000 ---p 0013f000 01:00 182 /lib/libc-2.19.so
400000341000-400000345000 r--p 0013f000 01:00 182 /lib/libc-2.19.so
400000345000-400000347000 rw-p 00143000 01:00 182 /lib/libc-2.19.so
400000347000-40000034a000 rw-p 00000000 00:00 0 [heap]
40000034a000-40000034b000 rw-p 00000000 00:00 0 [heap]
40000034b000-40000034f000 rw-- 00000000 00:00 0 [heap]
40000034f000-400000351000 rwx- 00000000 00:00 0 [heap]
400000351000-400000353000 rw-- 00000000 00:00 0 [heap]
7f7fff8ff000-7f7fff9ff000 rw-- 00000000 00:00 0 [heap]

Rebuild glibc.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
kern/arch/riscv/ros/mmu.h
kern/arch/x86/ros/mmu64.h
kern/include/ros/procinfo.h
kern/src/elf.c
kern/src/process.c
kern/src/syscall.c
tools/compilers/gcc-glibc/glibc-2.19-akaros/sysdeps/akaros/sbrk.c