对于存储设备,驱动是对块操作的,在驱动上层加一个文件系统是必要的,接触过FAT,NTFS,EXT2,JFFS等,开源的代码porting过来,底层封装驱动接口,对于文件系统,必须对协议有深入的了解,主要参考官方文档
1. FAT协议
这是一个硬盘分区的全部内容
MBR (Master Boot Record):0-0x1bd,就是格式化的时候写进去的一段汇编,每个硬盘都一样,MBR不随操作系统的不同而不同,具有公共引导的特性。
DPT(Disk Partition Table):0x1be-0x1fd ,fdisk时候分区时候写的。
标志位:0x1fe-0x1ff,0x55AA
DBR(Dos Boot Record):0x7e00-0x8000
FAT表:维护整个硬盘文件的核心
根目录表:维护./下的文件
2. DPT
0x01BE BYTE 0x80 引导指示符(Boot Indicator) 指明该分区是否是活动分区。
0x01BF BYTE 0x01 开始磁头(Starting Head)
0x01C0 6位 0x01 开始扇区(Starting Sector) 只用了0~5位。后面的两位(第6位和第7位)被开始柱面字段所使用
0x01C1 10位 0x00 开始柱面(Starting Cylinder) 除了开始扇区字段的最后两位外,还使用了1位来组成该柱面值。开始柱面是一个10位数,最大值为1023
0x01C2 BYTE 0x07 系统ID(System ID) 定义了分区的类型
0x01C3 BYTE 0xFE 结束磁头(Ending Head)
0x01C4 6位 0xFF 结束扇区(Ending Sector) 只使用了0~5位。最后两位(第6、7位)被结束柱面字段所使用
0x01C5 10位 0x7B 结束柱面(Ending Cylinder) 除了结束扇区字段最后的两位外,还使用了1位,以组成该柱面值。结束柱面是一个10位的数,最大值为1023
0x01C6 DWORD 0x0000003F 相对扇区数(Relative Sectors) 从该磁盘的开始到该分区的开始的位移量,以扇区来计算
0x01CA DWORD 0x00DAA83D 总扇区数(Total Sectors) 该分区中的扇区总数
3. DBR
0x00 3个字节 跳转指令
0x03 8个字节 厂商标志和os版本号
0x0B 53个字节 BPB(BIOS Parameter Block)
0x40 26个字节 扩展BPB
0x5A 420个字节 引导程序代码
0x01FE 2个字节 有效结束标志
4. 文件描述符
0x0~0x7 8 文件名
0x8~0xA 3 扩展名
0x0B 1 属性字节 00000000(读写)00000001(只读) 0000010(隐藏) 00000100(系统)00001000(卷标) 00010000(子目录)00100000(归档)
0x0C~0x15 10 系统保留
0x16~0x17 2 文件的最近修改时间
0x18~0x19 2 文件的最近修改日期
0x1A~0x1B 2 表示文件的首簇号
0x1C~0x1F 4 表示文件的长度
5. 512M的FAT分析
这是用VMWARE加载的一个虚拟硬盘,512M的FAT分区的详细数据分析:
分区有文件./bbu3.txt和./ian8k/scm4.txt两个文件,文件内容分别是utstarcombbu3和ivd2 adsl icm
Fat表以 F8 FF FF FF开始,每个簇占16bits
bbu3.txt在第2簇,内容占一个簇
子文件夹ian8k在第3簇,当一个文件看待,占一个簇(文件夹固定只分配一个簇)
./ian8k/Scm4.txt在第5簇,内容占一个簇
第4簇为00 00,这是因为VMWARE操作的时候,不小心拷贝文件scm4.txt到./下了,后来又删除了,所以它为00 00,但是可以看到第4簇内容还在
----这就是为什么格式化硬盘之后,FBI还可以找出数据的原因
如果一个文件比较大,比如占2 3 4簇,则fat表内容为 F8 FF FF FF 00 03 00 04 FF FF
实际上会有删除操作,所以并不是顺序存放一个文件的,会有算法去寻找下一个空簇
6. UCFS
FAT的开源代码,但是实现功能太弱,比较无法自动查找空簇,每次都找后面的簇,这就无形中产生了很多零散的簇
7. 教训
更新原来别人的FAT系统,如果这个FAT问题很多,还不如重新porting一个新的,因为要修改的地方太多了,UCFS就是典型问题太多