2014-10-25 17 views
7

Son zamanlarda kendi İşletim Sistemimi geliştirmeye başlamak için bir fikrim vardı. Bu görevle ilgili bana yardımcı olacağını düşündüğüm farklı sitelerdeki birçok makaleyi okuduktan sonra, şimdi başlayabileceğimi düşündüm. (Bu arada Ubuntu 14.10 x64 kullanıyorum)Özel işletim sisteminin bootloader'ındaki sorun, çekirdeğe atlamıyor

Disket, OS'leri geliştirmek için en basit depolama ortamı olduğundan, 3.5 inçlik bir disket sürücüsü aldım.

Bir derleme derleyici olarak NASM ve bir emülatör olarak qemu kullanıyorum. dd komutunu kullanarak, varolan ve boş (dosyalar olarak) disketi floppy.img.bak adlı bir dosyaya klonladım.

bootloader.asm Şimdiye kadar

org 7C00h 
jmp 0x0000:start ;go 

msg db 'Loading Kernel...', 0 

start: 
    ;update the segment registers 
    mov ax, cs 
    mov ds, ax 
    mov es, ax 

    mov si, msg 

print:   ;prints a string 
    lodsb  ;load next char 

    cmp al, 0 ;if null terminator... 
    je reset ;...jump to reset: 

    mov ah, 0Eh ;print AL 
    mov bx, 7 
    int 10h 

    jmp print ;if not null terminator, continue printing 

reset:   ;resets the floppy drive 
    mov ax, 0 ; 
    mov dl, 0 ;drive=0 (=A) 
    int 13h  ; 
    jc reset ;if error resetting, reset again 

read: 
    mov ax, 1000h ;ES:BX = 1000:000 
    mov es, ax ;es is 1000h now 
    mov bx, 0 ;bx is 0 now 

    mov ah, 2 ;load disk data into ES:BX 
    mov al, 1 ;load 1 sector 
    mov ch, 0 ;cylinder=0 
    mov cl, 2 ;sector=2 
    mov dh, 0 ;head=0 
    mov dl, 0 ;drive=0 
    int 13h  ;read! 

    jc read  ;if error then try again 


    jmp 1000h:0000;jump to the program 

times 510-($-$$) db 0 
dw 0AA55h 

çok iyi:

Ondan sonra, x86 ile basit bir bootloader yazdı. Benim basit geçici saplama çekirdek aşağıdaki gibidir:

kernel.asm

kstart: 
    mov ah, 9 
    mov al, 'k' 
    mov bx, 7 
    mov cx, 5 
    int 10h 

hang: 
    jmp hang 

times 510-($-$$)+2 db 0 
Ben de bu kurulumu, derlemek yazmak ve önyükleme için bir kabuk komut dosyası var

:

derleme ve- run.sh Şimdi

cd ~/Dev/OS               # cd to here 

rm asm-bin/bootloader.bin            # remove old compiled bootloader 
rm asm-bin/kernel.bin             # remove old compiled kernel 

nasm asm-src/bootloader.asm -f bin -o asm-bin/bootloader.bin   # compile bootloader 
nasm asm-src/kernel.asm -f bin -o asm-bin/kernel.bin     # compile kernel 

rm images/floppy.img             # remove old floppy image 
cp images/floppy.img.bak images/floppy.img        # copy original floppy image to fresh one 

dd if=asm-bin/bootloader.bin of=images/floppy.img bs=512 count=1 seek=0 # write bootloader to first sector 
dd if=asm-bin/kernel.bin of=images/floppy.img bs=512 count=1 seek=1  # write kernel to second sector 

qemu-system-i386 images/floppy.img          # start qemu and boot floppy.img 

, beklenen çıkışı içinde qemu (en azından ne anlamak) olacaktır:

Loading Kernel... 
kkkkk 

Ama bunun yerine, o:

Loading Kernel... 

Yani, belli ki, atlamada yanlış bir şey var, ben sadece bilmiyorum . Belki bana yardım edebilirsin? Takdir ederim.

+2

Önyükleme kodunuzun, işlemdeki her adım için bir harf basması gerekir, böylece nerede daha iyi bir fikre sahip olursunuz. –

cevap

3

bootdrive dl kayıt saklanır ama bootdrive 80h ve bootloader kodu tarafından kullanıldığı gibi değil 0'dır Eğer Varsayılan olarak 0.
bunu geçersiz kılar.
dışarı yorum yaparsanız 2 satır

; mov dl, 0 ;drive=0 (=A) 

beklediğiniz gibi boot edecektir.

+0

Rica ederim! Bu, kodunuzu çalıştırmanın kolay bir yoludur, ancak daha karmaşık bir bootloader yaparsanız, dl'yi (http://caca.zoy.org/browser/libcaca/trunk/kernel/boot/ bootsect.asm) – mpromonet

2

Komut dosyanızı düzeltin, qemu-system-i386 -fda images/floppy.img ile çalıştırmanız gerekiyor. -fda parametresine dikkat edin. Bunu atlarsanız, görüntünüz disket olarak değil, sabit disk olarak eklenecektir, bu nedenle okuma başarısız olacaktır (disket sürücünüzde kodlanmış olduğundan).

+0

Dosya sistemi aynıysa bu sorun olur mu? Bu parametre olmadan çalışır. –

İlgili konular