linux – 自定义操作系统的引导加载程序没有跳转到内核的麻烦

我最近有一个想法开始开发自己的操作系统.
在阅读了我认为可以帮助我完成这项任务的不同网站上的许多文章后,我想我现在可以开始了. (顺便说一句,我使用的是Ubuntu 14.10 x64)

由于软盘是开发操作系统的最简单的存储介质,我购买了3.5英寸软盘驱动器.

我使用NASM作为汇编编译器,qemu作为模拟器.
使用dd命令,我将一个现有的和空的(就文件而言)软盘克隆到一个名为floppy.img.bak的文件中.

之后,我在x86程序集中编写了一个简单的bootloader:

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...

所以,显然,跳跃有些不对劲,我只是不知道是什么.
也许你可以帮助我?我会很感激.

解决方法

bootdrive存储在dl寄存器中,但是将其覆盖为0.
默认情况下,bootdrive为80h,而不是引导加载程序代码使用的0.
如果你注释掉2行
;    mov dl,0   ;drive=0 (=A)

它将按预期启动.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


查找全部容器的日志文件 $ sudo find /var/lib/docker/containers -name *.log 查看日志位置 $ docker inspect --format='{{.LogPath}}' <container_name> 实时查询内容 $
Linux日志文件中列属性的详细解析
在Linux系统中没有duf命令,如何有效地管理磁盘空间?
深入探讨EncryptPad在Linux操作系统中的功能和优势
原理和应用场景:Linux中ttyload工具的工作原理和实际用途
深度解析SELinux的三种策略类型
评估Linux系统性能的ttyload工具使用效果
分享在Linux系统中检测SSH版本的方法
介绍Linux平台上的数据加密工具EncryptPad
在Linux系统中,如何查看和诊断块设备信息?
在Linux环境下如何查看块设备信息?
探索Linux操作系统下的数据加密工具EncryptPad
学会在Linux系统中查看硬盘信息
分析SELinux:原理与实践
掌握SELinux策略类别
技巧:有效解读和管理Linux日志文件
查看Linux系统中的所有用户
了解Linux系统中各种不同类型的日志文件
深入理解Linux PS命令
方法:在Linux操作系统中查看用户