Source: cirosantilli/x86-paging/process-memory-layout

= 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