Exemplo n.º 1
0
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();
}
Exemplo n.º 2
0
Arquivo: gdt.c Projeto: cxleb/cx
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();
}
Exemplo n.º 3
0
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);
}