Autor Thema: AMI Bios und Protected Mode geht nicht  (Gelesen 9301 mal)

Bassai

  • Beiträge: 13
    • Profil anzeigen
Gespeichert
« am: 02. August 2004, 19:30 »
Hi

Ich habe ein seltsames Problem:
Beim Booten meines Bootloaders hängt sich mein Computer auf.
Bei anderen Rechnern funktioniert alles.
Nun habe ich folgendes festgestellt:
Award Bios - geht
Ami Bios - geht nicht
A20 funktioniert bei beiden, nur irgendwie schafft das Ami Bios den Sprung in den PMode nicht :( weiß jemand an was das liegen kann oder hat jemand schon ähnliche Probleme gehabt?

TeeJay

  • Beiträge: 630
    • Profil anzeigen
    • http://www.jay-code.de
Gespeichert
« Antwort #1 am: 02. August 2004, 20:21 »
Also am BIOS kann es eigentlich nicht liegen, da das Springen in den PMode eigentlich keine BIOS-Interrupts benutzt und daher auch nicht vom BIOS abhängig sein dürfte....
----------------------
Redakteur bei LowLevel

Roshl

  • Beiträge: 1 128
    • Profil anzeigen
    • http://www.lowlevel.net.tc
Gespeichert
« Antwort #2 am: 03. August 2004, 09:56 »
weisst du denn wo er stehn bleibt? oder macht er einfach nen neustart?
versuche mal nach jedem wichtigen Code-Abschnitt eine ausgabe einzubaun. also nach dem stack einrichten->'a' ausgaben usw, je klein schrittiger du das machst, desto besser weisst du woran es liegt. Das ist Debugging ohne debugger;) is hilfreich mach das mal vielleicht kannst uns ja dann den betreffenden code posten, bei mir macht bochs kein stück weiter sobald ich int 13h mache mit subroutine sektoren lesen
[schild=1]Wieder ein wertvoller(?) Beitrag von Roshl[/schild]

Limbo

  • Beiträge: 16
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 05. August 2004, 15:05 »
Also ich mein Rechner hat AwardBios und bei mir geht's (immer noch) nicht.
Scheint also ein anderes Problem zu sein ...

Ich hab Netz daher mal nach einem anderem Tutorial zum Thema PM usw. gesucht :

http://hem.passagen.se/gregge/index_hires.html

4 Tuturials, u.a.  Bootloader, PM, Ckernel
Ist in "Easy English" geschrieben, das verstehe ich sogar :-)

Allerdings funktionert dieser PM-Code bei mir genauso wenig wie TeeJay's.
Gleiches Problem wie Bassai. Der Ckernel-Code wiederrum funktionert bei mir von dieser Page, auch dort wird in den PM geschaltet.

Ich werde mal Roshl Methode (Debugging ohne Debugger) probieren, wenn mir was auffällt werde ich es hier posten.

Roshl

  • Beiträge: 1 128
    • Profil anzeigen
    • http://www.lowlevel.net.tc
Gespeichert
« Antwort #4 am: 05. August 2004, 15:41 »
Manchmal reicht ein falsches Bit aus damit nix geht, mein Problem hab ich nun auch beseitigt. Man sollte den PIC nicht umprogrammieren wenn man den Int 13h noch braucht-.- ne begründung warum wäre mir jetzt zu lang;):P aber ich weiss es^^
[schild=1]Wieder ein wertvoller(?) Beitrag von Roshl[/schild]

Limbo

  • Beiträge: 16
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 05. August 2004, 16:18 »
Hi !

Ich hab jetzt versucht dem Problem auf die Spur kommen ...
Ich hab den Protected Mode Code von obigen Link genommen, ich glaube der ist einfacher zu debuggen (nach Roshl Methode), da nur eine Datei. Also der folgende Code ist ein Bootloader in dem bereits in den PM geschaltet wird :

[BITS 16]       ; We need 16-bit intructions for Real mode

[ORG 0x7C00]    ; The BIOS loads the boot sector into memory location 0x7C00

        cli                     ; Disable interrupts, we want to be alone
                mov si, msg
                call putstr     ; Meldung ausgeben
       
        xor ax, ax
                mov si, msg
                call putstr     ; Meldung ausgeben
       
        mov ds, ax              ; Set DS-register to 0 - used by lgdt
                mov si, msg
                call putstr     ; Meldung ausgeben

        lgdt [gdt_desc]         ; Load the GDT descriptor
                mov si, msg
                call putstr     ; Meldung ausgeben

        mov eax, cr0            ; Copy the contents of CR0 into EAX
                mov si, msg
                call putstr     ; Meldung ausgeben
       
        or eax, 1               ; Set bit 0
                mov si, msg
                call putstr     ; Meldung ausgeben
       
        mov cr0, eax            ; Copy the contents of EAX into CR0
                mov si, msg
                call putstr     ; Meldung ausgeben

        jmp 08h:clear_pipe      ; Jump to code segment, offset clear_pipe
       
        msg db "TEST",13,10,0
        msg2 db "TEST2",13,10,0
putstr:
        lodsb             ; Byte laden
        or al,al
        jz short putstrd  ; 0-Byte? -> Ende!

        mov ah,0x0E       ; Funktion 0x0E
        mov bx,0x0007     ; Attribut-Byte (wird nicht benötigt)
        int 0x10          ; schreiben
        jmp putstr        ; Nächstes Byte
putstrd:
        retn

[BITS 32]                       ; We now need 32-bit instructions
clear_pipe:
        mov ax, 10h             ; Save data segment identifyer
                mov si, msg2
                call putstr     ; Meldung ausgeben
       
        mov ds, ax              ; Move a valid data segment into the data segment register
                mov si, msg2
                call putstr     ; Meldung ausgeben
       
        mov ss, ax              ; Move a valid data segment into the stack segment register
                mov si, msg2
                call putstr     ; Meldung ausgeben
       
        mov esp, 090000h        ; Move the stack pointer to 090000h
                mov si, msg2
                call putstr     ; Meldung ausgeben
       
        mov byte [ds:0B8000h], 'P'      ; Move the ASCII-code of 'P' into first video memory
                mov si, msg2
                call putstr             ; Meldung ausgeben
       
        mov byte [ds:0B8001h], 1Bh      ; Assign a color code
                mov si, msg2
                call putstr             ; Meldung ausgeben
     
hang:
        jmp hang                ; Loop, self-jump
               
gdt:                            ; Address for the GDT

gdt_null:                       ; Null Segment
        dd 0
        dd 0

gdt_code:               ; Code segment, read/execute, nonconforming
        dw 0FFFFh
        dw 0
        db 0
        db 10011010b
        db 11001111b
        db 0

gdt_data:               ; Data segment, read/write, expand down
        dw 0FFFFh
        dw 0
        db 0
        db 10010010b
        db 11001111b
        db 0

gdt_end:                ; Used to calculate the size of the GDT

gdt_desc:                       ; The GDT descriptor
        dw gdt_end - gdt - 1    ; Limit (size)
        dd gdt                  ; Address of the GDT

times 510-($-$$) db 0           ; Fill up the file with zeros

        dw 0AA55h               ; Boot sector identifyer


Wie man sieht, lasse ich nach fast jedem Befehl eine Message ausgeben.
Wenn ich den Code von ner Diskette boote, bekomme ich 2 Meldungen ausgegeben. Nachdem das DS auf 0 gesetzt wird passiert nix mehr. Findet er nun
den String nicht mehr oder hängt er sich hier auf ?

Roshl

  • Beiträge: 1 128
    • Profil anzeigen
    • http://www.lowlevel.net.tc
Gespeichert
« Antwort #6 am: 05. August 2004, 16:28 »
ne so gehts nich^^ nach jedem befehlsblock! erst machste xor ax,ax dann mov ds,ax wenn das putstr dazwischen nun das ax ändert funzt es nich! das kannste nur dann machen wenn de sicher biste das nirgendswo lebenswichtige daten stehn
[schild=1]Wieder ein wertvoller(?) Beitrag von Roshl[/schild]

Limbo

  • Beiträge: 16
    • Profil anzeigen
Gespeichert
« Antwort #7 am: 05. August 2004, 19:27 »
Hast natürlich Recht, AX wird ja in Putstr "verfälscht".

Ich hab jetzt wieder fast alle Meldungen rausgenommen, bis auf hinter cli (nur um zu sehen ob er überhaupt was ausgibt (ja, er tut's !))  und hinter [Bits 32].
Da gibt aber nichts aus ! Innerhalb des 16-Bit-Code konnte ich keine weitere Meldung ausgeben lassen, da er sonst 'nen Reboot macht.

??

Limbo

  • Beiträge: 16
    • Profil anzeigen
Gespeichert
« Antwort #8 am: 05. August 2004, 19:47 »
Hier noch mal der Code :

[BITS 16]       ; We need 16-bit intructions for Real mode

[ORG 0x7C00]    ; The BIOS loads the boot sector into memory location 0x7C00

        cli
                mov si, msg2
                call putstr     ; Meldung ausgeben
                                ; Disable interrupts, we want to be alone
        xor ax, ax
        mov ds, ax              ; Set DS-register to 0 - used by lgdt
        lgdt [gdt_desc]         ; Load the GDT descriptor
        mov eax, cr0            ; Copy the contents of CR0 into EAX
        or eax, 1               ; Set bit 0
        mov cr0, eax            ; Copy the contents of EAX into CR0
        jmp 08h:clear_pipe      ; Jump to code segment, offset clear_pipe
       
        msg db "TEST",13,10,0
        msg2 db "TEST2",13,10,0
putstr:
        lodsb             ; Byte laden
        or al,al
        jz short putstrd  ; 0-Byte? -> Ende!

        mov ah,0x0E       ; Funktion 0x0E
        mov bx,0x0007     ; Attribut-Byte (wird nicht benötigt)
        int 0x10          ; schreiben
        jmp putstr        ; Nächstes Byte
putstrd:
        retn

[BITS 32]                       ; We now need 32-bit instructions
clear_pipe:
                mov si, msg2
                call putstr     ; Meldung ausgeben
        mov ax, 10h             ; Save data segment identifyer
        mov ds, ax              ; Move a valid data segment into the data segment register
        mov ss, ax              ; Move a valid data segment into the stack segment register
                mov si, msg2
                call putstr     ; Meldung ausgeben
       
        mov esp, 090000h        ; Move the stack pointer to 090000h
                ;mov si, msg2
                ;call putstr     ; Meldung ausgeben
       
        mov byte [ds:0B8000h], 'P'      ; Move the ASCII-code of 'P' into first video memory
                ;mov si, msg2
                ;call putstr             ; Meldung ausgeben
       
        mov byte [ds:0B8001h], 1Bh      ; Assign a color code
                ;mov si, msg2
                ;call putstr             ; Meldung ausgeben
       

hang:
        jmp hang                ; Loop, self-jump
               
gdt:                            ; Address for the GDT

gdt_null:                       ; Null Segment
        dd 0
        dd 0

gdt_code:               ; Code segment, read/execute, nonconforming
        dw 0FFFFh
        dw 0
        db 0
        db 10011010b
        db 11001111b
        db 0

gdt_data:               ; Data segment, read/write, expand down
        dw 0FFFFh
        dw 0
        db 0
        db 10010010b
        db 11001111b
        db 0

gdt_end:                ; Used to calculate the size of the GDT



gdt_desc:                       ; The GDT descriptor
        dw gdt_end - gdt - 1    ; Limit (size)
        dd gdt                  ; Address of the GDT

times 510-($-$$) db 0           ; Fill up the file with zeros

        dw 0AA55h               ; Boot sector identifyer

Roshl

  • Beiträge: 1 128
    • Profil anzeigen
    • http://www.lowlevel.net.tc
Gespeichert
« Antwort #9 am: 05. August 2004, 20:03 »
Also der kann da auch nix ausgeben weil du per cli die Interrupts ausschaltest!!! und dein putstr nimmt nunmal einen int zuhilfe;)
Wieso der hinter dem cli das ausgibt frag ich mich sowieso dürfte doch garnich gehn hmmm
Und nach mov cr0,eax bist du schon im pm also gehen da int Int erst recht nicht, du hsat keine IDT also kann er auch nicht wissen wohin er soll wenn er int bekommt, aber deaktiviert sind sie trotzdem, und das ist auch gut so, weil du sonst 18,2 mal in der Sekunde einen Tripple Fault hättest was einen Neustart bedeutet, und ansonsten 32 Bit und 16 Bit in einem Stück zu mischen is gefährlich wenn man ncih genau weiss was sache ist, also trenn das lieber irgendwie sonst kann nasm die Adresse nicht Richtig berechnen weil sich die Segmente überhaupt nicht vertragen
[schild=1]Wieder ein wertvoller(?) Beitrag von Roshl[/schild]

Limbo

  • Beiträge: 16
    • Profil anzeigen
Gespeichert
« Antwort #10 am: 05. August 2004, 23:04 »
Hi Roshl, vielen Dank soweit !

Das mit den Int's klingt einleuchtend, das mit dem Trennen von 32 Bit und 16 Bit lass ich erstmal lieber noch, ich glaub so weit bin ich noch nicht ...

Aber ein Frage möchte ich noch loswerden :

Wenn Du / Ihr den Code aus dem PM-Tutorial von TeeJay laufen lasst, ist das dann  bei euch auch so, daß das Lämpchen vom Diskettenlaufwerk weiterleuchtet und der Computer dann hängt (Strg-Alt-Entf bringt nichts) ??

Ich vermute, daß der obige Code bzw. der von TeeJay eigentlich auch bei mir funktionert, nur das halt irgendwie kein Zeichen ausgegeben wird und durch das weiterleuchten vom Diskettenlaufwerk es nur den Anschein hat das er 'hängt'.

Also wie sieht das bei euch aus ??

Another Stupid Coder

  • Beiträge: 749
    • Profil anzeigen
Gespeichert
« Antwort #11 am: 05. August 2004, 23:40 »
Strg-Alt-Enft bringt nichts weil das nicht vom PC kommt sondern von DOS/Windows (mitlerweile haben sich auch schon einige andere Betriebsyssteme angepasst)

Limbo

  • Beiträge: 16
    • Profil anzeigen
Gespeichert
« Antwort #12 am: 05. August 2004, 23:52 »
Und wie ist es mit dem Lämpchen ?

lobmann

  • Beiträge: 243
    • Profil anzeigen
    • http://www.fallek.de.vu
Gespeichert
« Antwort #13 am: 06. August 2004, 00:10 »
Ich würd einfach ma behaupten das liegt daran das der Motor nich ausgeschaltet wird?
Man kann doch nem alten Mann nicht in den Bart spucken und sagen es hat geschneit

TeeJay

  • Beiträge: 630
    • Profil anzeigen
    • http://www.jay-code.de
Gespeichert
« Antwort #14 am: 06. August 2004, 01:50 »
Das Cli sperrt nur die Hardwareinterrupts!

Software-Interrupts können trotzdem aufgerufen werden!

Durch CLI wird nur die Signalleitung zum PIC gesperrt :)
----------------------
Redakteur bei LowLevel

Roshl

  • Beiträge: 1 128
    • Profil anzeigen
    • http://www.lowlevel.net.tc
Gespeichert
« Antwort #15 am: 06. August 2004, 11:44 »
Stimmt das cli setztz ja nur nen Flag *grins*
[schild=1]Wieder ein wertvoller(?) Beitrag von Roshl[/schild]

mastermesh

  • Beiträge: 341
    • Profil anzeigen
    • http://www.kostenloser-laptop.de/
Gespeichert
« Antwort #16 am: 06. August 2004, 12:01 »
Zitat
Another Stupid Coder postete
Strg-Alt-Enft bringt nichts weil das nicht vom PC kommt sondern von DOS/Windows (mitlerweile haben sich auch schon einige andere Betriebsyssteme angepasst)
Stimmt nicht ;)

Strg-Alt-Entf ist eine Tastenkombination, die vom BIOS abgefangen wird und einen Reboot verursacht. Wenn ich mich nicht irre, gibts da sogar nen extra Interrupt dazu, wo du deine eigenen Routinen dranklemmen kannst.

lobmann

  • Beiträge: 243
    • Profil anzeigen
    • http://www.fallek.de.vu
Gespeichert
« Antwort #17 am: 06. August 2004, 12:07 »
Ja klar aber im Pm zieht das ja nich mehr da muss mans halt ins os einbauen.
Man kann doch nem alten Mann nicht in den Bart spucken und sagen es hat geschneit

Roshl

  • Beiträge: 1 128
    • Profil anzeigen
    • http://www.lowlevel.net.tc
Gespeichert
« Antwort #18 am: 06. August 2004, 12:15 »
strg+alt+entf muss im Tastaturinterrupt abgefangen werden, also da wo IRQ 1 Hinzeigt. Wenn da nicht drinsteht das  die Kombi einen Neustart verursacht, dann passiert auch nix
[schild=1]Wieder ein wertvoller(?) Beitrag von Roshl[/schild]

Another Stupid Coder

  • Beiträge: 749
    • Profil anzeigen
Gespeichert
« Antwort #19 am: 06. August 2004, 13:24 »
Hm...da ich eigentlich ziemlich am Anfang GRUB genommen habe um in den PMode zu springen kenn ich mich mit dem RM zeug nicht wirklich aus (lerne ich jetzt gerade nach ;) ) Also sorry für die falsche angabe...

 

Einloggen