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
- bootsect加载loader
- bootsect
- bootsect
- 使用loader加载swf
- Loader(加载器)
- Loader异步加载
- Loader异步加载ContentProvider
- Loader异步加载ContentProvider
- SQL*Loader加载数据
- android---(Loader异步加载)
- loader(加载器)
- 异步加载机制-----Loader
- 加载Loader.bin
- Android Loader 加载器
- Loader加载器
- webpack loader加载器
- 图片加载image-loader
- Linux 0.11内核bootsect.s和loader.s的移植为AT&T汇编
- Spring For Hadoop学习笔记(2)
- php导出导入excel 文件
- 系统优化【3】----接口耦合优化与灾难控制
- Webview自适应屏幕
- HDU 1698 【线段树区间更新】
- bootsect加载loader
- LINUX内核中string函数实现
- CAPropertyAnimation对象keyPath属性的strokeStart和strokeEnd两个值
- Object-c类
- netty学习系列(一)netty初体验
- 心烦意乱的最后30天
- 网络编程概述
- Knockout应用开发指南 第七章:Mapping插件
- Lorem ipsum是什么(墙之后看的维基百科转过来的)