V86-Mode abschalten?
V86-Mode abschalten?
Hallo Forum! Ich muss mich mal wieder mit einer Frage an Euch wenden, die mich seit einiger Zeit beschäftigt.
Wenn ich richtig informiert bin, dann läuft MS-DOS doch im V86-Modus (oder doch in einer Art von Protected-Mode?), um Speicher im Bereich 640K-1MB zu verwalten? Oder betrifft das nur EMM386.EXE?
Ich frage mich dies, weil ich mal versucht habe, die Boot-Zeit des PCs zu verkürzen, indem ich direkt unter MS-DOS meinen BDOS-Kern geladen und gestartet habe Hat auch funktioniert - die Einschaltmeldung des DOS kommt und es versucht sich zu initialisieren. Leider aber nicht ganz - denn irgendwas von MS-DOS scheint noch aktiv zu sein, so dass der PC leider einen kompletten Reset durchführt. Da mein DOS keine INT-Vektoren verwendet, die von MS-DOS benutzt werden ($F1-$F5), denke ich, es hat etwas mit dem Speichermanagement zu tun? Das überschreiben der INTs $20 und $21 hat leider auch keinen Erfolg gebracht.
Falls es am V86/Protected Mode liegt: Wie kann ich den V86-Mode verlassen? Ich meine ja, dass man in dem Moment garnicht die Rechte hat, das Maschinen-Status-Wort bzw. CR0 zu ändern? Hat da jemand eine Idee dazu?
Wenn ich richtig informiert bin, dann läuft MS-DOS doch im V86-Modus (oder doch in einer Art von Protected-Mode?), um Speicher im Bereich 640K-1MB zu verwalten? Oder betrifft das nur EMM386.EXE?
Ich frage mich dies, weil ich mal versucht habe, die Boot-Zeit des PCs zu verkürzen, indem ich direkt unter MS-DOS meinen BDOS-Kern geladen und gestartet habe Hat auch funktioniert - die Einschaltmeldung des DOS kommt und es versucht sich zu initialisieren. Leider aber nicht ganz - denn irgendwas von MS-DOS scheint noch aktiv zu sein, so dass der PC leider einen kompletten Reset durchführt. Da mein DOS keine INT-Vektoren verwendet, die von MS-DOS benutzt werden ($F1-$F5), denke ich, es hat etwas mit dem Speichermanagement zu tun? Das überschreiben der INTs $20 und $21 hat leider auch keinen Erfolg gebracht.
Falls es am V86/Protected Mode liegt: Wie kann ich den V86-Mode verlassen? Ich meine ja, dass man in dem Moment garnicht die Rechte hat, das Maschinen-Status-Wort bzw. CR0 zu ändern? Hat da jemand eine Idee dazu?
Re: V86-Mode abschalten?
V86 wird von emm aktiviert.
Re: V86-Mode abschalten?
Moin.
Ich habe die Befürchtung, dass man den V86mode gar nicht so einfach verlassen kann, weil sonst müssten doch vorher alle Treiber die sich im EMS-Speicher befinden vorher ordentlich beendet worden sein, oder nicht?
Aber hiermit sollte es sich zumindest testen lassen ob wir uns im V86mode befinden:
http://www.masmforum.com/board/index.ph ... _next=next
Ich habe die Befürchtung, dass man den V86mode gar nicht so einfach verlassen kann, weil sonst müssten doch vorher alle Treiber die sich im EMS-Speicher befinden vorher ordentlich beendet worden sein, oder nicht?
Aber hiermit sollte es sich zumindest testen lassen ob wir uns im V86mode befinden:
http://www.masmforum.com/board/index.ph ... _next=next
Dirkjapheth: You really should know the basics if you want to to use protected-mode in DOS. An Emm386 indeed puts the cpu in protected mode and runs the DOS "real-mode" code in "v86-mode". Being in v86-mode it is indeed impossible to use instructions like "mov cr0, eax", since v86-mode runs at privilege level 3, not allowing such things. Therefore the Emm386s provide a special API (VCPI) to make the "true" protected-mode accessible for other programs like DOS extenders.
It's very easy to detect if you are in v86-mode:Code: Alles auswählen
smsw ax test ax,1 jnz v86mode jmp realmode
Re: V86-Mode abschalten?
Dinge wie PMODE.EXE und DOS4GW.EXE wechseln in den PM, egal, ob V86 vorher an oder aus ist. (DOOM & Co.) Und wechseln auch wieder zurück.
Also muß es gehen.
Also muß es gehen.
Re: V86-Mode abschalten?
Ok.DOSferatu hat geschrieben:Dinge wie PMODE.EXE und DOS4GW.EXE wechseln in den PM, egal, ob V86 vorher an oder aus ist. (DOOM & Co.) Und wechseln auch wieder zurück.
Also muß es gehen.
Aber wie können z.B. Treiber, die selber EMS-Speicher verwenden, dann während der V86-Mode abgeschaltet ist noch fehlerfrei weiter arbeiten, oder werden die solange in Tiefschlaf versetzt?
Ich kann mir das noch nicht so richtig vorstellen. Aber ich schaue gleich mal ins RBIL, ob ich dort etwas darüber finde.
Dirk
-
- DOS-Übermensch
- Beiträge: 1035
- Registriert: Mi 31. Jan 2007, 19:04
- Wohnort: Halle
- Kontaktdaten:
Re: V86-Mode abschalten?
Dieser Satz macht so keinen Sinn, da der V86 Modus den aktiven PM voraussetzt.DOSferatu hat geschrieben:Dinge wie PMODE.EXE und DOS4GW.EXE wechseln in den PM, egal, ob V86 vorher an oder aus ist. (DOOM & Co.) Und wechseln auch wieder zurück.
Also muß es gehen.
Diverse Retro-Computer vorhanden.
Re: V86-Mode abschalten?
Es war vermutlich wohl etwas anders gemeint. Also das wenn der V86 schon an ist, das der PM trotzdem in einem begrenzten Umfang benutzt werden kann.elianda hat geschrieben:Dieser Satz macht so keinen Sinn, da der V86 Modus den aktiven PM voraussetzt.DOSferatu hat geschrieben:Dinge wie PMODE.EXE und DOS4GW.EXE wechseln in den PM, egal, ob V86 vorher an oder aus ist. (DOOM & Co.) Und wechseln auch wieder zurück.
Also muß es gehen.
Dirk
Re: V86-Mode abschalten?
Ich vermute mal das die PM-Schnittstellen entsprechend über den Initiator abgewickelt werden, sprich, der, der zuerst den PM einrichtet und abwickelt, dann auch entsprechende Funktionen zur Verfügung stellt, dass alles glatt läuft, wenn die CPU aus welchen grund auch immer, nochmals in den Pm wechselt (DOS 4GW/Doom...). Ich denke mal, das im Hintergrund sicher eine Exception ausgelöst wird, die dann durch EMM386 behandelt wird (z. B. dadurch, dass es einfach den V86-Mode verlässt und das Programm (Doom, Win,...) freien Lauf lässt. Nach der Rückkehr wird dann einfach wieder V86 aktiv.
Abgesehen davon dürfte es diverse Tricks geben, sich auch mit einer niedrigeren Privileg-Stufe eine höhere zu erschleichen, um dann diverse Deskriptoren usw. einzurichten/zu ändern. Eine Hintertür gibt es bestimmt.
Ist aber grundsätzlich eine sehr interessante Frage, wie sowas abläuft. Leider hatte ich bisher noch nicht so das Vergnügen(?), mich im PM auszutoben. Hoffe aber, das ändert sich bald mal, spätestens mit BonnyDOS/386 .
Abgesehen davon dürfte es diverse Tricks geben, sich auch mit einer niedrigeren Privileg-Stufe eine höhere zu erschleichen, um dann diverse Deskriptoren usw. einzurichten/zu ändern. Eine Hintertür gibt es bestimmt.
Ist aber grundsätzlich eine sehr interessante Frage, wie sowas abläuft. Leider hatte ich bisher noch nicht so das Vergnügen(?), mich im PM auszutoben. Hoffe aber, das ändert sich bald mal, spätestens mit BonnyDOS/386 .
Re: V86-Mode abschalten?
Hat BonnyDos/386 dann multiple VT's ? :D
Re: V86-Mode abschalten?
Kann ich Dir noch nicht sagen - noch brüte ich über einzelne Ideen/Gedankengänge - wie man was verwirklichen könnte usw. Bis dann überhaupt nur eine Zeile Code im Speicher steht - das dauert noch
Re: V86-Mode abschalten?
Moin.
Darüber gibt es nun auch einen Thread im Flat-Assembler-Forum:
"How to check if EMM386 is ON and switch it off?"
http://board.flatassembler.net/topic.ph ... 9260d4c05b
Dirk
Darüber gibt es nun auch einen Thread im Flat-Assembler-Forum:
"How to check if EMM386 is ON and switch it off?"
http://board.flatassembler.net/topic.ph ... 9260d4c05b
Dirk
Re: V86-Mode abschalten?
Dort hat "CandyMan" am 24.5. nun auch ein Listing dazu gepostet:freecrac hat geschrieben:Moin.
Darüber gibt es nun auch einen Thread im Flat-Assembler-Forum:
"How to check if EMM386 is ON and switch it off?"
http://board.flatassembler.net/topic.ph ... 9260d4c05b
Dirk
DirkI found this code, it worksCode: Alles auswählen
mov ax,1605h xor dx,dx xor cx,cx xor dx,dx xor si,si mov ds,si mov es,si mov di,030Ah ; windows version 3.10 int 2Fh test cx,cx ; if cx=0 we can proceed jnz some_error_handler mov ax,ds or ax,si jz some_error_handler ; address of V86 toggle function is in ds:si. we store it for later use. push ds si pop [cs:v86switch] mov ax,1608h ; send startup complete int 2Fh xor ax,ax ; curcial part: we exit protected mode call [cs:v86switch] ; by calling function 0 smsw ax ; check if protected mode is active test ax,1 ; and if so, jump to an error handler jnz some_error_handler call set4gb ; initialize flat real mode jc some_error_handler ; here we have initialised flat real mode under emm386. we can do many ; things here, but when you return do _not_ forget to restore segment ; registers because EMM386 might not like to have 4 GB segments. ; ; restoring segment limits can be done by modifying the variables used to ; initialise flat real mode and then call flat real mode init again. mov ax,1 ; switch to V86 mode with EMM function call [cs:v86switch] mov ax,1609h ; begin exit int 2Fh mov ax,1606h int 2Fh some_error_handler: mov ax,4C00h ; here is it safe to exit to dos int 21h set4gb: ;... ret v86switch dd ?