Segmentation has been included in 80 × 86 microprocessors to encourage programmers to split their applications into logically related entities, such as subroutines or global and local data areas. However, Linux uses segmentation in a very limited way. In fact, segmentation and paging are somewhat redundant since both can be used to separate the physical address spaces of processes: segmentation can assign a different linear address space to each process, while paging can map the same linear address space into different physical address spaces. Linux prefers paging to segmentation for the following reasons:
Memory management is simpler when all processes use the same segment register values — that is, when they share the same set of linear addresses.
One of the design objectives of Linux is portability to a wide range of architectures; RISC architectures in particular have limited support for segmentation.
The 2.4 version of Linux uses segmentation only when required by the
80 × 86 architecture. In particular, all processes use the
same logical addresses, so the total number of segments to be defined
is quite limited, and it is possible to store all Segment Descriptors
in the Global Descriptor Table (GDT). This table is implemented by
gdt_table referred to by the
Local Descriptor Tables are not used by the kernel, although a system
modify_ldt( ) exists that allows processes to create their own LDTs. This turns out to be ...