Lowlevel
Lowlevel => Lowlevel-Coding => Thema gestartet von: stafe am 02. September 2007, 21:08
-
Hallo,
da ich in meinem OS während der Laufzeit den Grafikmodus ändern möchte, habe ich mir gedacht das mit dem Virtual 8086 Mode zu realisieren.
Doch leider sind einige Probleme aufgetreten.
Mein OS kann ring0 und ring3 tasks ausführen ...
Ich habe mal in einem Beitrag gelesen, dass man für einen V86 Task lediglich die EFLAGS ändern muss (0x20002). Dies mache ich wie folgt (Hier der V86 Task Stack):
stackptr=kernstack;
*--stackptr=0x20|3;
*--stackptr=0x20|3;
*--stackptr=0x20|3;
*--stackptr=0x20|3;
*--stackptr=0x20|3;
*--stackptr=(unsigned long)userstack;
*--stackptr=0x20002L;
*--stackptr=0x18|3;
*--stackptr=(unsigned long)startpunkt;
*--stackptr=0x0; //EAX
*--stackptr=0x0; //ECX
*--stackptr=0x0; //EDX
*--stackptr=0x0; //EBX
*--stackptr=0x0; //-->ESP kann Null sein
*--stackptr=0x0; //EBP
*--stackptr=0x0; //ESI
*--stackptr=0x0; //EDI
*--stackptr=0x10; //ds
*--stackptr=0x10; //es
*--stackptr=0x10; //fs
*--stackptr=0x10; //gs
Ich weiß nicht ob dass so richtig ist ?!
Bochs meldet mir jedoch folgende Fehlermeldungen:
00084951475-i-@00102142-[CPU ] IRET to V86-mode: ignoring upper 16-bits
00084951478-i-@00000003-[CPU ] LOCK prefix unallowed (op1=0x53, attr=0x0, mod=0x0, nnn=0)
Es wird unzähligemal folgener Fehler im bochsout.txt angezeigt:
00084951522-e-@00101852-[CPU ] seg = DS
00084951522-e-@00101852-[CPU ] seg->selector.value = 0000
Läuft der Task jetzt schon im V86 mode oder kommt beim Versuch in den V86 mode zu schalten der Fehler ??
Ich hoffe jemand hat bereits Erfahrung mit dem V86 mode und kann mir weiterhelfen.
Danke im Voraus
-
00084951475-i-@00102142-[CPU ] IRET to V86-mode: ignoring upper 16-bits
Könnte es sein, dass dein EIP größer als 64k ist und deswegen diese Meldung kommt?
-
Ich habe das Programm jetzt auf die Adresse 0x500 geladen.
Der Fehler:
00084951475-i-@00102142-[CPU ] IRET to V86-mode: ignoring upper 16-bits
scheint nun nicht mehr aufzutreten.
Doch es wird trotzdem noch unzählige mal folgender Fehler angezeigt:
00084951522-e-@00101852-[CPU ] seg = DS
00084951522-e-@00101852-[CPU ] seg->selector.value = 0000
-
Bei welcher Instruktion tritt denn der Fehler auf?
-
Erstmals danke für deine Antworten ...
Naja ich nehme zum testen des V86 mode folgenden code her:
Dieser Code ist das V86 programm (int 10 aufrufen):
unsigned char opcode[2];
opcode[0] = 0xCD;
opcode[1] = 0x10;
mem_set(0x500, 0, 0xffff);
mem_cpy(0x500, opcode, 0x02);
und anschließend erstelle ich einen V86 Task:
Neuer_Task_vm86( 0x500, "v86task", KERNEL_TASK, NORMAL_PRIORITY );
Bei welcher Instruktion tritt denn der Fehler auf?
Ich weiß jetzt nicht genau wie du das meinst?! Der Fehler tritt auf sobald der v86 task ausgeführt wird ...
-
hi,
probier es doch erstmal mit Befehlen, die weniger machen wie z.B. "jmp $" (= 0xEB, 0xFE).
für Interrupts im V86 Mode brauchst du soweit ich mich erinnern kann einen V86-Handler (im Kernel, der im ProtectedMode im GPF-Handler sitzt), da ein "int 0x10" ein GPF (Exception 13) hervorruft. In dem Handler musst du die Adresse und das Segment dann selbst "hineinschreiben" als Rücksprungsadresse. (im V86-Handler musst du auch DS,ES,.. neu laden, da diese vom V86-Task erhalten bleiben (und DS = 0 im PMode ist ungültig).
Grüsse,
Stefan
-
Nur leider löst der V86 Task bei einem Interrupt keinen GPF aus sondern bringt unzähligemal den selben Fehler, und Bochs beendet anschließend die Simulation mit einem Page Fault ...
-
Ich denke die Ursache des Problems haben wir im ICQ geklärt, hat auch lang genug gebraucht :-D
Nur um das für andere noch zu erklären: Die CPU setzt alle Segmentregister auf 0 (außer cs & ss) beim Taskwechsel von vm86 -> Ring0. Stafe hat nun ohne die Segmentregister zu setzten einfach DS benutzt. Das hat zu den
00084951522-e-@00101852-[CPU ] seg = DS
00084951522-e-@00101852-[CPU ] seg->selector.value = 0000
im Bochslog bei einem Interrupt/Exception geführt.
-
Vielen Dank für deine Hilfe bluecode