The system would have more freedom to manage memory, while the programmer would have a more natural programming environment. Segmentation provides such a mechanism.
Segmentation is a memory-management scheme that supports this programmer view of memory. A logical address space is a collection
Each segment has a name and a length. The addresses specify both the segment name and the offset within the segment. The programmer therefore specifies each address by two quantities: a segment name and an offset
For simplicity of implementation, segments are numbered and are referred to by a segment number, rather than by a segment name. Thus, a logical address consists of a two tuple:
Normally, when a program is compiled, the compiler automatically constructs segments reflecting the input program.
A C compiler might create separate segments for the following:
- The code
- Global variables
- . The heap, from which memory is allocated
- The stacks used by each thread
- The standard C library
Libraries that are linked in during compile time might be assigned separate segments. The loader would take all these segments and assign them segment numbers
Although the programmer can now refer to objects in the program by a two-dimensional address, the actual physical memory is still, of course, a one dimensional sequence of bytes. Thus, we must define an implementation to map two-dimensional user-defined addresses into one-dimensional physical addresses. This mapping is effected by a segment table. Each entry in the segment table has a segment base and a segment limit. The segment base contains the starting physical address where the segment resides in memory, and the segment limit specifies the length of the segment