Segmentation provides memory protection by separating memory into different segments for code and data. There are three main descriptor tables - the Global Descriptor Table (GDT) containing global descriptors, the Local Descriptor Table (LDT) containing task-specific descriptors, and the Interrupt Descriptor Table (IDT) containing interrupt vectors. Descriptors contain information about segments including limits, addresses, and access rights. The Task State Segment (TSS) stores task state information for task switching. Gate descriptors allow changing privilege levels during function calls. Segmentation adds memory protection while allowing memory sharing between tasks.