Almost all modern operating systems implement Memory Protection to protect access to a private address allocated to a process by other processes to avoid storage violation. this private space is called Process Address Space.
Process Address Space partitioned into various memory areas or segments based on the functional differences.
This segment, also known as the code segment, holds the executable instructions of a program.
- fixed size
The data area contains global and static variables used by the process that are initialized. This segment can be further classified into initialized read-only area and initialized read-write area.
- Gvar Section
A global variable that is initialized and stored in the data segment. This section has read/write attributes but cannot be shared among processes running the same program.
- BSS Section
This section holds uninitialized data. This data consists of global variables that the system initializes with 0s upon program execution. Another name for this section is the zero-initialized data section.
- Heap Section
This is used to grow the linear address space of a process. When a program uses malloc() to obtain dynamic memory, this memory is placed in the heap.The heap area begins at the end of the BSS segment and “grows up” to larger addresses from there. The Heap area is shared by all shared libraries and dynamically loaded modules in a process.
- variable size
- dynamic allocation by request
This contains all the local variables that get allocated. When a function is called, the local variables for that function are pushed onto the stack. As soon as a function ends, the variables associated with the function are popped from the stack. Other information, including return addresses and parameters, is also stored in the stack. The stack is a LIFO structure, typically located in the higher parts of memory. It usually “grows down” with every register, immediate value or stack frame being added to it.
- read/write, variable size
- automatic growth/shrinkage