---- 整理自狄泰软件唐佐林老师课程
查看所有文章链接:(更新中)深入浅出操作系统 - 目录
文章目录
1. 问题
- 主引导程序是软件还是固件?
- 如果是软件,那么由谁开发?如何开发?
2. 主引导程序
- 一段存储在主引导区MBR中的有效代码
- 并不固化于硬件,属于操作系统代码的一部分
- 启动操作系统内核的桥梁,由汇编程序写成
- 代码总量不能超过512字节(包含0x55aa)
2.1 主引导程序的开发
对比应用程序的开发:
入口:0x7c00 | VS | 入口:main |
主引导程序 (汇编语言) | 应用程序 (C/C++) | |
|| V | || V | |
BIOS中断 | OS系统调用 |
2.2 课程实验:编写一个主引导程序
2.2.1 目标
- 可独立运行于x86架构的主机(无操作系统)
- 运行后在屏幕上打印 “Hello,DTOS!”
2.2.2 关键实现思路
- 将关键寄存器的值设为0
mov ax,0
- 定义需要打印的数据
db "Hello,DTOS!"
- 打印预定义的字符数据
int 0x10
2.3 汇编小贴士
- mov:赋值
- int:触发中断
- hlt:停止运行,CPU进入 暂停状态,不执行任何操作
- 汇编中地址的访问方式:段地址 : 段内偏移地址
; 0xb800:0x01 ==> 0xb8000 + 0x01,
; 0xb800 左移四位,加上偏移地址0x01,将0x07赋值到地址0xb8001
mov byte [0xb800:0x01],0x07
- 标签:用于 标识后续指令的地址(可等同于C语言中的 goto所用的标签)
- $:表示当前指令行地址
- $$:表示当前汇编段起始地址
2.4 中断调用vs函数调用
在屏幕上打印一个字符:
3. 编程实验
【参看链接】:02 - Hello, DTOS!(第一个主引导程序,屏幕上打印Hello,DTOS! )
3.1 问题
- 如何验证编写的主引导程序?
3.2 解决方案设计
- 将汇编源码编译为二进制机器码(nasm)
nasm boot.asm -o boot.bin
- 创建虚拟盘(bximage)
bximage
c. 将二进制代码boot.bin写入虚拟盘a.img起始位置
dd if=boot.bin of=a.img bs=512 count=1 conv=notrunc
if:输入文件,boot.bin
of:输出文件,a.img
bs:每次操作的块大小,这里为512字节
count:每次操作的块数量,这里为1
conv:notrunc表示无间隙写入
d. 在虚拟机中将虚拟盘作为启动盘执行(vmware)
开启此虚拟机:
4. 小结
- 主引导程序的代码量不能超过512字节
- 主引导程序需要使用汇编语言开发
- 主引导程序中可以通过BIOS中断使用硬件功能
- 主引导程序运行于实模式(地址都是实际的物理地址)