--- /dev/null
+#include "mem.h"
+#include "desc.h"
+
+void set_gdt(void *addr, uint16_t limit);
+
+enum {
+ SEG_NULL = 0,
+ SEG_KCODE = 1,
+ SEG_KDATA = 2
+};
+
+#define NUM_SEG 3
+static struct desc gdt[NUM_SEG] __attribute__((aligned(8)));
+
+void mem_init(void)
+{
+ desc_seg(gdt, SEG_NULL, 0, 0, 0);
+ desc_seg(gdt + SEG_KCODE, SEG_CODE, 0, 0xffffffff, 0);
+ desc_seg(gdt + SEG_KDATA, SEG_DATA, 0, 0xffffffff, 0);
+
+ set_gdt(gdt, sizeof gdt - 1);
+}