= Process memory layout
For each process, the virtual address space looks like this:
``
------------------ 2^32 - 1
Stack (grows down)
v v v v v v v v v
------------------
(unmapped)
------------------ Maximum stack size.
(unmapped)
-------------------
mmap
-------------------
(unmapped)
-------------------
^^^^^^^^^^^^^^^^^^^
brk (grows up)
-------------------
BSS
-------------------
Data
-------------------
Text
-------------------
------------------- 0
``
The kernel maintains a list of pages that belong to each process, and synchronizes that with the paging.
If the program accesses memory that does not belong to it, the kernel handles a page-fault, and decides what to do:
* if it is above the maximum stack size, allocate those pages to the process
* otherwise, send a SIGSEGV to the process, which usually kills it
When an ELF file is loaded by the kernel to start a program with the `exec` system call, the kernel automatically registers text, data, BSS and stack for the program.
The `brk` and `mmap` areas can be modified by request of the program through the https://stackoverflow.com/questions/6988487/what-does-brk-system-call-do/31082353#31082353[`brk`] and `mmap` system calls. But the kernel can also deny the program those areas if there is not enough memory.
`brk` and `mmap` can be used to implement `malloc`, or the so called "heap".
`mmap` is also used to load dynamically loaded libraries into the program's memory so that it can access and run it.
Stack allocation: https://stackoverflow.com/questions/17671423/stack-allocation-for-process
Calculating exact addresses Things are complicated by:
* https://en.wikipedia.org/wiki/Address_space_layout_randomization[Address Space Layout Randomization].
* the fact that environment variables, CLI arguments, and some ELF header data take up initial stack space: https://unix.stackexchange.com/questions/145557/how-does-stack-allocation-work-in-linux/239323#239323
Why the text does not start at 0: https://stackoverflow.com/questions/14795164/why-do-linux-program-text-sections-start-at-0x0804800-and-stack-tops-start-at-0
Back to article page