Hallo erstmal!
Ich boote meinen Kernel ueber grub.
Dann lade ich meine eingene gdt.
Wenn ich das image jetzt unter bochs boote macht der direkt einen restart!
Auszug der Logfile:
00011998349i[CPU0 ] | SEG sltr(index|ti|rpl) base limit G D
00011998349i[CPU0 ] | CS:0008( 0001| 0| 0) 00000000 000fffff 1 1
00011998349i[CPU0 ] | DS:0010( 0002| 0| 0) ffffffff 000fffff 1 1
00011998349i[CPU0 ] | SS:0010( 0002| 0| 0) 00000000 000fffff 1 1
00011998349i[CPU0 ] | ES:0010( 0002| 0| 0) ffffffff 000fffff 1 1
00011998349i[CPU0 ] | FS:0010( 0002| 0| 0) ffffffff 000fffff 1 1
00011998349i[CPU0 ] | GS:0010( 0002| 0| 0) ffffffff 000fffff 1 1
DIe Base wird falsch gesetzt!
Ausserdem wird ein anderes limit genommen als ich angegeben habe!
Ich sehe da einfach keinen fehler!
typedef struct gdt_entry{
WORD size0_15;
WORD base0_15;
BYTE base16_23;
BYTE access;
BYTE size16_19;
BYTE base24_31;
}gdt_entry;
typedef struct gdt_ptr{
WORD limit;
DWORD base;
}gdt_ptr;
gdt_ptr pgdt;
gdt_entry gdt[MAX_GDT_ENTRYS];
void init_gdt(){
WORD itemp=0;
//deskriptoren auf 0 setzen
for(itemp=0;itemp<MAX_GDT_ENTRYS;itemp++){
memset((BYTE*)&gdt[itemp],0,sizeof(gdt_entry));
}
//code deskriptor setzen
if(0!=set_gdt(1,0xFFFFF,0,GDT_DATA|GDT_CODE|GDT_PRESENT))return;
//daten deskriptor setzen
if(0!=set_gdt(2,0xFFFFF,0,GDT_DATA|GDT_PRESENT))return;
//limit und base der gdt speichern
pgdt.limit=MAX_GDT_ENTRYS*8 - 1;
pgdt.base=gdt;
//gdt laden und segmentregister aktualisieren
load_gdt();
}
void load_gdt(){
if(pgdt.limit!=0&&pgdt.base!=0){
asm("lgdt %0" : : "m" (pgdt));
//asm("jmp $0x8,$1f;1:");
asm("mov $0x10,%eax");
asm("mov %eax,%ds");
asm("mov %eax,%es");
asm("mov %eax,%fs");
asm("mov %eax,%gs");
//asm("mov %eax,%ss");
}
}
WORD set_gdt(WORD nr,DWORD size,DWORD base,BYTE access){
if(nr>=MAX_GDT_ENTRYS||nr==0)return 1;
gdt[nr].size0_15=size&0xFFFF;
gdt[nr].size16_19=((size>>16)&0xF)|0x80|0x40;
gdt[nr].base0_15=base&0xFFFF;
gdt[nr].base16_23=(base>>16)&0xFF;
gdt[nr].base24_31=(base>>24)&0xFF;
gdt[nr].access=access;
return 0;
}