Lowlevel
Lowlevel => OS-Design => Thema gestartet von: Rockviech 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
-
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?
-
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?
-
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.
-
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
-
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.
-
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
;===============================;
-
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?
-
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
-
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
-
edit:
nun gehts, hab beide .bin zu ner .img und mit der neusten rawwrite version auf diskette geschrieben
nun gehts einwandfrei