Lowlevel
Lowlevel => Lowlevel-Coding => Thema gestartet von: Bassai 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?
-
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....
-
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
-
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.
-
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^^
-
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 ?
-
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
-
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.
??
-
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
-
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
-
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 ??
-
Strg-Alt-Enft bringt nichts weil das nicht vom PC kommt sondern von DOS/Windows (mitlerweile haben sich auch schon einige andere Betriebsyssteme angepasst)
-
Und wie ist es mit dem Lämpchen ?
-
Ich würd einfach ma behaupten das liegt daran das der Motor nich ausgeschaltet wird?
-
Das Cli sperrt nur die Hardwareinterrupts!
Software-Interrupts können trotzdem aufgerufen werden!
Durch CLI wird nur die Signalleitung zum PIC gesperrt :)
-
Stimmt das cli setztz ja nur nen Flag *grins*
-
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.
-
Ja klar aber im Pm zieht das ja nich mehr da muss mans halt ins os einbauen.
-
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
-
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...