#include "gdt.h" struct __attribute__((packed)) Pointer { uint16_t limit; uint32_t base; }; static struct SegmentDescriptor_t segments[8] __attribute__((aligned(32))); void gdt_install() { SegmentDescriptor(&segments[0], 0, 0, 0); // null segment SegmentDescriptor(&segments[2], 0, 0xffffffff, 0x9a); // ktext SegmentDescriptor(&segments[3], 0, 0xffffffff, 0x92); // kdata const struct Pointer ptr = {.limit = sizeof(segments) - 1, .base = (unsigned)&segments}; asm volatile("lgdt (%0)" : : "a"(&ptr)); // load the kernel data segment asm volatile(R"(mov %0, %%ds mov %0, %%es mov %0, %%fs mov %0, %%gs mov %0, %%ss )" : : "ax"(kdataDescriptor)); // load the kernel code segment asm volatile(R"(ljmp %0, $1f 1:)" : : "i"(ktextDescriptor)); }