linux – 自定义操作系统的引导加载程序没有跳转到内核的麻烦
发布时间:2020-12-13 19:21:11 所属栏目:Linux 来源:网络整理
导读:我最近有一个想法开始开发自己的操作系统. 在阅读了我认为可以帮助我完成这项任务的不同网站上的许多文章后,我想我现在可以开始了. (顺便说一句,我使用的是Ubuntu 14.10 x64) 由于软盘是开发操作系统的最简单的存储介质,我购买了3.5英寸软盘驱动器. 我使用NA
我最近有一个想法开始开发自己的操作系统.
在阅读了我认为可以帮助我完成这项任务的不同网站上的许多文章后,我想我现在可以开始了. (顺便说一句,我使用的是Ubuntu 14.10 x64) 由于软盘是开发操作系统的最简单的存储介质,我购买了3.5英寸软盘驱动器. 我使用NASM作为汇编编译器,qemu作为模拟器. 之后,我在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) 它将按预期启动. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |