PMODE: dpl > CPL - wo liegt der Fehler?



  • hmmm wieso 90000, vertippt?



  • Hmm ich habe jetzt folgende Veränderungen vorgenommen:

    start:
    mov ax, cs
    mov ds, ax
    mov es, ax
    mov eax, des_null
    add eax, 90000h
    mov [global_table+GDTSTRUCT.base], eax
    mov eax, 4 * 8
    mov [global_table+GDTSTRUCT.limit], eax

    und dann das xor ax,ax noch rausgenommen - jetzt ist der Fehler:
    00000560063e[CPU ] jump_protected: gate type 14 unsupported

    hmm komisch 😕

    Kevin



  • Original erstellt von Surkevin:
    hmmm wieso 90000, vertippt?

    90000 weil der code im segment 9000 liegt. Die lineare Adresse dafür ist ja * 16 also 90000. Den Rest gucke ich mir morgen an 🙂



  • hmm oki 😃
    das is bestimmt dezimal also habe ich in meinem code add eax, 90000h durch add eax, 90000 ersetzt...der fehler ist nun
    00000560063e[CPU ] jump_protected: gate type 0 unsupported

    Nochmal vielen Dank

    Kevin



  • TriPhoenix kannst du dir vorstellen warum dieser Fehler kommt?



  • Original erstellt von Surkevin:
    **hmm oki 😃
    das is bestimmt dezimal also habe ich in meinem code add eax, 90000h durch add eax, 90000 ersetzt...der fehler ist nun
    **

    ahhh nicht dezimal *g* Ich vergesse imemr 0x bzw. h dranzuschreiben *g*

    Im übrigen läuft es jetzt bei mir. Mit 0x90000 natürlich 🙂

    [ Dieser Beitrag wurde am 24.04.2003 um 23:56 Uhr von TriPhoenix editiert. ]



  • Hm wieso das? Bei mir gehts nicht...kannst du mal den Code posten? Bei mir kommt mit 0x90000 Gate Type 14 unsupported!!

    Mein Code:

    [BITS 16]
    [ORG 0]
    
    jmp start
    
    PM db 'Schalten in Pmode',13,10,0
    string db 'Hallo aus dem Pmode',13,10,0
    
    struc GDTSTRUCT
    
    .limit: resw 1 
    .base: resd 1 
    
    endstruc
    
    global_table:
        istruc GDTSTRUCT 
        at GDTSTRUCT.limit, dw 1
        at GDTSTRUCT.base, dd 1
        iend
    
    des_null    dw 0000h            
                dw 0000h            
                db 00h              
                db 00000000b        
                db 00000000b        
                db 0 
    
    des_code    dw 9FFFh       ;Größe 4096 Bytes entspr. 8 Sektoren    
                dw 1       ;die ersten 5 Sektoren belassen und dann in den 6. 
    
    schreiben     
                db 1            
                db 10011010b   ;Codesegment lesbar / ausführbar     
                db 11000000b        
                db 0 
    
    des_vram    dw 4000h           
                dw 8000h            
                db 0Bh             
                db 10010010b        
                db 11000000b        
                db 0     
    
    des_data    dw 2000h
                dw 1
                db 1             
                db 10010010b   ;Datensegment lesbar / ausführbar     
                db 11000000b        
                db 0  
    
    des_kernel dw 0200h
               dw 1
               db 1
               db 10010010b 
           db 11000000b
               db 0
    
    message:  
    lodsb
    or al,al
    jz done
    mov ah, 0Eh
    mov bx, 7
    INT 10h
    jmp message
    
    done:
    retn
    
    start:
    mov ax, cs
    mov ds, ax
    mov es, ax
    mov eax, des_null
    add eax, 0x90000
    mov [global_table+GDTSTRUCT.base], eax
    mov eax, 28h
    mov [global_table+GDTSTRUCT.limit], eax
    
    ;Adresse des Codesegments in den Deskriptor eintragen
    mov eax, 0
    mov ax, cs
    shl eax, 04h
    mov [des_code+2], ax
    shr eax, 10h
    mov [des_code+4], al
    mov [des_code+7], ah
    
    ;Adresse des Datensegments in den Deskriptor eintragen
    mov ax,ds
    shl eax, 4
    mov [des_data+2], ax
    shr eax,10h
    mov [des_data+4], al
    mov [des_data+7], ah
    
    lgdt [global_table]
    mov si, PM
    call message
    cli
    mov eax,cr0
    or eax,1
    xor eax,eax
    mov eax, 0x00000001
    mov cr0,eax
    db 0eah
    dw pmode
    dw 8
    
    pmode:
    
    loop_end:
    jmp loop_end
    

    THX

    Kevin



  • mov [global_table+GDTSTRUCT.base], eax
    mov eax, 28h
    mov [global_table+GDTSTRUCT.limit], eax
    

    Waurm plötzlich 28h?
    Im alten Code ists 4*8=32=20h.

    mov eax,cr0
    or eax,1
    xor eax,eax
    mov eax, 0x00000001
    mov cr0,eax
    

    Das kann man etwas kompaktieren, sieht aus wie debug-versuche 🙂 Was stehen bleiben muss ist:

    mov eax,cr0
    or eax,1
    mov cr0,eax
    

    Das sind eigentlich alle unterschiede zu dem was ich hier stehen habe. Gucks mir morgen sonst nochmal an...



  • Hmm so geändert wie du es jetzt sagtest -immernoch gate type 14 unsupported! Stimmt ist ein Debugversuch weil in Bochs steht mit deiner Art in cr0 0x60000011 und auf meine 0x00000011 😕
    Nenene du 🙂

    Nochmal danke 😃

    Kevin



  • Original erstellt von Surkevin:
    **Stimmt ist ein Debugversuch weil in Bochs steht mit deiner Art in cr0 0x60000011 und auf meine 0x00000011 😕
    **

    Joah, dann haste den Cache mit eingeschaltet 🙂



  • lol was hab ich denn noch alles unbewusst gemacht? Ein Gate Typ 14 benutzt - nen Cache angeschalten....lol - manno aber ich weiß trotzdem nicht was an dem super code falsch is 😞



  • Hi.

    Ist das noch niemandem aufgefallen?

    Hier:

    struc GDTSTRUCT
    
    .limit: resw 1 
    .base: resd 1 
    
    endstruc
    
    ...
    ...
    
    mov [global_table+GDTSTRUCT.base], eax
    mov eax, 28h
    mov [global_table+GDTSTRUCT.limit], eax
    

    Zuerst wird die Base mit einem DWord gefuellt... OK.
    Danach wird ein DWord ins Limit geschrieben...
    IMHO wird dabei Das LowWord der Base ueberschrieben!

    BTW: Hier stimmt IMHO auch einiges nicht:

    des_code    dw 9FFFh       ;Größe 4096 Bytes entspr. 8 Sektoren    
                dw 1       ;die ersten 5 Sektoren belassen und dann in den 6. 
    
    schreiben     
                db 1            
                db 10011010b   ;Codesegment lesbar / ausführbar     
                db 11000000b        
                db 0
    

    Wieso ist da das G-Bit gesetzt?
    Mal ganz abgesehen davon, waere die angegebene Segmentgroesse auch bei geloeschtem G-Bit >4096 Byte. 😕 (Das waeren 1000h)



  • Danke!
    Da hast du natürlich vollkommen Recht!
    Jetzt ist es:
    mov [global_table+GDTSTRUCT.base], eax
    xor eax,eax
    mov ax, 20h
    mov [global_table+GDTSTRUCT.limit], ax

    Das mit dem 4096 hatte ich nur vorher definiert und wollte es nun zu testzwecken größer haben!

    Kevin



  • So jetzt habe ich das G-Bit angelassen aber aus eax ax gemacht und siehe da! Keine 3rd exception! Jetzt probiere ich noch ob das mit dem Videoram geht um zu sehen ob auch alles geht - wenn nich dürft ihr wieder helfen *g*

    nochmal danke an ALLE

    Kevin



  • Hm ich glaub meine GDT is falsch oder so! Wenn ich diesen Code benutze (nachm pmode label) bekomm ich folgenden Fehler:

    00000560071i[CPU ] write_virtual_checks(): write beyond limit, r/w
    00000560071p[CPU ] >>PANIC<< exception(): 3rd (13) exception with no resolution
    00000560071i[SYS ] Last time is 1051301860
    00000560071i[CPU ] protected mode
    00000560071i[CPU ] CS.d_b = 32 bit
    00000560071i[CPU ] SS.d_b = 16 bit
    00000560071i[CPU ] | EAX=c08e0010 EBX=00000007 ECX=048a0013 EDX=00000000
    00000560071i[CPU ] | ESP=00000004 EBP=00000000 ESI=ff310017 EDI=31660f7a
    00000560071i[CPU ] | IOPL=0 NV UP DI PL ZR NA PE NC
    00000560071i[CPU ] | SEG selector base limit G D
    00000560071i[CPU ] | SEG sltr(index|ti|rpl) base limit G D
    00000560071i[CPU ] | DS:9000( 0000| 0| 0) 00090000 0000ffff 0 0
    00000560071i[CPU ] | ES:9000( 0000| 0| 0) 00090000 0000ffff 0 0
    00000560071i[CPU ] | FS:0000( 0000| 0| 0) 00000000 0000ffff 0 0
    00000560071i[CPU ] | GS:0000( 0000| 0| 0) 00000000 0000ffff 0 0
    00000560071i[CPU ] | SS:4000( 0000| 0| 0) 00040000 0000ffff 0 0
    00000560071i[CPU ] | CS:0008( 0001| 0| 0) 00090000 00009fff 1 1
    00000560071i[CPU ] | EIP=000000ef (000000ef)
    00000560071i[CPU ] | CR0=0x00000011 CR1=0x00000000 CR2=0x00000000
    00000560071i[CPU ] | CR3=0x00000000 CR4=0x00000000


    00000560071i[CTRL ] quit_sim called with exit code 1

    der code:

    pmode:
    mov ax, 24 ;Datensegment Selektor
    mov ds,ax

    mov ax, 16 ;VideoRAM Selektor
    mov es, ax

    mov si, string
    xor di,di
    mov di, (80*2)*24+(80-19)*2 ; -19 steht für -die Stringlänge
    xor ecx,ecx
    mov cx, 19

    showtext:
    mov al, [si]
    stosb
    inc di
    inc si
    loop showtext

    loop_end:
    jmp loop_end

    Kann mir das nit erklären.....manmanman 😞
    TriPhoenix muss ran 😃

    Danke

    Kevin



  • Hast Du das GBit im Codesegment-Descriptor immernoch gesetzt?
    So weit ich das sehe assemblierst Du nach dem PM-Label 16Bit-Code... Das wuerde sich dann ein bissel beissen.
    Also: Entweder G-Bit loeschen oder 32Bit-Code benutzen.



  • Original erstellt von Nobuo T:
    Hast Du das GBit im Codesegment-Descriptor immernoch gesetzt?
    So weit ich das sehe assemblierst Du nach dem PM-Label 16Bit-Code... Das wuerde sich dann ein bissel beissen.
    Also: Entweder G-Bit loeschen oder 32Bit-Code benutzen.

    Was ist an Granularity und 16-Bit code so beißig? Klar man kann nicht alles adressieren ohne address size prefix, aber machbar ists doch.



  • Ups...
    Wars net das GBit, von dem abhaengt, ob 32 oder 16Bit code erwartet wird? 🙄
    Bleibt ja dann nur noch das DBit, das war hier schliesslich auch gesetzt...



  • Original erstellt von Nobuo T:
    Ups...
    Wars net das GBit, von dem abhaengt, ob 32 oder 16Bit code erwartet wird? 🙄
    Bleibt ja dann nur noch das DBit, das war hier schliesslich auch gesetzt...

    Okay, das akzeptiere ich (auch B-Bit für Datensegmente genannt afair) 😃



  • Das G-Bit besagt ob die max Größe bei 0 1MB oder bei 1 4GB ist! Das D-Bit besagt ob das Segment < oder > als 64kb ist! Letzteres gehört zum DPL! Ich habe es mal auf 1 gestellt => DPL verändert => Bochs sagt mir DPL != CPL! Also ich denk nicht dass das der Fehler ist! Das G-Bit habe ich immernoch gesetzt! Wo benutze ich denn 16bit Code was ich nicht darf? 😕

    Kevin


Anmelden zum Antworten