diff options
Diffstat (limited to 'kernel/gdt.c')
| -rw-r--r-- | kernel/gdt.c | 23 |
1 files changed, 15 insertions, 8 deletions
diff --git a/kernel/gdt.c b/kernel/gdt.c index dc760f2..4df089f 100644 --- a/kernel/gdt.c +++ b/kernel/gdt.c @@ -7,13 +7,13 @@ #define GDT_SIZE 6 extern sys_tss; +static uint8_t gdt_struct[GDT_SIZE*8]; typedef struct GDT_struct { uint32_t base; uint32_t limit; uint32_t type; - }GDT; //alternative @@ -38,10 +38,6 @@ struct gdt_entry_bits unsigned int base_high :8; } __packed; //or __attribute__((packed)) - -static GDT myGDT[GDT_SIZE]; -static uint8_t gdt_struct[GDT_SIZE*8]; - /** * \param target A pointer to the 8-byte GDT entry * \param source An arbitrary structure describing the GDT entry @@ -89,6 +85,16 @@ void encodeGdtEntry(uint8_t *target, GDT source) void gdt_init() { + /* + Pr=1 Privl 1 Exec DC RW Ac + 0x9A == 1001 1010 == 1 00 1 1 0 1 0 + 0x92 == 1001 0010 == 1 00 1 0 0 1 0 + 0xFA == 1111 1010 == 1 11 1 1 0 1 0 + 0xF2 == 1111 0010 == 1 11 1 0 0 1 0 + */ + + GDT myGDT[GDT_SIZE]; + //selector 0x0 myGDT[0].base=0; myGDT[0].limit=0; @@ -115,15 +121,16 @@ void gdt_init() myGDT[4].type=0xF2; //TSS 0x28 - myGDT[5].base=&sys_tss; //tss start? - myGDT[5].limit=sizeof(tss_struct); //tss end? + myGDT[5].base=&sys_tss; //tss start + myGDT[5].limit=sizeof(tss_struct); //tss end myGDT[5].type=0x89; // transcript to format the processor wants for(int i=0;i<GDT_SIZE;i++) encodeGdtEntry(&gdt_struct[8*i],myGDT[i]); - // updat + // update tss entry install_tss(); + setup_gdt(&gdt_struct[0],8*GDT_SIZE); } |
