FAT文件系统引导扇区学习总结
分区引导扇区()DBR,通常被称为0扇区(0thsector)。其实称它为0扇区其实是不准确的,这样容易让人误解它为磁盘的最前面一个扇区,称它为0扇区只是表明它是FAT中扇区的参考点而已。
该扇区中包含有我们关注的一个重要数据结构BPB(BIOS Parameter Block)。
标识 | 偏移(字节) | 长度(字节) | 说明 |
---|---|---|---|
BS_jmpBoot | 0x00 | 3 | 跳转指令,指向启动代码 |
BS_OEMName | 0x03 | 8 | 建议值为“MSWIN4.1”。有些厂商的FAT驱动可能会检测此项,所以设为“MSWIN4.1”可以尽量避免兼容性的问题 |
BPB_BytsPerSec | 0x0B | 2 | 每扇区的字节数,取值只能是以下几种:512,1024,2048或是4096。设为512会取得最好的兼容性,目前有很多FAT代码都是硬性规定每扇区的字节数为512,而不是实际的检测此值。但微软的操作系统能够很好支持1024,2048或是4096 |
BPB_SecPerClus | 0x0D | 1 | 每簇的扇区数,其值必须中2的整数次方(该整数必须>=0),同时还要保证每簇的字节数不能超过32K,也就是1024*32字节 |
BPB_RsvdSecCnt | 0x0E | 2 | 保留扇区的数目,此域不能为0,FAT12/FAT16必须为1,FAT32的典型值取为32,微软的系统支持任何非0值 |
BPB_NumFATs | 0x10 | 1 | 分区中FAT表的份数,,任何FAT格式都建议为2 |
BPB_RootEntCnt | 0x11 | 2 | 对于FAT12和FAT16此域包含根目录中目录的个数(每项长度为32字节),对于FAT32,此项必须为0。对于FAT12和FAT16,此数乘以32必为BPB_BytesPerSec的偶数倍,为了达到更好的兼容性,FAT12和FAT16都应该取值为512 |
BPB_ToSec16 | 0x13 | 2 | 早期版本中16bit的总扇区,这里总扇区数包括FAT卷上四个基本分区的全部扇区,此域可以为0,若此域为0,那么BPB_ToSec32必须为0,对于FAT32,此域必为0。对于FAT12/FAT16,此域填写总扇区数,如果该值小于0x10000的话,BPB_ToSec32必须为0 |
BPB_Media | 0x15 | 1 | 对于“固定”(不可移动)存储介质而言,0xF8是标准值,对于可移动存储介质,经常使用的数值是0xF0,此域合法的取值可以取0xF0,0xF8,0xF9,0xFA,0xFC,0xFD,0xFE,0xFF。另外要提醒的是,无论此域写入什么数值,同时也必须在FAT[0]的低字节写入相同的值,这是因为早期的MSDOS 1.x使用该字节来判定是何种存储介质 |
BPB_FATSz16 | 0x16 | 2 | FAT12/FAT16一个FAT表所占的扇区数,对于FAT32来说此域必须为0,在BPB_FATZ32中有指定FAT表的大小 |
BPB_SecPerTrk | 0x18 | 2 | 每磁道的扇区数,用于BIOS中断0x13,此域只对于有“特殊形状”(由磁头和柱面每分割为若干磁道)的存储介质有效,同时必须可以调用BIOS的0x13中断得到此数值 |
BPB_NumHeads | 0x1A | 2 | 磁头数,用于BIOS的0x13中断,类似于上面的BPB_ SecPerTrk,只对特殊的介质才有效,此域包含一个至少为1的数值,比如1,4M的软盘此域为2 |
BPB_HidSec | 0x1C | 4 | 在此FAT分区之前所隐藏的扇区数,必须使得调用BIOS的0x13中断可以得到此数值,对于那些没有分区的存储介质,此域必须为0,具体使用什么值由操作系统决定 |
BPB_ToSec32 | 0x20 | 4 | 该卷总扇区数(32bit),这里的扇区总数包括FAT卷四个个基本分的全部扇区,此域可以为0,若此域为0,BPB_ToSec16必须为非0,对FAT32,此域必须是非0。对于FAT12/FAT16如果总扇区数大于或等于0x10000的话,此域就是扇区总数,同时BPB_ToSec16的值为0 |
BS_drvNum | 0x24 | 1 | 用于BIOS中断0x13得到磁盘驱动器参数,(0x00为软盘,0x80为硬盘)。此域实际上由操作系统决定 |
BS_Reseved1 | 0x25 | 1 | 保留(供NT使用),格式化FAT卷时必须设为0 |
BS_VolID | 0x26 | 1 | 扩展引导标记(0x29)用于指明此后的3个域可用 |
BS_BootSig | 0x27 | 4 | 卷标序列号,此域以BS_VolLab一起可以用来检测磁盘是否正确,FAT文件系统可以用此判断连接的可移动磁盘是否正确,引域往往是由时间和日期组成的一个32位的值 |
BS_VolLab | 0x2B | 11 | 磁盘卷标,此域必须与根目录中11字节长的卷标一致。FAT文件系统必须保证在根目录的卷标文件列改或是创建的同时,此域的内容能得到时的更新,当FAT卷没有卷标时,此域的内容为“NO NAME” |
BS_FilSysType | 0x36 | 8 | 以下的几种之一:“FAT12”,“FAT16”,“FAT32”。不少人错误的认为FAT文件系统的类型由此域来确认,仔细点你就能发现此域并不是BPB的一部分,只是一个字符串而已,微软的操作系统并不使用此域来确定FAT文件的类型;因为它常常被写错或是根本就不存在。 |
FAT32的BPB的内容和FAT12/16的内容在地址0x24以前是完全一样的,从偏移量0x24开始,他们的内容有所区别。下面举个例子来分析上面介绍的内容。
看0x00处的3个字节指向0x903CEB(此系统为小端模式),说明启动代码在0x903CEB处。再看0x03处的8个字节为”4D 53 44 4F 53 35 2E 30”对应的字符为“MSDOS5.0”。下面是每扇区字节数(BPB_BytsPerSec),0x0B处的2个字节为0x0200即512个字节。每簇的扇区数(BPB_SecPerClus)0x0D处为0x10即16*512=8K大小。保留扇区的数(BPB_RsvdSecCnt)0x0E处的2个字节为0x0004即保留4个扇区。
分区中FAT表的份数(BPB_NumFATs)0x10处为0x02即2份。对于FAT12和FAT16此域为包含根目录中目录的个数(BPB_RootEntCnt)0x11处的2个字节为0x0200即512个。总扇区数(BPB_ToSec16)0x13处的2个字节为0x0000,由于后面可见其总扇区数大于0x10000,所以该值为0,总扇区数由BPB_ToSec32决定。 BPB_Media的值对于非可移动存储介质0x15处为0xF8。FAT12/FAT16一个FAT表所占的扇区数(BPB_FATSz16)0x16处的2个字节为0x00F2即242个扇区。每磁道的扇区数(BPB_SecPerTrk)0x18处的2个字节为0x003F即63个扇区。磁头数(BPB_NumHeads)0x1A处的2个字节为0x00FF即255个。在此FAT分区之前所隐藏的扇区数(BPB_HidSec)0x1C处的4个字节为0x0000 003F即63个扇区。
该卷总扇区数(BPB_ToSec32)0x20处的4个字节为0x000F 1EC1即990913个扇区。磁盘驱动器参数(BS_drvNum)0x24处为0x00。0x25处为保留域0x00。扩展引导标记(BS_VolID) 0x26处为0x29表示此后的3个域可用(0x27-0x29)。卷标序列号(BS_BootSig)0x27处的4个字节为0x9C93 850F,由于前面限定到0x29可用,所以卷标序列号为0x93850F。磁盘卷标(BS_VolLab)0x2B处的11个字节为”4E 4F 20 4E 41 4D 45 20 20 20 20”对应的字符为“N0 NAME ”。
文件系统类型(BS_FilSysType)0x36处的8个字节为”46 41 54 31 36 20 20 20”对应的字符为“FAT16 ”。FAT的类型(FAT12/16/32)只能通过FAT卷中的簇(Cluster)数来判定,Cluster总数的计算:
RootDirSectors = (BPB_RootEntCnt*32) /BPB_BytsPerSec
DataSect = TotalSec
– (BPB_RsvdSecCnt +(BPB_NumFATs * FATSz) + RootDirSectors)
CountofClusters = DataSec / BPB_SecPerClus
If (CountofClusters < 4085) {
/*卷类型是 FAT12 */
} else if(CountofClusters < 65525) {
/* 卷类型是FAT16 */
} else {
/* 卷类型是 FAT32 */
}
按照上面的值我们来计算一下根目录占据的Sector数:
RootDirSectors = (512*32) / 512 = 32
DataSect = BPB_ToSec32 – (4 + (2 * BPB_FATSz16) + 32)= 990913 – (36 + (2 * 242)) = 990393
CountofClusters = 990393 / 16 = 61899
算出的CountofClusters小于65525,说明其是FAT16文件系统。
下表为FAT32的引导扇区内容,只看0x24开始不一样的地方即可
标识 | 偏移(字节) | 长度(字节) | 说明 |
---|---|---|---|
BPB_FATSz32 | 0x24 | 4 | 一个FAT表所占的扇区数,此域为FAT32特有,同时BPB_FATSz16必须为0 |
BPB_Flags | 0x28 | 2 | 此域FAT32特有。Bits0-3:不小于0的FAT(active FAT)数目,只有在镜像(mirrorig)禁止时才有效。Bits 4-6: 保留 Bits 7: 0表示FAT实时镜像到所有的FAT表中 1 表示只有一个活动的FAT表。这个表就是Bits0-3所指定的那个 Bits8-15: 保留 |
BPB_FSVer | 0x2A | 2 | 此域为FAT32特有, 高位为FAT32的主版本号,低位为次版本号,这个版本号是为了以后更高级的FAT版本考虑,假设当前的操作系统只能支持的FAT32版本号为0.0。那么该操作系统检测到此域不为0时,它便会忽略FAT卷,因为它的版本号比系统能支持的版式本要高 |
BPB_RootClus | 0x2C | 4 | 根目录所在第一个簇的簇号,通常该数值为2,但不是必须为2。 磁盘工具在改变根目录位置时,必须想办法让磁盘上第一个非坏簇作为根目录的第一个簇(比如第2簇,除非它已经被标记为坏簇),这样的话,如果此域正好为0的话磁盘检测工具也能轻松的找到根目录所在簇的位置 |
BPB_FSIfo | 0x30 | 2 | 保留区中FAT32卷FSINFO结构所占的扇区数,通常为1。 在Backup Boot 中会有一个FSINFO的备份,但该备份只是更新其中的指针,也就是说无论是主引导记录还是备份引导记录都是指向同一个FSINFO结构 |
BPB_BkBootSec | 0x32 | 2 | 如果不为0,表示在保留区中引导记录的备数据所占的扇区数,通常为6。同时不建议使用6以外的其他数值 |
BPB_Reserved | 0x34 | 12 | 用于以后FAT扩展使用,对FAT32。此域用0填充 |
BS_DrvNum | 0x40 | 1 | 与FAT12/16的定义相同,只不过两者位于启动扇区不同的位置而已 |
BS_Reserved1 | 0x41 | 1 | 与FAT12/16的定义相同,只不过两者位于启动扇区不同的位置而已 |
BS_BootSig | 0x42 | 1 | 与FAT12/16的定义相同 |
BS_VolID | 0x43 | 4 | 与FAT12/16的定义相同 |
BS_VolLab | 0x47 | 11 | 与FAT12/16的定义相同 |
BS_FilSysType | 0x52 | 8 | 通常设置为“FAT32”,请参照FAT12/16此部分的陈述 |
FAT文件系统引导扇区学习总结相关推荐
- syslinux引导扇区不支持ntfs文件系统_实战 FAT12 文件系统
1. 引言 经过一系列的文章,我们终于完成了从实地址模式跳转到保护模式,并且实现了分段.分页以及保护模式下的中断与异常机制. 保护模式究竟"保护"了什么 可是我们除了最初的时候,在 ...
- syslinux引导扇区不支持ntfs文件系统_磁盘与文件系统
1.磁盘的组成 从一个磁盘的俯视图来看,其结构如下: 扇区:最小的物理存储单位,目前主要有512bytes与4K格式 磁道:由一个个同心圆环组成,从0开始由外向内编号 磁柱:不同盘面上相同磁道编号则组 ...
- 建立FAT文件系统学习笔记
FAT文件系统的概况图 1.MBR 进行百度得到,计算机在按下power键以后,开始执行主板bios程序.进行完一系列检测和配置以后.开始按bios中设定的系统引导顺序引导系统.假定现在是硬盘.Bio ...
- 硬盘分区丢失不能识别,文件系统损坏,不能读取第一个/第二个NTFS引导扇区的解决方法
硬盘分区丢失或则文件系统损坏,运行chkdsk 检查提示不能读取第一个/第二个NTFS引导扇区. 目录 一.切忌慌乱,保持冷静(引用某网友,赞同!) 二.弄清数据丢失原因 三.操作系统如何删除文件的 ...
- 野火STM32F103——Fat文件系统及Flash芯片W25Q64学习记录
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 目录 文章目录 前言 一.Fatfs是什么? 二.W25Q64是什么 三.使用步骤 1.引入库 2.移植文件系统 文件简单读 ...
- 《NTFS文件系统扇区存储探秘》——第1章 FAT文件系统的数据结构 1.1 主引导记录...
本节书摘来自异步社区<NTFS文件系统扇区存储探秘>一书中的第1章,第1.1节,作者:宋群生 , 宋亚琼著,更多章节内容可以访问云栖社区"异步社区"公众号查看 第1章 ...
- 【OS学习笔记】三十七 保护模式十:中断和异常的处理与抢占式多任务对应的汇编代码----主引导扇区代码
本文是以下几篇文章对应的主引导扇区代码汇编代码: [OS学习笔记]三十四 保护模式十:中断和异常区别 [OS学习笔记]三十五 保护模式十:中断描述符表.中断门和陷阱门 [OS学习笔记]三十六 保护模式 ...
- 【OS学习笔记】八 实模式:编写主引导扇区代码-另一种更高效的写法
学习交流加 个人qq: 1126137994 个人微信: liu1126137994 学习交流资源分享qq群: 962535112 上一篇文章,我们用比较原始的方法编写了主引导扇区的代码.点击链接查看 ...
- 【OS学习笔记】六 实模式:编写主引导扇区代码
上一篇文章学习了:计算机的启动过程(点击链接查看上一篇文章) 这篇文章学习记录为:编写主引导扇区代码. 参考:<X86汇编语言-从实模式到保护模式>-李忠.纯学习笔记,更详细内容请阅读正版 ...
- 警告!从ISO映像创建的U盘可能无法完全启动!Unknown引导扇区不支持NTFS文件系统
想给自己U盘制作成U盘启动盘,却出现警告!从ISO映像创建的U盘可能无法完全启动!Unknown引导扇区不支持NTFS文件系统. 我试了很多办法,网上也看了很多办法,在这里总结一下. 1.更换U盘启动 ...
最新文章
- Spring 组cxf宣布webservice
- mysql 命令记录_mysql命令记录 - 我要五个字的个人空间 - OSCHINA - 中文开源技术交流社区...
- ewebeditor遍历路径漏洞
- go语言如何连接数据库
- JS_异步任务之流程控制
- LeetCode 87. 扰乱字符串(递归)
- Stepper MNKit
- 关于配置文件的节点内容加密(备忘)
- 如何做肌电信号手势识别?
- PHP加密如何保护php源码不被破解不被轻易去授权
- SAP内部培训效果考察表存档
- 关于服务器托管,你了解多少?
- 1024 程序员节狂欢盛会,等了一年终于来了!
- jmeter上传文件踩坑指南
- 永续合约短线交易技巧?
- 人工智能在集装箱识别中应用
- (完美解决)App点击Home键后,再次点击APP图标,APP重启回不到点击home键前的那个界面
- 经验分享 | 文献调研 - Connected Papers
- 中国电信IPTV标准研究之机顶盒
- ubuntu 16.04硬盘分区方案
热门文章
- excel文件转换成PDF格式
- 让Google搜索到GitHub上的个人博客
- python股票回测_Python量化投资框架:回测+模拟+实盘
- 易懂 | 手把手教你编写你的第一个上位机
- 大连海事计算机学硕分数线,大连海事大学2019年考研复试分数线预测
- 安卓12使用VNET免ROOT抓包微信小程序
- OpenAI公开Dota 2论文:胜率99.4%,「手术」工具连续迁移训练
- 关于网页点击按钮无响应问题分析
- 码农枪击了 4 名同事后被警方击毙!后附“程序员保命指南”
- pentaho java代码_将Pentaho移植到Eclipse_ee里运行