Penguin
Note: You are viewing an old revision of this page. View the current version.

The Linux VirtualMemory Map (as seen by a UserSpace program)
| Starts at| Contains
| ffffffff |< End of the universe
| ffffe000 |< vsyscall table (new in 2.5.x)
| c0000000 |< Off limits, reserved for the kernel
| bfffffff |< Process stack (grows down)
| bffff000 |< Process heap (grows up)
| 40000000 |< Libraries
| zzzzzzzz |< Unused
| yyyyyyyy |< .bss, uninitialised program data
| xxxxxxxx |< .data segment, initialised program data
| 08048000 |< .text segment, program code
| 00000000 |< Unmapped to trap NULL pointers

"BSS" means block started by symbol and is a segment of uninitialised that is only stored in the BinaryExecutable image as a length and offset, since it would otherwise waste space. The "text" segment on the other hand contains initialized global variables and is stored in the BinaryExecutable.

Practical examples

Library-mapped memory (using ldd(1))

$ ldd /bin/ls

librt.so.1 => /lib/librt.so.1 (0x40026000)
libc.so.6 => /lib/libc.so.6 (0x40038000)
libpthread.so.0 => /lib/libpthread.so.0 (0x4016a000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)

Program code

$ cat > x.c

  1. include <stdio.h>

int main(void) {printf("%p\n", main);return 0;}
$ gcc -o x x.c && ./x
0x8048344
$

(this is printing the address of the main function.)

Process Heap

$ cat > x2.c

<code>

  1. include <stdio.h>

int main(void) {char c;printf("%p\n", &c); return 0;}
</code> $ gcc -o x2 x2.c && ./x2
0xbffffab7

Process Data and bss segment

$ perl -e 'my $var; print \$var . "\n"'

SCALAR(0x814f38c)

(note that this is the address in the Perl interpreter)

$ cat > x3.c

  1. include <stdio.h>
  2. include <stdlib.h>

int main(void) {char *p=!malloc(3);printf("%p\n", p); return 0;}
$ gcc -o x3 x3.c && ./x3
0x8049628

Also,

cat /proc/pid/maps

gives you the memory map for a program :)