Seite 1 von 1
V86-Mode abschalten?
Verfasst: Mo 23. Jul 2012, 15:09
von Brueggi
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?
Re: V86-Mode abschalten?
Verfasst: Di 24. Jul 2012, 01:05
von Dosenware
V86 wird von emm aktiviert.
Re: V86-Mode abschalten?
Verfasst: Do 3. Okt 2013, 15:27
von matze79
Re: V86-Mode abschalten?
Verfasst: Fr 4. Okt 2013, 22:20
von freecrac
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
japheth: 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:
Dirk
Re: V86-Mode abschalten?
Verfasst: Mo 7. Okt 2013, 17:40
von DOSferatu
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.
Re: V86-Mode abschalten?
Verfasst: Do 10. Okt 2013, 09:15
von freecrac
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.
Ok.
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
Re: V86-Mode abschalten?
Verfasst: Fr 11. Okt 2013, 12:07
von elianda
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.
Dieser Satz macht so keinen Sinn, da der V86 Modus den aktiven PM voraussetzt.
Re: V86-Mode abschalten?
Verfasst: Sa 12. Okt 2013, 09:35
von freecrac
elianda hat geschrieben: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.
Dieser Satz macht so keinen Sinn, da der V86 Modus den aktiven PM voraussetzt.
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.
Dirk
Re: V86-Mode abschalten?
Verfasst: Sa 12. Okt 2013, 19:29
von Brueggi
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

.
Re: V86-Mode abschalten?
Verfasst: Mo 14. Okt 2013, 17:45
von matze79
Hat BonnyDos/386 dann multiple VT's ? :D
Re: V86-Mode abschalten?
Verfasst: Mo 14. Okt 2013, 18:14
von Brueggi
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?
Verfasst: Di 26. Nov 2013, 07:11
von freecrac
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
Re: V86-Mode abschalten?
Verfasst: Mo 26. Mai 2014, 01:40
von freecrac
Dort hat "CandyMan" am 24.5. nun auch ein Listing dazu gepostet:
I found this code, it works
Code: 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 ?
Dirk