The flat-model GDT you're encoding here — ring 0 kernel segments, ring 3 user segments, all spanning 4GB — is exactly what every production x86 kernel sets up before touching paging, even though modern OSes rely on page tables rather than segmentation for real protection. Get an access byte wrong (0x9A vs 0x92, code vs data) and user code silently runs with kernel privileges instead of faulting.