#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() { const struct Pointer ptr = {sizeof(segments) - 1, (unsigned)&segments}; SegmentDescriptor(&segments[0], 0, 0, 0); /* null segment */ SegmentDescriptor(&segments[2], 0, 0xffffffff, 0x9a); /* ktext segment */ SegmentDescriptor(&segments[3], 0, 0xffffffff, 0x92); /* kdata segment */ __asm__("lgdt (%0)" : : "a"(&ptr)); /* load the kernel data segment */ __asm__("mov %0, %%ds; mov %0, %%es; mov %0, %%fs; mov %0, %%gs; mov %0, %%ss" : : "ax"(kdataDescriptor)); /* load the kernel code segment */ __asm__("ljmp %0, $1f\n1:" : : "i"(ktextDescriptor)); }