void constructGDT(){ uint8_t acs, atr; acs = 0; atr = 0; uint32_t limit = 0; uint32_t base = 0; initGDTEntry(&gdt[0], base, limit, acs, atr); limit = 655359; acs = 154; atr = 64; initGDTEntry(&gdt[1], base, limit, acs, atr); acs = 146; initGDTEntry(&gdt[2], base, limit, acs, atr); initGDTEntry(&gdt[3], base, limit, acs, atr); base = 753664; limit = 3999; initGDTEntry(&gdt[4], base, limit, acs, atr); }
void gdt_install() { /* setup the GDT pointer and limit */ gp.limit=(sizeof(struct gdt_entry)*5)-1; gp.base= (unsigned int)gdt; /* NULL descriptor */ initGDTEntry(0,0,0,0,0); /* Code Segment Descriptor , limit 4GB,granularity 4Kb, 32bit opcode*/ /*gdt_set_gate(num,base,limit,access,gran)*/ initGDTEntry(1,0,640*1024-1,0x9A,0x40); /* Data Segment */ initGDTEntry(2,0,640*1024-1,0x92,0x40); /* stack segment*/ initGDTEntry(3,0,640*1024-1,0x92,0x40); /* video segment */ initGDTEntry(4,0xb8000,0xF9F,0x92,0x40); /* F9F hex value of 80*25*2-1*/ /* Flush old GDT*/ _linker(&gp); gdt_flush(8,16,24,16,16,32); /* 1x8 for CS (2x8) for DS (3x8) for SS 4x8 for es */ }