Autor Thema: OS loader / kernel läuft nicht  (Gelesen 16061 mal)

elfish_rider

  • Beiträge: 293
    • Profil anzeigen
Gespeichert
« am: 20. September 2004, 14:49 »
Dieser OS loader / kernel funktioniert auf einem 8086 Emulator, jedoch NICHT auf einer echten Pentium-CPU: Wo liegt das Problem?

(Ich habe denselben programmiert, bevor ich auf das Lowlevel-Magazin gestossen bin)

1440k Raw-Floppy

Sektor 1 (Bootsektor bei 7C00):

   
ORG 7C00h

MOV BX, 9FF0h ; STACK IN 9FF00:0000 initialisieren
MOV SS, BX
MOV SP, 0

MOV AH, 00h
INT 13h

MOV AX, 0201h
MOV CX, 0002h
MOV DX, 0000h
MOV BX, 0050h
MOV ES, BX
MOV BX, 0000h

INT 13h
JMP 0050h:0000h
Sektor 2:

   

ORG 0000h

MOV AH, 00h
INT 13h

MOV AX, 0201h
MOV CX, 0003h
MOV DX, 0000h
MOV BX, 0052h
MOV ES, BX
MOV BX, 0

INT 13h
JMP 0052h:0000h

Sektor 3:

   


ORG 0000h
JMP start

msg_boot_complete DB 'xxxx 1.0.0001u', 13, 10, 'Copyright 2004 xxxxxx xxxxxxx', 13, 10, 'All rights reserved'

start

MOV BX, 0052h
MOV DS, BX

MOV AX, 0003h
INT 10h

MOV AX, 0600h
MOV BH, 00h
MOV CX, 0000h
MOV DH, 24
MOV DL, 79
INT 10h

MOV BX, DS
MOV ES, BX
MOV BP, msg_boot_complete
MOV AX, 1301h
MOV BX, 0000000000001111b
MOV CX, 66
MOV DX, 0000h
INT 10h

MOV AH, 00h
INT 16h

JMP start

joachim_neu

  • Beiträge: 1 228
    • Profil anzeigen
    • http://www.joachim-neu.de
Gespeichert
« Antwort #1 am: 20. September 2004, 16:29 »
du überschreibst mit org 0000 die interrupt vektoren, die du im echten laufen brauchst, bei bochs und anderen emuls aber nicht!!! org 0x0050 ist das frühste, was geht!!!
http://www.joachim-neu.de | http://www.orbitalpirates.de | http://www.middleageworld.de

System: 256 RAM, GeForce 2 MX 400, AMD Athlon XP 1600+, Windows XP, 1x Diskette, 1x DVD-ROM, 1x CD-R(W) Brenner,...

joachim_neu

  • Beiträge: 1 228
    • Profil anzeigen
    • http://www.joachim-neu.de
Gespeichert
« Antwort #2 am: 20. September 2004, 16:31 »
oder ich täusche mich...

@all: gute methode in den kernel zu kommen, mit "JMP 0050h:0000h" statt mit dem stack push,... und dann ret!!!
http://www.joachim-neu.de | http://www.orbitalpirates.de | http://www.middleageworld.de

System: 256 RAM, GeForce 2 MX 400, AMD Athlon XP 1600+, Windows XP, 1x Diskette, 1x DVD-ROM, 1x CD-R(W) Brenner,...

elfish_rider

  • Beiträge: 293
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 20. September 2004, 17:03 »
Ich lade es nach 00500, also sollte ich keine Vektoren überschreiben.

elfish_rider

  • Beiträge: 293
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 20. September 2004, 17:08 »
Was eventuell noch von Bedeutung ist: Die Leuchtanzeige des Diskettenlauferks leuchtet konstant, wenn das Booten (bei echter CPU) fehlschlägt. Nicht passiert.

Roshl

  • Beiträge: 1 128
    • Profil anzeigen
    • http://www.lowlevel.net.tc
Gespeichert
« Antwort #5 am: 20. September 2004, 18:17 »
Sorry joachim aber da haste nicht Recht mit dem org:
Das org hat nix damit zu tun wo er das Zeug hinschreibt, das ist nur für den Compiler damit er die Adressen richtig berechnen kann.

Das Problem liegt vielleicht hier:
MOV BX, 9FF0h
MOV SS, BX
MOV SP, 0

SP ist bei dir 0, ein Stack wächst allerdings nach unten, dumm nur wenn der Zeiger schon ganz unten ist gell? Der Emulator bastelt sich das einfach um also mach bei einem dec praktisch ein 0xFFFF draus der richtige Prozessor jedoch dürfte damit arge Probleme haben.

PS: Kleiner Optimierungshinweis, statt mov ???,0 ist besser xor ???,??? zu verwenden, spart Bytes und Takte, also besser xor bx,bx

PSS: Welchen Sinn hat eigentlich Sektor 2 bei dir???
[schild=1]Wieder ein wertvoller(?) Beitrag von Roshl[/schild]

joachim_neu

  • Beiträge: 1 228
    • Profil anzeigen
    • http://www.joachim-neu.de
Gespeichert
« Antwort #6 am: 20. September 2004, 18:20 »
oh *schäm* legt ja die startadresse in einem segment fest, nicht im speicher... sorry.

bei deinem loader fehlt die bootsignatur:
in den letzten bytes muss 0AA55h stehen!!! das erreicht man mit:

times 512-($-$$)-2 db 0   ; Dateilänge: 512 Bytes
dw 0AA55h                 ; Bootsignatur

damit werden zuerst die restlichen bytes mit 0'en aufgefüllt und dann ín die letzten bytes 0AA55h geschrieben!!! kann sein, dass das der emul nicht prüft.

sonst bau halt mal ein paar ausgaben ein, um zu sehen, ob nur der bootsektor net geht oder der kernel oder das laden oder was auch immer!!! oder bau zumindest einmal ein paar fehlerprüfdinger ein, die, wenn der kernel nicht anständig geladen werden konnte eine meldung ausgeben und abbrechen, damit der rechner nicht mitten in den speicher kommt und nix mehr findet.
http://www.joachim-neu.de | http://www.orbitalpirates.de | http://www.middleageworld.de

System: 256 RAM, GeForce 2 MX 400, AMD Athlon XP 1600+, Windows XP, 1x Diskette, 1x DVD-ROM, 1x CD-R(W) Brenner,...

elfish_rider

  • Beiträge: 293
    • Profil anzeigen
Gespeichert
« Antwort #7 am: 20. September 2004, 18:28 »
Erst mal danke für die Hilfe...werds gleich ausprobieren...

Sektor 2 ist dafür da, falls der kernel so gross wäre, dass er denn loader überschreiben würde, würde dies nichts machen da der kernel von 00500h gestartet wird.

Roshl

  • Beiträge: 1 128
    • Profil anzeigen
    • http://www.lowlevel.net.tc
Gespeichert
« Antwort #8 am: 20. September 2004, 18:48 »
Dann schreib den Mist einfach nach 0x7e00 dann kann dir das wurscht sein
Auf die Bootkennung hab ich garnich geachtet kann auch sein, ich seh das inzwischen als selbstverständlich an^^
[schild=1]Wieder ein wertvoller(?) Beitrag von Roshl[/schild]

elfish_rider

  • Beiträge: 293
    • Profil anzeigen
Gespeichert
« Antwort #9 am: 20. September 2004, 19:03 »
Es läuft jetzt. Bin fast sicher, dass es am Stack lag, denn der Interrupt 13h benötigt den Stack...

Roshl

  • Beiträge: 1 128
    • Profil anzeigen
    • http://www.lowlevel.net.tc
Gespeichert
« Antwort #10 am: 20. September 2004, 20:31 »
jeder int braucht den Stack da ja dort die Rücksprungadresse gespeichert wird^^
[schild=1]Wieder ein wertvoller(?) Beitrag von Roshl[/schild]

 

Einloggen