bootsect加载loader

来源:互联网 发布:长者风靡网络原因 编辑:程序博客网 时间:2024/05/22 05:52

这一小节我们要正式写我们的bootsect了,不知道bootsect是什么?是我们的启动扇区啊!启动扇区的目的是加载内核进内存,然后将CPU的控制权交给内核(跳转到内核执行)。我们知道,一个扇区只有512bytes,而进入内核之前要先进入保护模式,进入保护模式我们要设置GDT、设置CR0寄存器等等。如果我们把这些工作都放在启动扇区的话,启动扇区那小小的512bytes会吃不消的。
所以这里我们让bootsect加载loader,bootsect就做这一项工作,其他的那些事儿全都交给loader来做。所以bootsect的目的很明确,就是加载loader,因此他的工作量就大大降低了,这就好比给自己找了一个秘书或者助理,把大多数的工作都交给这个助理来做,呵呵。那么有人会问了,把这么多工作都交给助理了,那么助理吃得消吗?别担心,你应该相信loader的办事能力,loader既可以占用1个扇区,也可以占用多个扇区,所以别怕他吃不消。
好了,这一小节我们的目的也很明确,就是让bootsect加载loader。在写代码之前,我们先来介绍一下一些基础知识。
软盘结构
这里写图片描述
如上图所示
1个软盘有两个盘面(磁头),1个盘面有80个磁道(柱面),1个磁道有18个扇区。
我们的bootsect位于0磁头、0号柱面、1号扇区,loader位于0磁头、0号柱面、2号扇区(默认Loader只占一个扇区)。所以我们只要设置好相应的参数,然后调用BIOS中断即可。
bootsect.asm代码:

;从软盘加载loader并把控制权交给它[bits 16]boot:    ;初始化    xor ax,ax    mov ds,ax    mov es,ax    ;把loader从0号磁头、0号柱面、2号扇区加载到内存0x7e00    mov ax,0x7e0    mov es,ax    xor bx,bx    mov ch,0   ;0号柱面    mov cl,2   ;2号扇区    mov dh,0   ;0号磁头    mov dl,0   ;驱动器号设为0即可rp_read:        mov ah,2    mov al,1   ;加载1个扇区,这里默认Loader只占用1个扇区    int 0x13    jc rp_read    jmp 0x7e0:0times 510-($-$$) db 0db 0x55,0xaa

bootsect.asm的代码写完了,很简单,代码注释也很详细,这里就不多介绍了。下面我们来编写loader.asm。loader.asm做点什么呢?嗯,就显示一个字符’B’吧!!!!
loader.asm代码:

[bits 16];初始化xor ax, axmov ds, axmov es, axmov ah, 0x0e      ; function number = 0Eh : Display Charactermov al, 'B'             ; AL = code of character to displayint 0x10                ; call INT 10h, BIOS video service jmp $times 512-($-$$) db 0 ;填充0使得loader刚好占用1个扇区

好了,我们来编写Makefile,Makefile可是多文件编译的利器。

all:barras.imgbootsect.o:bootsect.asm    nasm -f elf -o $@ $<loader.o:loader.asm    nasm -f elf -o $@ $<barras.img:bootsect loader    cat bootsect loader > barras.imgbootsect:bootsect.o    ld --oformat binary -N -e boot -Ttext 0x7c00 -o bootsect $<loader:loader.o    ld --oformat binary -N -e pm_mode -Ttext 0x7e00 -o loader $<clean:    rm -f *.img bootsect loader *.o

好了,我们把bootsect.asm、loader.asm和Makefile放在同一个目录(barras)里面,我们进入barras目录,然后运行make 命令。
如果是在64位ubuntu系统下编译的话,会出现如下错误:
这里写图片描述
原因我已经在“barras如何在64位ubuntu系统下编译”中讲过了,这里只需要在链接的时候也就是在ld的后面加上-m elf_i386就可以了,编译的结果如下:
这里写图片描述
我们可以看到,最终生成了barras.img文件,我们用虚拟机来运行这个文件,如下图所示:
这里写图片描述
我们可以看到已经打印出来了‘B’,说明我们的Loader加载成功了,好了,这一节就讲到这里,如果有什么不明白的地方,可以看我的视频教程
http://www.duobei.com/course/1574348473

0 0
原创粉丝点击