void installGDT() { gptr.limit = (sizeof(struct gdt_entry) * 3) - 1; gptr.base = (u32)&gdt; gdtSetGate(0, 0, 0, 0, 0); gdtSetGate(1, 0, 0xFFFFFFFF, 0x9A, 0xCF); gdtSetGate(2, 0, 0xFFFFFFFF, 0x92, 0xCF); gdtFlush(); }
void GdtInit() { GdtDesc desc = AssembleGdtDesc(5, gdt); Real_GdtEntry null = {0,0,0,0,0,0}; u8* vidmem = 0xb8000; vidmem[2] = 'c'; gdt[0] = null; gdt[1] = AssembleReal_GdtEntry(AssembleGdtEntry(0x0, 0xFFFFFFFF, KERNEL, DATA, UP, READ, _4K, _32) ); gdt[2] = AssembleReal_GdtEntry(AssembleGdtEntry(0x0, 0xFFFFFFFF, KERNEL, CODE, UP, READ_WRITE, _4K, _32) ); gdt[3] = AssembleReal_GdtEntry(AssembleGdtEntry(0x0, 0xFFFFFFFF, USER, DATA, UP, READ_WRITE, _4K, _32) ); gdt[4] = AssembleReal_GdtEntry(AssembleGdtEntry(0x0, 0xFFFFFFFF, USER, CODE, UP, READ, _4K, _32) ); vidmem[4] = 'd'; gdtFlush(&desc); // The triple-fault point vidmem[6] = 'e'; }