void init_gdt() { gdt_desc.limit = (sizeof(struct s_gdt_entry) * 6) - 1; gdt_desc.base = (unsigned int)&gdt; /* Null segment */ init_segment(0, 0, 0, 0, 0); /*Ring 0*/ /* Code segment */ init_segment(1, BASE, LIMIT, 0xC, 0x9A); /* Data segment */ init_segment(2, BASE, LIMIT, 0xC, 0x92); /*Ring 3*/ /* Code segment */ init_segment(3, BASE, LIMIT, 0xC, 0xFA); /* Data segment */ init_segment(4, BASE, LIMIT, 0xC, 0xF2); /*TSS*/ write_tss(5, 0x10, 0); flush_gdt(); flush_tss(); }
void gdt_install(){ // null desc set_gdt_desc(0, 0, 0, 0, 0); // code descriptor, full 4 gigs and 4 kilobyte granularity set_gdt_desc(1, 0, 0xFFFFFFFF, 0x9A, 0xCF); // data descriptor, same as above set_gdt_desc(2, 0, 0xFFFFFFFF, 0x92, 0xCF); // user code and data descriptors set_gdt_desc(3, 0, 0xFFFFFFFF, 0xFA, 0xCF); set_gdt_desc(4, 0, 0xFFFFFFFF, 0xF2, 0xCF); // flush the gdt into memory flush_gdt(); }
extern "C" void init_gdt() { create_gdt_entry(0, 0, 0, 0, gdt); create_gdt_entry(0, 0xFFFFFFFF, 0x9A, 0xCF, gdt + 1); create_gdt_entry(0, 0xFFFFFFFF, 0x92, 0xCF, gdt + 2); flush_gdt(gdt, 3 * (sizeof *gdt) - 1); }