本来是想去学NASM的,又发现CSDN论坛中有人有FASM写简单的系统,由于熟悉FASM所以还是用这个吧。
结合书本又查阅了下资料,现在我们所使用的计算机引导过程应该是这样的:
BIOS->MBR->活动分区->PBR->OS LOADER->加载内核
MBR=Master Boot Record,结构如下:
;主引导记录,512字节
struct STRUCT_MASTER_BOOT_RECORD
Codes rb 446
Partition1 STRUCT_PARTITION_TABLE
Partition2 STRUCT_PARTITION_TABLE
Partition3 STRUCT_PARTITION_TABLE
Partition4 STRUCT_PARTITION_TABLE
;结束标志=0x55AA
Flag dw ?
ends
这也就是为什么一个硬盘最多有四个分区(主分区和扩展分区,不算逻辑分区)。
此结构包含了分区表结构,如下:
;分区表结构=16字节
struct STRUCT_PARTITION_TABLE
;分区状态,0=未激活,0x80=激活
State db ?
;起始磁头号
BeginHead db ?
;起始扇区(低6位)和柱面号(高10位)
BeginSC dw ?
;分区类型
FSID db ?
;结束磁头号
EndHead db ?
;结束扇区和柱面号,同BeginHead
EndSC dw ?
;相对扇区地址
InfoAreaSectors dd ?
;总扇区数
Sectors dd ?
ends
BIOS把MBR加载到0x7C00地址后会跳转到Codes的代码处执行。
而Codes的作用就是寻找活动分区,并把其PBR加载到0x7C00处,跳转到它的代码中。
PBR=Partition Boot Record,结构如下:
;分区引导记录=512字节
struct STRUCT_PARTITION_BOOT_RECORD
;短跳转代码
CodeJmp rb 3
;厂商名(字符串)
OEMName rb 8
;BIOS_PARAMETER_BLOCK
BPB STRUCT_BIOS_PARAMETER_BLOCK_FAT
;中断13的驱动器号
DrvNum db ?
;磁头号(书上说这一字节是保留的)
Head db ?
;扩展引导标记=0x29
BootSig db ?
;卷序列号
VolID dd ?
;卷标(字符串)
VolLab rb 11
;文件系统类型(字符串)
FileSysType rb 8
;代码,数据等
Others rb 448
;标志=0x55AA
Flag dw ?
ends
PBR描述了此分区的属性,如果这个分区是活动的,则会获得CPU控制权(由MBR转移过来的)。
此结构包含了另一个结构BPB,如下:
;FAT磁盘参数表,25字节,FAT12和FAT16应该是一样的
struct STRUCT_BIOS_PARAMETER_BLOCK_FAT
;每扇区字节数
BytsPerSec dw ?
;每簇扇区数
SecPerClus db ?
;Boot记录占用多少扇区
RsvdSecCnt dw ?
;共有多少FAT表
NumFATs db ?
;根目录文件数最大值
RootEntCnt dw ?
;扇区总数
TotSec16 dw ?
;介质描述符
Media db ?
;每FAT扇区数
FATSz16 dw ?
;每磁道扇区数
SecPerTrk dw ?
;磁头数(面数)
NumHeads dw ?
;隐藏扇区数
HiddSec dd ?
;如果TotSec16=0则由这个记录扇区数
TotSec32 dd ?
ends
这个是FAT的,好像12、16、32都是一样的,但NTFS的就不知道了,有心人知道的话麻烦告知一下。
MBR加载活动分区的PBR后会跳转到JmpCode中,虽说是个短调转,但主体代码是在Others中。
活动分区的PBR的作用就是寻找OS LOADER,加载到内存,转移控制权。
为什么要那么麻烦呢?因为一个扇区为512字节,不足以存放加载系统内核的代码,如果代码是作为硬盘数据存在的,则没有这个限制。
后面的内容就不说了,我现在还没写好MBR和PBR呢,争取成品能够兼容windows的MBR。
待续。。。。。。