In a nutshell
Segmentation splits a program into logical, variable-sized segments — code, data, heap, stack — instead of uniform blocks. Each segment is recorded in a segment table by its base (where it starts in memory) and its limit (how long it is). An address names a segment and an offset; the hardware checks the offset against the limit, then adds the base to find the real location.