Hallo,
mich quält schon längere Zeit ein Problem, das mit dem Wechsel nach Ring 3 zu tun hat.
Ich initialisiere den TSS-Deskriptor in der GDT und den Speicherbereich in dem die Daten des TSS liegen. Das funktioniert.
Dann beginne ich mit dem Ringwechsel. Der Code dafür sieht so aus:
Doch bei der Zeile "mov %ax,%ss" bekomme ich einen General Protection Fault. Redscreen sagt:
Die Einträge in meine GDT sind in folgender Reihenfolge:
- Nulldeskriptor
- Kernel-Code
- Kernel-Daten
- User-Code
- User-Daten
- TSS
Hoffe ihr könnt mir helfen.
mfg Thunder
PS: ich habe auch schon Mal selber in der Intel-Doku nachgeschaut, aber dort steht, dass Fehler mit dem SS nur passieren, wenn ich ein Codesegment hineinlade, was ich nicht tue.
mich quält schon längere Zeit ein Problem, das mit dem Wechsel nach Ring 3 zu tun hat.
Ich initialisiere den TSS-Deskriptor in der GDT und den Speicherbereich in dem die Daten des TSS liegen. Das funktioniert.
Code: [Auswählen]
void init_tss(void){
DWORD pt=(DWORD) &tss; // tss ist die Struktur die ich global definiert habe
void *ept=tss_entry; // hat die Adresse des TSS-Eintrags in der GDT
*((BYTE*) ept+5) = (pt << 16) & 0xFF;
*((BYTE*) ept+6) = (pt << 24) & 0xFF;
*((WORD*) ept+2) = pt & 0xFFFF;
tss.esp0=(DWORD) task_stack+STACKSIZE;
tss.ss0=0x10;
tss.ds=0x23;
tss.ss=tss.ds; tss.es=tss.ds; tss.fs=tss.ds; tss.gs=tss.ds;
tss.iopb=0;
tss.eax=0; tss.ebx=0; tss.ecx=0; tss.edx=0; tss.esi=0; tss.edi=0;
tss.ebp=0x300000;
tss.esp=tss.ebp;
set_tss();
}
inline void set_tss(void){
asm volatile( "mov $0x28, %ax\n"
"ltr %ax\n");
}
//aus der GDT:
dw 0x68
dw 0x0
db 0x0,0xE9
db 0x0,0x0Der TSS-Deskriptor in der GDT ist an Position 6, wenn man bei 1 zu zählen beginnt und den Nulldeskriptor mitzählt.Dann beginne ich mit dem Ringwechsel. Der Code dafür sieht so aus:
Code: [Auswählen]
asm volatile( "mov $0x23, %ax\n"
"mov %ax,%ds\n"
"mov %ax,%es\n"
"mov %ax,%fs\n"
"mov %ax,%gs\n"
"mov %ax,%ss\n"
"ljmp $0x1B, $.152\n"
".152:\n"
);Doch bei der Zeile "mov %ax,%ss" bekomme ich einen General Protection Fault. Redscreen sagt:
Zitat
EXCEPTION 13 ERRORCODE 32
EAX 2097187 EBX 1073180
ECX 23 EDX 1208320
EIP 1050545 CS 8
ESP 1073140 SS 1052995
DS 35 ES 35
FS 35 GS 35
Die Einträge in meine GDT sind in folgender Reihenfolge:
- Nulldeskriptor
- Kernel-Code
- Kernel-Daten
- User-Code
- User-Daten
- TSS
Hoffe ihr könnt mir helfen.
mfg Thunder
PS: ich habe auch schon Mal selber in der Intel-Doku nachgeschaut, aber dort steht, dass Fehler mit dem SS nur passieren, wenn ich ein Codesegment hineinlade, was ich nicht tue.

Übersicht
Wiki
Hilfe
Suche
Einloggen
Registrieren
Drucken

Gespeichert