我最近有一个想法,要开始开发我自己的操作系统。在阅读了很多关于不同网站的文章后,我认为这些文章可以帮助我完成这个任务,我想我现在就可以开始了。(顺便说一下,我使用的是Ubuntu14.10 x64 )
由于软盘是开发OSes的最简单的存储介质,所以我获得了一个3.5英寸的软盘驱动器。
我使用NASM作为程序集编译器,使用qemu作为模拟器。使用dd命令,我将现有的空软盘克隆到一个名为floppy.img.bak的文件中。
之后,我在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到目前一切尚好。我的简单临时存根内核如下:
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我还有一个shell脚本可以编译、编写和引导这个设置:
compile-and-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现在,qemu中的预期输出将是(至少我所理解的):
Loading Kernel...
kkkkk相反,它是:
Loading Kernel...所以,很明显,跳台有问题,我只是不知道是什么。也许你能帮我?我会很感激的。
发布于 2014-10-25 23:15:33
引导驱动器存储在dl寄存器中,但要将其重写为0。
默认情况下,引导驱动器为80h,而不是引导加载程序代码使用的0。
如果你把这两行评论掉
; mov dl, 0 ;drive=0 (=A)它会像你期望的那样启动。
发布于 2014-10-25 22:47:38
修复您的脚本,您需要使用qemu-system-i386 -fda images/floppy.img运行它。注意-fda参数。如果您忽略了这一点,您的映像将被附加为硬盘而不是软盘,因此您的读取将失败(因为您已经对软盘驱动器进行了硬编码)。
https://stackoverflow.com/questions/26567810
复制相似问题