Ich wollte den VM86 einbauen welcher ja von einem Task (Prozess) mit der Privilegstufe 3 bewirkt werden muss, der dann VM86 startet (iret), denn der erste Versuch mit VM86 denn ich mittels Software Interrupt ausgelöst habe hat beim Befehl int 10h (im VM86) einen Absturz verursacht. Meine Add Funktion für Tasks hab ich so abgeändert, dass nun auch die Privilegstufe mit einbezogen werden. Doch jetzt wird ein Exceptions 13 ausgelöst. Wenn ich jedoch Privilegstufe auf 0 setze geht alles
Ist beim Rinwechsel noch etwas wichtiges zu beachten?
Code: [Auswählen]
void f3(){while(1);}Code: [Auswählen]
Tasks.add(0x0 ,0xffffffff,(unsigned int) &t_f1,0,(unsigned int) f1,0, true);
Tasks.add(0x0 ,0xffffffff,(unsigned int) &t_f3,0,(unsigned int) f3,3, true);Code: [Auswählen]
unsigned short CTask::add(unsigned int base, unsigned int size, unsigned int tss_base , unsigned int page_base, unsigned int start,unsigned char privileg , bool update) //paging noch nicht enthalten
/// Code Segement
i = GDT->add(base,size,0x9A | ((privileg & 3) << 5),G); //G==3
p_tss->CS = (i << 3) | (privileg & 3);
/// Data Segement
i = GDT->add(base,size,0x92 | ((privileg & 3) << 5),G);
i = (i << 3) | (privileg & 3);
p_tss->DS = i;
p_tss->ES = i;
p_tss->FS = (privileg & 3);
p_tss->GS = (privileg & 3);
p_tss->EIP = start;
p_tss->EFLAGS = 0x90200;
p_tss->CR3 = page_base;
//noch schlecht
p_tss->ESP = 0x300000 + task_Eintraege * 0x10000;
p_tss->SS = i;//0x10;Ist beim Rinwechsel noch etwas wichtiges zu beachten?


Übersicht
Wiki
Hilfe
Suche
Einloggen
Registrieren
Drucken

Gespeichert

