PMODE: dpl > CPL - wo liegt der Fehler?



  • Okay, was ich bisher an fehlern finden konnte:

    - Die GDT-Adresse ist nicht in Ordnung, dort ist nämlich nur der Offset im Register drin, nicht Die komplette lineare Adresse. lgdt lädt als Basis 0x00000020 rein, richtiger wäre ja 0x00090020.
    - Beim Patchen der Stellen im Datendeskriptor ist ein xor eax, eax hängen geblieben
    - Du rufst im Protected Mode den Bios Interrupt 10 auf um eine Nachricht auszugeben. BIOS-Calls gehen im Protected Mode nicht mehr



  • Hm neee den INT benutz ich vor dem schalten in den pmode! Hmm wo ist der Fehler im Code? Ich gebe doch mit lgdtr mein struct an wo die Adresse steht an, oder nicht? Darf man xor eax,eax nicht verwenden 😕

    Danke für die Mühe

    Kevin



  • Original erstellt von Surkevin:
    Hm neee den INT benutz ich vor dem schalten in den pmode!

    Sorry, war ein lesefehler 🙂

    Hmm wo ist der Fehler im Code? Ich gebe doch mit lgdtr mein struct an wo die Adresse steht an, oder nicht?

    Nur den Offset innerhalb des Segmentes 9000. Musst halt einfach noch 90000 draufaddieren.

    Darf man xor eax,eax nicht verwenden 😕

    Doch, aber nicht wenn du den wert von eax in der nächsten zeile noch brauchst 🙂



  • 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.


Anmelden zum Antworten