本来是想去学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。
待续。。。。。。