DOS文件系统

通过LinuxGPT分区读取程序对GPT有了一个比较深入的了解,接下来再查看一下常见的DOS分区表,与其有什么不一样的地方。

DOS分区

采用MBR磁盘分区的方式进行分区的设备。在Linux中利用fdisk -l命令会在Disklable type后面显示为dos。DOS分区与GPT分区表存储的位置不一致。DOS分区表存储在第一扇区(在MBR当中),而GPT分区表一般存储在第二扇区。

MBR

MBR(Master Boot Record)主引导记录,一般位于磁盘最开始的位置 ,即C/H/S(柱面/磁头/扇区)为0/0/0的位置,占用一个扇区512字节。由四部分组成:引导程序、磁盘签名、分区表、结束标志。

MBR结构

|———–|———-|———-|
| 引导程序 | 分区表 | 结束标志 |

引导程序(MBR)

0 ~ 1B7H: 446Byte,存储引导程序。当BIOS自检完成之后便会将硬盘第一个扇区读入内存当中,然后BIOS检查内存中最后的两个字节是否为0xaa55,不等于则尝试其它介质,等于则进入该启动程序。
0x00 ~ 0x1B7 : 440 : 引导程序
0x1B8 ~ 0x1BB : 4 :磁盘签名
0x1BC ~ 0x1BD : 2 : 保留

分区表

下面的位置表示偏移位置,而不是所说的实际位置。
0x00 1Byte 引导标志,标识是否为活动分区
0x01 1Byte 起始磁头
0x02 ~ 0x03 2Byte 6bit表示起始扇区,10Bit表示起始柱面
0x04 1Byte 分区类型
0x05 1Byte 结束磁头
0x06 ~ 0x07 2Byte 6bit表示结束扇区,10bit表示结束柱面
0x08 ~ 0xA1 4Byte 本分区之前的扇区数
0xA2 ~ 0xA5 4Byte 本分区的总扇区数
在每个分区当中会根据当时格式化时的设置,格式化不同的文件系统。因此在接下来读取每个分区当中的内容时,就需要按照该分区的文件系统格式进行读取。

结束标志

0x00

FAT32

FAT32结构

|—————|———-|———-|———|
| DBR和保留扇区 | FAT1 | FAT2 | DATA |

DBR和保留扇区

DOS BOOT Record 操作系统引导记录,由五部分组成:跳转指令,OEM代码、BPB、引导程序和结束标志
0x00 ~ 0x02 3Byte 将程序执行流程跳转到引导程序起始处
0x03 ~ 0xA0 8Byte OEM代码,由格式化的厂商规定
0x0B ~ 0x58 79Byte BPB(BIOS Parameter Block),
0x5A ~ 0x1FD 420Byte 引导程序,Win98之前的程序,这段代码负责完成DOS三个系统文件的装入,Win2000之后的系统,则负责将NTLDR文件装入,Win7系统负责将BOOTMGR装入。
0x1FE ~ 0x1FF 2Byte 结束标志,0x55AA

FAT1 和 FAT2

FAT(File Allocation Table)文件分配表,记录簇的使用情况和下一个簇的簇号。FAT2是FAT1的备份。

DATA

数据记录区

BPB

BIOS Parameter Block:BIOS参数块,对整个文件系统中比较重要的信息。其数据结构如下:
0x00 ~ 0x01 2Byte 每扇区字节数
0x02 1Byte 每簇扇区数
0x03 ~ 0x04 2Byte DOS保留扇区数
0x05 1Byte FAT表个数
0x06 ~ 0x09 4Byte 未使用
0xA0 1Byte 介质描述符
0xA1 ~ 0xA2 2Byte 未用
0xA3 ~ 0xA4 2Byte 每磁道扇区数
0xA5 ~ 0xA6 2Byte 磁头数
0xA7 ~ 0xAB 4Byte 隐藏扇区
0xAC ~ 0xAF 4Byte 该分区的扇区总数
0xB0 ~ 0xB3 4Byte 每FAT扇区数
0xB4 ~ 0xB5 2Byte 标记
0xB6 ~ 0xB7 2Byte 版本
0xB8 ~ 0xBB 4Byte 根目录首簇号
0xBC ~ 0xBD 2Byte 文件系统扇区号
0xBE ~ 0xBF 2Byte DBR备份扇区号
0xC0 ~ 0xCC 12Byte 保留
0xCD 1Byte BIOS驱动器号
0xCE 1Byte 未用
0xCF 1Byte 扩展引导标记
0xD0 ~ 0xD3 4Byte 卷序列号
0xD4 ~ 0xDE 11Byte 卷标
0xDF ~ 0xE6 8Byte 文件系统类型
通过上面可以看出,文件系统的所有参数都会记录在BPB当中。
遗留问题,上面的结构体不是自动内存对齐的,怎么搞才可以准确的读取出数据

MBR与GRUB

MBR是属于硬盘的结构,不属于任何系统。而GRUB是一个多重操作系统启动管理器,是属于操作系统的一个应用程序,因此GRUB不会写入MBR,而是由MBR引导出GRUB进行多重启动。会出现这种的原因是,每个文件系统都会在开始部分预留出一段空间存放引导引导加载程序。这也就为多系统启动提供了可能。比较常见的多重操作系统启动管理器有(NTLOADER、GRUE、LILO)。

参考文章

  1. 数据恢复软件设计与实现(三)
  2. 硬盘结构简介的好文(转)—MBR、分区表、CHS等概念
  3. MBR和GRUB什么关系