目录
主引导扇区又称为MBR,上面1-22行定义了一个标准的fat16的主引导扇区。大小为512字节。
主引导扇区
主引导扇区格式
- 主引导扇区必须是512字节大小。
- 必须位于硬盘开始位置的512字节。
- 主引导扇区必须是以0x55 0xAA为结尾的。
比如,我们在前面的代码中构建了FAT16格式的引导扇区数据,首先定义了一个跳转指令,然后定义一段数据,描述了FAT16引导文件。后面是代码段,以供跳转执行。
主执行引导扇区过程
主引导扇区bios进行加载
系统首先会读取 0 柱面 0 磁道 1 扇区,将其内容加载到内存地址的 0x0000:0x7c00处。然后jmp到内存的0x7c00处执行指令。
至于为什么必须加载到0x7c00的地方,当时就这么规定的吧,没啥特殊的地方,计算机读取指令开始时,会从0x7c00处读取。
编写一个主引导扇区
以下为我们编写一个最简单的主引导扇区,并且在vitualbox中加载运行。
创建boot目录,并新建文件boot/boot.asm
;Rats OS
;Tab=4
[bits 16]
org 0x7c00 ;指明程序的偏移的基地址
;引导扇区代码
jmp Entry
db 0x90
db "RATSBOOT"
;程序核心内容
Entry:
jmp $ ;让CPU挂起,等待指令。
;扇区格式
Fill0:
resb 510-($-$$) ;处理当前行$至结束(1FE)填充0
db 0x55, 0xaa
使用nasm编译
nasm -f bin -o boot.bin boot/boot.asm
然后,使用linux命令创建一个1.44M,字节都为0的ratsos.img镜像文件
dd if=/dev/zero of=fdimage.img bs=1024 count=1440
将引导扇区文件,添加到ratsos.img镜像中
dd if=boot.bin of=ratsos.img bs=512 count=1 conv=notrunc
执行脚本如下
#!/bin/bash
NASM=nasm
mkdir build
$NASM -f bin -o boot.bin boot/boot.asm
dd if=/dev/zero of=ratsos.img bs=512 count=2880
dd if=boot.bin of=ratsos.img bs=512 count=1 conv=notrunc
使用vitualbox虚拟机加载运行镜像
FAT32格式的主引导扇区
上面那段没有定义引导扇区的系统文件格式,实际上系统签名一段包括一段系统文件格式的代码。
FAT32 : http://zh.wikipedia.org/wiki/FAT32#FAT32
;以下这段是标准FAT32 格式软盘专用的代码
JMP Entry
DB 0x90 ;nop,0x02
DB "RATSBOOT" ;(8字节)启动区的名称可以是任意的字符串
DW 512 ;每个扇区(sector)的大小(必须为512 字节)
DB 8 ;簇(cluster )的大小(每个簇为8个扇区)
DW 584 ;保留扇区数,包括启动扇区
DB 2 ;FAT的个数(必须为2)
DW 0 ;最大根目录条目个数
DW 0 ;总扇区数(如果是0,就使用偏移0x20处的4字节值)
DB 0x00f8 ;磁盘介质描述
DW 0 ;(FAT16)每个文件分配表的扇区
DW 63 ;每个磁道扇区数
dw 255 ;磁头数
dd 63 ;隐藏扇区
dd 3902913 ;磁盘大小,总共扇区数(如果超过65535,参见偏移0x13)
dd 3804 ;每个文件分配表的扇区,3804个扇区
dw 0 ;Flagss
dw 0 ;版本号
dd 2 ;根目录启始簇
dw 1 ;FSInfo扇区
dw 6 ;启动扇区备份
times 12 db 0 ;保留未使用
DW 0 ;操作系统自引导代码
db 0x80 ;BIOS设备代号
db 0 ;未使用
db 0x29 ;标记
DD 0xffffffff ;序列号
DB "HELLO-OS " ;(11字节)磁盘名称,卷标。字符串长度固定
DB "FAT32 " ;(8字节)FAT文件系统类型。 0x52
times 12 db 0