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

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

概述我最近有一个想法开始开发自己的 *** 作系统. 在阅读了我认为可以帮助我完成这项任务的不同网站上的许多文章后,我想我现在可以开始了. (顺便说一句,我使用的是Ubuntu 14.10 x64) 由于软盘是开发 *** 作系统的最简单的存储介质,我购买了3.5英寸软盘驱动器. 我使用NASM作为汇编编译器,qemu作为模拟器. 使用dd命令,我将一个现有的和空的(就文件而言)软盘克隆到一个名为floppy.img 我最近有一个想法开始开发自己的 *** 作系统.
在阅读了我认为可以帮助我完成这项任务的不同网站上的许多文章后,我想我现在可以开始了. (顺便说一句,我使用的是Ubuntu 14.10 x64)

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

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

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

bootloader.asm

org 7C00hjmp 0x0000:start    ;go msg db 'Loading Kernel...',0start:    ;update the segment registers    mov ax,cs    mov ds,ax    mov es,ax    mov si,msgprint:          ;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 printingreset:          ;resets the floppy drive    mov ax,0   ;    mov dl,0   ;drive=0 (=A)    int 13h     ;    jc reset    ;if error resetting,reset againread:    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 programtimes 510-($-$$) db 0DW 0AA55h

到现在为止还挺好.
我的简单临时存根内核如下:

kernel.asm

kstart:    mov ah,9    mov al,'k'    mov bx,7    mov cx,5    int 10hhang:    jmp hangtimes 510-($-$$)+2 db 0

我还有一个shell脚本来编译,编写和启动这个设置:

compile-and-run.sh

cd ~/Dev/OS                                                          # cd to hererm asm-bin/bootloader.bin                                               # remove old compiled bootloaderrm asm-bin/kernel.bin                                                   # remove old compiled kernelnasm asm-src/bootloader.asm -f bin -o asm-bin/bootloader.bin            # compile bootloadernasm asm-src/kernel.asm -f bin -o asm-bin/kernel.bin                    # compile kernelrm images/floppy.img                                                    # remove old floppy imagecp images/floppy.img.bak images/floppy.img                              # copy original floppy image to fresh onedd if=asm-bin/bootloader.bin of=images/floppy.img bs=512 count=1 seek=0 # write bootloader to first sectordd if=asm-bin/kernel.bin of=images/floppy.img bs=512 count=1 seek=1     # write kernel to second sectorqemu-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)

它将按预期启动.

总结

以上是内存溢出为你收集整理的linux – 自定义 *** 作系统的引导加载程序没有跳转到内核的麻烦全部内容,希望文章能够帮你解决linux – 自定义 *** 作系统的引导加载程序没有跳转到内核的麻烦所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/1047746.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-25
下一篇 2022-05-25

发表评论

登录后才能评论

评论列表(0条)

保存