Segmentation has been included in Intel microprocessors to encourage programmers to split their applications in 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 the most popular architectures; however, several RISC processors support segmentation in a very limited way.
The 2.2 version of Linux uses segmentation only when required by the Intel 80x86 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 the array gdt_table referred by the gdt variable. If you look in the Source Code Index, you can see that these symbols are defined in the file arch/i386/kernel/head.S. Every macro, function, and other symbol in this ...