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.
Chciałbym, aby twój kod bootstrap wydrukował list dla każdego etapu procesu, abyś miał lepszy pomysł, gdzie szukać. –