Move the GDT

Question about which tools to use, bugs, the best way to implement a function, etc should go here. Don't forget to see if your question is answered in the wiki first! When in doubt post here.
Post Reply
Dennis

Move the GDT

Post by Dennis »

I?ve been coding an OS for a while and today I thought it would be good to move the GDT and GDTD to a "safer" location. I dont know why my code doesn?t work. The kernel starts but as soon as I try to read the keyboard, the OS reboots. It doesnt reboot when not trying to move the GDT. This is my code. Note that Im already in PM, and just wanna move the GDT. k_malloc is a memory function for the kernel, used the same way as the regual malloc function. I got three segments; the NULL-segment, a code and a data (just like when I entered PM in the bootloader)

struct GDT_descriptor {
   unsigned short limit0;
   unsigned short base0;

   unsigned char base1;
   unsigned char attr1;
   unsigned char attr2;
   unsigned char base2;
}__attribute__((packed));
typedef struct GDT_descriptor GDT_descriptor;
GDT_descriptor *GDT; // The GDT

struct GDT_descriptor2 {
   unsigned short size;
   unsigned long GDT;
}__attribute__((packed));
typedef struct GDT_descriptor2 GDT_descriptor2;
GDT_descriptor2 *GDTD; // The GDT descriptor

void move_gdt() {
   GDT = (GDT_descriptor *)k_malloc(3*sizeof(GDT_descriptor));
   GDT[0].limit0 = GDT[0].base0 = GDT[0].base1 = GDT[0].attr1 = GDT[0].attr2 = GDT[0].base2 = 0; // reserved by Intel

   GDT[1].limit0 = 0x0FFFF;
   GDT[1].base0 = 0;
   GDT[1].base1 = 0;
   GDT[1].attr1 = 0x9A;
   GDT[1].attr2 = 0xCF;
   GDT[1].base2 = 0;

   GDT[2].limit0 = 0x0FFFF;
   GDT[2].base0 = 0;
   GDT[2].base1 = 0;
   GDT[2].attr1 = 0x92;
   GDT[2].attr2 = 0xCF;
   GDT[2].base2 = 0;

   GDTD = (GDT_descriptor2 *)k_malloc(sizeof(GDT_descriptor2));
   GDTD->size = 24;
   GDTD->GDT = GDT;

   asm("XOR %AX, %AX");
   asm("MOV %DS, %AX");

   asm volatile("LGDT (%0) ": :"p" (GDT));

   asm("MOV %AX, 8");
   asm("MOV %DS, %AX");
   asm("MOV %SS, %AX");
}
Dennis

Re:Move the GDT

Post by Dennis »

asm("MOV %AX, 8");
asm("MOV %DS, %AX");

that should probably be
asm("MOV %AX, 16"); // The data segment
asm("MOV %DS, %AX");

but it doesnt work anyway
Dennis

Re:Move the GDT

Post by Dennis »

Me being so stupid, I loaded the GDT and not the GDTD :) Please remove this thread(Space wasting and embarassing)
jinksys

Re:Move the GDT

Post by jinksys »

Embarrasing? :) When I was learning how to write bootloaders I wasted ~3hours of the night debugging this loader that just would NOT work. It
just so happened that I was forgetting to run Make before writing the kernel to the floppy :-X , now THAT is embarrasing.
Post Reply