The Byte is the standard unit of storage, made up of 8 bits (binary digits) whose state can be 1 or 0.
Bytes have been shown on the LHS of the diagram below to indicate that the memory area comprises of a huge number of these (many millions/billions, etc, according to the amount of storage available). The BIOS and the OS, just as any other program, require storage and have been shown here for completeness.
The main areas we are interested in is the data segment (collectively consisting of the code, data and bss), the stack and the heap.
*note: bss is used by many compilers and linkers for the portion of an object file or executable containing statically-allocated variables that are not explicitly initialized to any value. It is often referred to as the "bss section" or "bss segment".
The following diagram provides a simplified view of how the memory is laid out:
OS, environment variables, command line arguments
Works on a LIFO basis
Used for local variables and passing arguments to functions,
along with return address of the next instruction to be
executed when the function call is over
When a new stack frame needs to be added (as a result of
a new function), the stack grows downward
Unallocated. Free area, available to be utilised for growth by
heap or stack
Used for Dynamic Memory allocation
C managed by malloc(), realloc(), free()
C++ managed by new, delete
BSS. Uninitialised data
Data segment. Initialised data. Global and static variables
Code segment. aka Text segment.
Contains the compiled Machine code (program) instructions.
Often r/o to stop it being overwritten.
Note: this is greatly over simplified and shows just one program loaded in memory