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.
Önyükleme kodunuzun, işlemdeki her adım için bir harf basması gerekir, böylece nerede daha iyi bir fikre sahip olursunuz. –