2014-10-25 6 views
7

Niedawno miałem pomysł, aby rozpocząć opracowywanie własnego systemu operacyjnego. Po przeczytaniu wielu artykułów na temat różnych stron, które uważałem za pomocne w wykonaniu tego zadania, pomyślałem, że mogę zacząć już teraz. (Używam przy okazji Ubuntu 14.10 x64)Problemy z niestandardowym bootloaderem OS, który nie przeskoczył do jądra

Ponieważ dyskietka jest najprostszym nośnikiem pamięci dla rozwijających się systemów operacyjnych, nabyłem 3,5-calowy napęd dyskietek.

Używam NASM jako kompilatora zespołu, a qemu jako emulatora. Za pomocą polecenia dd sklonowałem istniejącą i pustą (w zakresie plików) dyskietkę do pliku o nazwie floppy.img.bak.

Po tym, napisałem prosty bootloader w zespole x86:

bootloader.asm

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 

tej pory tak dobrze. mój prosty tymczasowe jądro en przedstawia się następująco:

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 

Mam też skrypt do kompilacji, napisać i uruchomić tę konfigurację:

kompilacji i- run.sh

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 

Teraz oczekiwany wynik w qemu będzie (przynajmniej co rozumiem):

Loading Kernel... 
kkkkk 

Ale zamiast tego, to jest:

Loading Kernel... 

Tak, oczywiście, że jest coś złego w skoku, ja po prostu nie wiem co . Może możesz mi pomóc? Doceniłbym to.

+2

Chciałbym, aby twój kod bootstrap wydrukował list dla każdego etapu procesu, abyś miał lepszy pomysł, gdzie szukać. –

Odpowiedz

3

bootdrive jest przechowywana w rejestrze dl ale go nadpisać 0.
Domyślnie bootdrive jest 80h i nie 0 Stosowane przez kod bootloadera.
Jeśli zakomentuj 2 linie

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

Będzie to uruchomić jak można się spodziewać.

+0

Nie ma za co! Jest to po prostu łatwy sposób na wykonanie kodu, jednak jeśli stworzysz bardziej złożony bootloader, będziesz musiał przechowywać dl (jak na http://caca.zoy.org/browser/libcaca/trunk/kernel/boot/ bootsect.asm) – mpromonet

2

Napraw swój skrypt, musisz go uruchomić pod numerem qemu-system-i386 -fda images/floppy.img. Zwróć uwagę na parametr -fda. Jeśli to pominiesz, twój obraz zostanie dołączony jako dysk twardy, a nie jako dyskietka, więc odczyt nie powiedzie się (ponieważ masz zakodowaną dyskietkę).

+0

Czy to ważne, jeśli system plików jest taki sam? Działa bez tego parametru. –

Powiązane problemy