Autor Thema: Bootloader ladet Kernel nicht  (Gelesen 15631 mal)

Rockviech

  • Beiträge: 9
    • Profil anzeigen
Gespeichert
« am: 20. August 2005, 12:12 »
Hi,

ich hab mal eine Frage.
Ich benutze Linux und hab bis jetzt meine .bin dateien immer mittels qemu emuliert

nun da ich aber ja 1 Bootloader und 1 Kernel .bin hab hab ich diese mit cat zusammengefuegt zu test.bin

wenn ich diese jetzt mit qemu emulier arbeitet der irgendwie nur den bootloader ab, springt aber nicht zum kernel

hab schon im forum rumgesucht und da wurde gesagt dass ich nur die bootloader.bin auf diskette schreiben soll und dann die kernel.bin draufkopieren

ne image hab ich ueber yast2 auf die diskette kopiert und danach einfach ueber cp befehl die kernel.bin drauf, da geht aber garnix mehr

naja vielleicht liegt auch der fehler im code

; bootloader

[BITS 16]  ; generate 16 bit code

[ORG 0x7C00] ;loader bootsector in memory

;================
; executable section
;================
main : ; start of main program

cli ; delete interruptflag

; create stack on 0x9000:0000
mov ax, 0x9000
mov ss, ax ; set  stagsegment to 0x9000 (ax)
xor sp,sp
sti ; set interruptflag

mov si, WelcomeStr ; load string
call printtxt   ; display text

mov [bootdrv], dl ; save bootdrive in dl

call loadkernel ; load kernel
call jumptokernel ; jump to the kernel adress



jmp $  ;endless loop // end of main program


;=================
; data section
;=================


WelcomeStr db 'Booting SunOS....',13,10,0 ; loading string
KernelLoadStr db 'Loading Kernel...',13,10,0 ; kernel loading string

bootdrv db 0 ; the bootdrive

printtxt: ; print whole string
mov ah, 0x0E ; char function number
mov bh, 0x00
mov bl, 0x07

nchar: ; load string byte for byte from si register
lodsb ; load byte
or al, al
jz printtxtend ; if 0-Byte = end
int 0x10 ; run bios video to print each letter
jmp nchar ; next byte
printtxtend:
ret


; our kernel loader, loads the kernel from the adress 0x1000

loadkernel: ; load kernel from bootdrive
push ds ; save ds
mov ax, 0 ; reset function
mov dl, [bootdrv] ; bootdrive (reset)
int 13h ; execute interrupt diskdrive reset
pop ds
jc loadkernel ; if it doesnt work try again



loadkernel2:
mov ax, 0x1000 ; position where to load kernel
mov es, ax
mov bx, 0


; read sectors
mov ah, 2 ; function to read
mov al, 5 ; read 5 sectors
mov cx, 2 ; cylinder 0, sector 2
mov dx, 0 ; head 0, drive 0
int 13h ; load files from bootdrive
jc loadkernel2 ;if error, try again

mov si, KernelLoadStr ; load string
call printtxt   ; display text

retn

jumptokernel:
mov ax, 0x1000 ;kernel adress
mov es, ax     ; update segmentregisters
mov ds, ax
push ax
xor ax,ax
push ax



times 512-($-$$)-2 db 0 ; fill rest of sector with zeros
dw 0xAA55 ; boot loader signature


kernel
; kernel

mov ax, 0x1000 ; the kernel adress

; update segment registers
mov ds, ax
mov es, ax


main:

mov si, KernelLoaded ; load text
call printtxt ; display text

jmp main; endless loop

KernelLoaded db 'Kernel loaded...',13,10,0

printtxt: ; print whole string
mov ah, 0x0E ; char function number
mov bh, 0x00
mov bl, 0x07

nchar: ; load string byte for byte from si register
lodsb ; load byte
or al, al
jz printtxtend ; if 0-Byte = end
int 0x10 ; run bios video to print each letter
jmp nchar ; next byte
printtxtend:
ret

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 20. August 2005, 12:36 »
jumptokernel:
mov ax, 0x1000 ;kernel adress
mov es, ax     ; update segmentregisters
mov ds, ax

push ax
xor ax,ax
push ax
retf ; <-------------------------- das hast du vergessen


besser ist allerdings dies hier:
jumptokernel:
mov ax, 0x1000 ;kernel adress
mov es, ax     ; update segmentregisters
mov ds, ax

jmp 0x1000:0x0000

oder nicht?
Dieser Text wird unter jedem Beitrag angezeigt.

Rockviech

  • Beiträge: 9
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 20. August 2005, 12:50 »
nein hat nix gebracht

es steht immer dran

booting sun os
loading kernel

normal wenn er kernel geladen hat sollte noch dranstehen
kernel loaded

ich denke ich mach beim zusammenfuegen was falsch, wie soll ichs jetzt machen?
beides zu ner .img?

matthieuriolo

  • Beiträge: 226
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 20. August 2005, 13:43 »
Das versteh ich überhaupt nicht .... wieso linkst du sie zusammen zu einem .bin? Wenn du das als 1 Datei haben willst kannst du dir ja eigentlich den Loader sparen. Sowieso sollte der Bootloader nur 512 byte gross sein, damit der bei einer FAT12 formatierte Diskette in den Bootsektor passt. Wie es bei einer Cd oder fest auf der HD geht weiss ich nicht ... Jedenfalls brauchst du zum draufschreiben ein Programm. Kannst also das Zusammen kopieren schon mal kicken.

Rockviech

  • Beiträge: 9
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 20. August 2005, 13:50 »
wieso, er soll doch aber von diskette booten und kernel laden, wieso sollte ich dann bootloader weglassen?

die bootloader.bin ist genau 512byte

ich wills ueber qemu halt so emulieren als waere eine diskette drin, also bootloader startet und springt zu kernel

SSJ7Gohan

  • Beiträge: 398
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 20. August 2005, 14:49 »
Du solltest Sektor 1 von der Diskette lesen.
Der Bootsektor steht in Sektor 0 und der Kernel in 1 und den darauffolgenden. Ausserdem hast du das retf vergessen, wie PorkChicken schon geschrieben hat.

Du fügst die beiden .bin Files einfach mit cat zusammen, mehr musst du nicht machen. Das Kopieren der kernel.bin auf die Diskette wird nicht funktionieren.

Rockviech

  • Beiträge: 9
    • Profil anzeigen
Gespeichert
« Antwort #6 am: 20. August 2005, 15:04 »
ich hab se doch mit cat zusammengefuegt

cat bootloader.bin kernel.bin > test.bin

dann mit qemu emuliert aber er fuehrt nur bis zur funktion loadkernel2 aus, dann springt er in die endlossschleife wegen jz kerneload2, falls es nicht geklappt hat

zu den sectoren lesen, das tu ich doch ueber cl?

habs mal so probiert
tut aber genausowenig

loadkernel2:
mov ax, 0x1000 ; position where to load kernel
mov es, ax
mov bx, 0

; read sectors
mov ah, 0x02 ; function to read
mov al, 0x01 ; read 1 sector (512 bytes per sector)
mov cx, 0x02 ; track 0, sector 2
mov cl, 0x01 ; sector to read
mov dx, 0x00 ; head 0, drive 0
int 13h ; load files from bootdrive
jc loadkernel2 ;if error, try again

retn
;===============================;

; jump to the kernel adress
;===============================;
jumptokernel:
mov ax, 0x1000 ;kernel adress
    ; update segmentregisters
mov ds, ax

jmp 0x1000:0x0000
;===============================;

Rockviech

  • Beiträge: 9
    • Profil anzeigen
Gespeichert
« Antwort #7 am: 20. August 2005, 18:29 »
hmm hat keiner ne idee?

also hab mal weiter rumprobiert
mittels

dd if=bootloader.bin  of=/dev/fd0 bs=1440k

kann ich dateien auf diskette schreiben

nun, wenn ich mittels cat bootloader.bin und kernel.bin zusammenschreib bekomm ich das gleiche resultat wie immer

wenn ich bootloader.bin mittels dd auf festplatte schreib und dann einfach kernel.bin dazu kopiere geht garnix

wenn ich beide dateien per dd dazukopiere geht auch wieder nix


wie muss ich denn es jetzt machen?

SSJ7Gohan

  • Beiträge: 398
    • Profil anzeigen
Gespeichert
« Antwort #8 am: 20. August 2005, 19:23 »
Erstmal erstellst du ein image:
cat bootloader.bin kernel.bin > image.bin

Dann kopierst du es auf die Diskette:
cat image.bin > /dev/fd0
oder
dd if=image.bin of=/dev/fd0 bs=1440k

hannibal

  • Host
  • Beiträge: 400
    • Profil anzeigen
    • brainsware - the rock.
Gespeichert
« Antwort #9 am: 20. August 2005, 20:26 »
ich wuerd dir vorschlagen einfach grub zu nehmen. wenn du ohnehin eine diskette verwendest, dann kannst du einfach das grub-image von LOST verwenden..hab ich auch gemacht ;)

einfach mit rawwrite/dd img/fd0.img auf die diskette kopieren, menu.lst im grub-verzeichnis anpassen und fertig.

lg, alex
\\o
o//
\o/

Rockviech

  • Beiträge: 9
    • Profil anzeigen
Gespeichert
« Antwort #10 am: 21. August 2005, 14:41 »
edit:

nun gehts, hab beide .bin zu ner .img und mit der neusten rawwrite version auf diskette geschrieben

nun gehts einwandfrei

 

Einloggen