首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >自定义操作系统的引导加载程序没有跳转到内核的问题

自定义操作系统的引导加载程序没有跳转到内核的问题
EN

Stack Overflow用户
提问于 2014-10-25 22:15:15
回答 2查看 585关注 0票数 7

我最近有一个想法,要开始开发我自己的操作系统。在阅读了很多关于不同网站的文章后,我认为这些文章可以帮助我完成这个任务,我想我现在就可以开始了。(顺便说一下,我使用的是Ubuntu14.10 x64 )

由于软盘是开发OSes的最简单的存储介质,所以我获得了一个3.5英寸的软盘驱动器。

我使用NASM作为程序集编译器,使用qemu作为模拟器。使用dd命令,我将现有的空软盘克隆到一个名为floppy.img.bak的文件中。

之后,我在x86程序集中编写了一个简单的引导加载程序:

bootloader.asm

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
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中的预期输出将是(至少我所理解的):

代码语言:javascript
复制
Loading Kernel...
kkkkk

相反,它是:

代码语言:javascript
复制
Loading Kernel...

所以,很明显,跳台有问题,我只是不知道是什么。也许你能帮我?我会很感激的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-10-25 23:15:33

引导驱动器存储在dl寄存器中,但要将其重写为0。

默认情况下,引导驱动器为80h,而不是引导加载程序代码使用的0。

如果你把这两行评论掉

代码语言:javascript
复制
;    mov dl, 0   ;drive=0 (=A)

它会像你期望的那样启动。

票数 3
EN

Stack Overflow用户

发布于 2014-10-25 22:47:38

修复您的脚本,您需要使用qemu-system-i386 -fda images/floppy.img运行它。注意-fda参数。如果您忽略了这一点,您的映像将被附加为硬盘而不是软盘,因此您的读取将失败(因为您已经对软盘驱动器进行了硬编码)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26567810

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档