1、问题
主引导程序是软件还是固件?如果是软件那么由谁开发?如何开发?
软件、开发操作系统的程序员
2、主引导程序
- 一段存储在主引导区(MBR)中的有效代码
- 并不固化于硬件,属于操作系统代码的一部分
- 启动操作系统内核的桥梁,由汇编程序写成
- 代码总量不能超过512个字节(包含0x55aa)
3、主引导程序的开发
4、课程实验
- 编写一个主引导程序(汇编语言)
- 可独立运行于x86架构的主机(无操作系统)
- 运行后在屏幕上打印 "Hello, DTOS!"
5、实现思路
1. 将关键寄存器的值设置为0 ( mov ax,0 )
2. 定义需要打印的数据( db "Hello,D.T.OS!" )
3. 打印预定义好的字符数据( int 0x10 )
6、汇编小贴士一
- mov:赋值操作,将右操作数赋值给左操作数
- mov ax, 0 ;将0赋值给ax寄存器
- int:触发中断
- int 0x10 ;触发0x10中断,对屏幕进行操作
- hlt:停止运行,CPU进入暂停状态,不执行任何操作
- hlt ;使程序进入睡眠状态
7、汇编小贴士二
- 汇编中地址的访问方式:段地址:段内偏移地址
- mov byte [0xb800:0x01],0x07 ; 将0x07赋值到 ( 0xb800:0x01 ==> 0xb8000 + 0x01) byte ==>只要一个字节
- 标签
- 用于标识后续指令的地址(可等同为C语言中的标签)
- $ vs $$
- $表示当前指令行地址,$$表示当前汇编段起始地址
8、中断调用 VS 函数调用
在屏幕上打印一个字符
9、编程实验:第一个引导加载程序
boot.asm
10、问题
如何验证编写的主引导程序?
11、解决方案设计
- 将汇编源码编译为二进制机器码( nasm )
- 创建虚拟盘( bximage )
- 将二进制代码写入虚拟盘起始位置( dd )
- 在虚拟机中将虚拟盘作为启动盘执行( vmware )
12、实验原材料
- nasm
- nasm boot.asm -o boot.bin
- bximage
- bximage a.img -q -fd -size=1.44
-
-q
不需要任何的交互,一次性创建出a.img即可
-fd
创建的是虚拟软盘
-size=1.44
大小为1.44兆
-
- bximage a.img -q -fd -size=1.44
- dd
- dd if=boot.bin of=a.img bs=512 count=1 conv=notrunc
-
if
输入
of
输出
bs=512
写入时每个单元的大小
count=1
数量为1,即1个512字节
conv=notrunc
连续写入,不要有间隔
-
- dd if=boot.bin of=a.img bs=512 count=1 conv=notrunc
13、编程实验:运行引导加载程序
boot.img
14、小结
- 主引导程序的代码量不能超过512字节
- 主引导程序需要使用汇编语言开发
- 主引导程序中可以通过BIOS中断使用硬件功能
- 主引导程序运行于实模式(地址都是实际的物理地址)