Example #1
0
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);	
}
Example #2
0
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 */
	
	

	
}