#include "gdt.h" using seg = GDT::SegmentDescriptor; GDT::GDT() : segments{seg::make<0>(0, {.present = false}), // null segment seg::make<0xffffffff>(0, {.r_w = true, .exe = true, .segment = true}), // code segment seg::make<0xffffffff>(0, {.r_w = true, .segment = true})} // data segment { Pointer gdtr{.limit = sizeof(segments) - 1, .base = reinterpret_cast(segments)}; asm volatile("lgdt %0" : : "p"(gdtr)); }