Warum schaltet mir dieser Code nicht in den Pmode



  • Hallo!
    Warum gibt mir dieser Code weder die erste, noch die zweite MEssage aus? Was ist da alles falsch? 😞 Ich denke mal das mit dem Eintragen der Adressen der Segmente is nich so ganz richtig oder?

    [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 1000h       ;Größe 4096 Bytes entspr. 8 Sektoren    
                dw 0A00h       ;die ersten 5 Sektoren belassen und dann in 
    
    den 6. schreiben     
                db 0000h             
                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 1A00h
                db 0000h             
                db 10010010b   ;Datensegment lesbar / ausführbar     
                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
    mov [global_table+GDTSTRUCT.base], eax
    mov eax, 4 * 8
    mov [global_table+GDTSTRUCT.limit], eax
    
    ;Adresse des Codesegments in den Deskriptor eintragen
    mov ax,cs
    shl eax, 4
    add ax, start
    mov [des_code+2], ax
    xor ax,ax
    mov ax, cs
    mov [des_code+4], ax
    
    ;Adresse des Datensegments in den Deskriptor eintragen
    mov ax,ds
    shl eax, 4
    add ax, start
    mov [des_data+2], ax
    xor ax,ax
    mov ax, ds
    mov [des_data+4], ax
    
    lgdt [global_table]
    mov si, PM
    call message
    cli
    mov eax,cr0
    or eax,1
    mov cr0,eax
    db 0eah
    dw pmode
    dw 8
    
    pmode:
    mov ax,16
    mov es,ax
    
        ; Selektor für Datensegment nach DS
    mov ax,24
    mov ds,ax
        ; Stringausgabe
    mov di,(80*2)*24+(80-19)*2
    
    mov si,string
    mov cx,19
    
    showtext:
    mov al,[si]
    stosb
    inc di
    inc si
    loop showtext
    
    loop_end:
    jmp loop_end
    

    Danke für jede Hilfe

    Kevin



  • Was passiert denn anstattdessen?



  • nichts...
    Mein Bootloader lädt den Kernel und führt ihn aus...jedoch passiert dann nichts (mit anderen 16 Bit prekerneln funktioniert mein bootloader - also an dem liegts nicht)

    Da muss doch was falsch sein...

    Kevin



  • Habe den Code nun ein wenig modifiziert - "Schalten in den PM" wird jetzt ausgegeben - danach rebootet der Rechner - yeah!

    Manno 😞

    Kevin



  • Ich sollte vielleicht noch sagen was ich verändert habe:

    aus

    des_code dw 1000h
    dw 0A00h
    db 0000h
    db 10011010b
    db 11000000b
    db 0

    des_data dw 2000h
    dw 1A00h
    db 0000h
    db 10010010b
    db 11000000b
    db 0
    [/code]

    wurde

    des_code    dw 1000h       
                dw 1                  
                db 1             
                db 10011010b   
                db 11000000b        
                db 0 
    
    des_data    dw 2000h
                dw 1
                db 1             
                db 10010010b   
                db 11000000b        
                db 0
    


  • Simulier das mal auf Bochs, der Neustart klingt nach 3rd exception ohen Auffangen. Boch schreibt dann nämlich in die bochsout.txt, was der Grund für die Exception war.



  • omg das programm is aber komplex und die Hilfe is auch nich grad klein - kannst du mir schnell sagen was ich da alles einstellen muss um mein Programm zu simulieren?

    Kevin



  • Original erstellt von Surkevin:
    omg das programm is aber komplex und die Hilfe is auch nich grad klein - kannst du mir schnell sagen was ich da alles einstellen muss um mein Programm zu simulieren?

    Hm, eiegntlich ist Bochs nicht sehr komplex. Zumidnest, wenn man sichauf die wichtigen Optioonen beschränkt 🙂 Einstellen musst du wahrscheinlcih nur die Laufwerke, die Festplatte vermutlich keine und die Floppys, entweder auf die Image-Datei richten oder A: für das Diskettenlaufwerk. Das sollte eigentlich genügen. Achja, du musst noch die Pfade zu den BIOS-Dateien einstellen, die stimmen immer nicht ganz afair. Und dass er von Floppy bootet wäre auch ganz nützlich.

    Laufwerkseinstellungen:
    8. Disk Options
    BIOS-Dateien:
    6. Memory options

    Bei den Datein schau nach, ich glaub die liegen im bochs-verzeichnis, in der config steht aber sie wären in nem unterverzeichnis bios/ oder so. Das sollte ansich dann reichen.



  • Man ich krieg ne BIOS Panic :(( super 😞
    Woran kann das liegen? 😕



  • Oh jetzt gehts *g* hattest recht mit der Vermutung - jedoch den Fehler zu finden hilft mir dies auch nicht - kannst du da etwas auslesen?:

    00000000000i[MEM0 ] allocated memory at 00B40020. after alignment, vector=00B41000
    00000000000i[MEM0 ] 32.00MB
    00000000000i[MEM0 ] rom at 0xf0000/65536 ('../BIOS-bochs-latest')
    00000000000i[MEM0 ] rom at 0xc0000/32769 ('../VGABIOS-elpin-2.40')
    00000000000i[CMOS ] Setting initial clock to: Wed Apr 09 20:42:30 2003 (time0=1049913750)
    00000000000i[DMA ] channel 4 used by cascade
    00000000000i[DMA ] channel 2 used by Floppy Drive
    00000000000i[FDD ] fd0: '1.44.img' ro=0, h=2,t=80,spt=18
    00000000000i[VGA ] interval=30000
    00000000000i[VGA ] VBE Bochs Display Extension Enabled






    00000000000i[HD ] Boot device will be 'a'
    00000000000i[HD ] Floppy boot signature check is enabled

    00000000000i[KBD ] will paste characters every 1000 keyboard ticks

    00000000000i[SER ] com1 at 0x3f8/8 irq 4

    00000000000i[PAR ] parallel port 1 at 0x378




    00000004256i[BIOS ] rombios.c,v 1.85.2.1 2003/01/16 21:58:42 cbothamy Exp $
    00000330043i[KBD ] reset-disable command received
    00000506792e[HD ] device set to 0 which does not exist
    00000507085e[HD ] device set to 1 which does not exist
    00000550758i[FDD ] partial read() on floppy image returns 232/512
    00000560061e[CPU ] jump_protected: dpl > CPL
    00000560061p[CPU ] >>PANIC<< exception(): 3rd (13) exception with no resolution
    00000560061i[SYS ] Last time is 1049913751
    00000560061i[CPU ] protected mode
    00000560061i[CPU ] CS.d_b = 16 bit
    00000560061i[CPU ] SS.d_b = 16 bit
    00000560061i[CPU ] | EAX=60000011 EBX=00000007 ECX=00140002 EDX=00000000
    00000560061i[CPU ] | ESP=0000ffff EBP=00000000 ESI=00000017 EDI=0000ffe4
    00000560061i[CPU ] | IOPL=0 NV UP DI PL NZ NA PE NC
    00000560061i[CPU ] | SEG selector base limit G D
    00000560061i[CPU ] | SEG sltr(index|ti|rpl) base limit G D
    00000560061i[CPU ] | DS:9000( 0000| 0| 0) 00090000 0000ffff 0 0
    00000560061i[CPU ] | ES:9000( 0000| 0| 0) 00090000 0000ffff 0 0
    00000560061i[CPU ] | FS:0000( 0000| 0| 0) 00000000 0000ffff 0 0
    00000560061i[CPU ] | GS:0000( 0000| 0| 0) 00000000 0000ffff 0 0
    00000560061i[CPU ] | SS:4000( 0000| 0| 0) 00040000 0000ffff 0 0
    00000560061i[CPU ] | CS:9000( 0000| 0| 0) 00090000 0000ffff 0 0
    00000560061i[CPU ] | EIP=000000ba (000000ba)
    00000560061i[CPU ] | CR0=0x60000011 CR1=0x00000000 CR2=0x00000000
    00000560061i[CPU ] | CR3=0x00000000 CR4=0x00000000

    00000560061i[CTRL ] quit_sim called with exit code 1

    Wäre echt nett

    Kevin



  • Wichtig ist die Zeile vor der Exception:

    00000560061e[CPU ] jump_protected: dpl > CPL
    00000560061p[CPU ] >>PANIC<< exception(): 3rd (13) exception with no resolution
    

    Siehe da: Ein Interlevel-Sprung, ohne dass der Privileg Level stimmte. Habe gerade keine Zeit das nachzuchecken, aber vielelicht hilft dir diese Info ja schonmal. Check mal die DPL-Felder in den Selektoren ab.



  • Hmmm nur wo könnte dies in meinem Code der Fall sein? Wenn ich die Adresse eintrage könnte dies sein, aber wenn ich dies weglasse kommt der selbe Fehler - wieso? 😕



  • Bochs dumpt ja noch die Register:

    00000560061i[CPU ] | EIP=000000ba (000000ba)
    

    sieht irgendwie aus, als wenn der EIP sich verlaufen hat, auf 000000ba liegt dohc nicht dein code, oder?



  • HM allerdings merkwürdig - aber wo veränder ich denn die Adresse von meim Codesegment? Grml man zum ausrasten 😞



  • hab jetzt nicht alles genau studiert, aber mein Tipp wäre, nicht das BIOS für die Ausgabe zu nutzen.
    Ich würde jetzt mal so vermuten, dass die BIOS-Funktionen in 16-Bit-Code geschrieben sind, für den RM, wenn du die nun mal einfach aufrufst, finde ich es nicht sehr verwunderlich, dass das exceptions gibt.

    Ich hab damals den Text einfach in den Graphikspeicher geschrieben.

    mfg
    -bg-


Anmelden zum Antworten