V86-Mode abschalten?

Diskussion zum Thema Programmierung unter DOS (Intel x86)
Antworten
Brueggi

V86-Mode abschalten?

Beitrag 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?
Benutzeravatar
Dosenware
DOS-Gott
Beiträge: 3745
Registriert: Mi 24. Mai 2006, 20:29

Re: V86-Mode abschalten?

Beitrag von Dosenware »

V86 wird von emm aktiviert.
Benutzeravatar
matze79
DOS-Gott
Beiträge: 7910
Registriert: So 9. Sep 2012, 20:48

Re: V86-Mode abschalten?

Beitrag von matze79 »

https://www.shadowcircuit.de - Die kleine Community rund um Retro Computing
https://www.retroianer.de
freecrac
DOS-Guru
Beiträge: 861
Registriert: Mi 21. Apr 2010, 11:44
Wohnort: Hamburg Horn

Re: V86-Mode abschalten?

Beitrag 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:

Code: Alles auswählen

   smsw ax
   test ax,1
   jnz v86mode
   jmp realmode
Dirk
DOSferatu
DOS-Übermensch
Beiträge: 1220
Registriert: Di 25. Sep 2007, 12:05
Kontaktdaten:

Re: V86-Mode abschalten?

Beitrag 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.
freecrac
DOS-Guru
Beiträge: 861
Registriert: Mi 21. Apr 2010, 11:44
Wohnort: Hamburg Horn

Re: V86-Mode abschalten?

Beitrag 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
elianda
DOS-Übermensch
Beiträge: 1150
Registriert: Mi 31. Jan 2007, 19:04
Wohnort: Halle
Kontaktdaten:

Re: V86-Mode abschalten?

Beitrag 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.
Diverse Retro-Computer vorhanden.
freecrac
DOS-Guru
Beiträge: 861
Registriert: Mi 21. Apr 2010, 11:44
Wohnort: Hamburg Horn

Re: V86-Mode abschalten?

Beitrag 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
Brueggi

Re: V86-Mode abschalten?

Beitrag 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 ;-) .
Benutzeravatar
matze79
DOS-Gott
Beiträge: 7910
Registriert: So 9. Sep 2012, 20:48

Re: V86-Mode abschalten?

Beitrag von matze79 »

Hat BonnyDos/386 dann multiple VT's ? :D
https://www.shadowcircuit.de - Die kleine Community rund um Retro Computing
https://www.retroianer.de
Brueggi

Re: V86-Mode abschalten?

Beitrag 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 :-)
freecrac
DOS-Guru
Beiträge: 861
Registriert: Mi 21. Apr 2010, 11:44
Wohnort: Hamburg Horn

Re: V86-Mode abschalten?

Beitrag 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
freecrac
DOS-Guru
Beiträge: 861
Registriert: Mi 21. Apr 2010, 11:44
Wohnort: Hamburg Horn

Re: V86-Mode abschalten?

Beitrag von freecrac »

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
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
Antworten