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:
Ausserdem wird ein anderes limit genommen als ich angegeben habe!
Ich sehe da einfach keinen fehler!
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:
Zitat
00011998349i[CPU0 ] | SEG sltr(index|ti|rpl) base limit G DDIe Base wird falsch gesetzt!
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
Ausserdem wird ein anderes limit genommen als ich angegeben habe!
Ich sehe da einfach keinen fehler!
Code: [Auswählen]
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;
}
Übersicht
Wiki
Hilfe
Suche
Einloggen
Registrieren
Drucken

Gespeichert

