9
« 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