Linux内核---20.vfat文件系统分析

1. 
sun@ubuntu:/tmp$ sudo dd if=/dev/sdb1 of=dbr bs=512 count=2
硬盘分区结构信息
偏移 长度(字节) 意义
00H 1 分区状态:00-->非活动分区;80--> 活动分区;
其它数值没有意义
01H 1 分区起始磁头号(HEAD),用到全部8位
02H 2 分区起始扇区号(SECTOR),占据02H的位0-5;
该分区的起始磁柱号(CYLINDER),占据
02H的位6-7和03H的全部8位
04H 1 文件系统标志位
05H 1 分区结束磁头号(HEAD),用到全部8位
06H 2 分区结束扇区号(SECTOR),占据06H的位0-5;
该分区的结束磁柱号(CYLINDER),占据
06H的位6-7和07H的全部8位
08H 4 分区起始相对扇区号
0CH 4 分区总的扇区数
http://zh.wikipedia.org/wiki/%E4%B8%BB%E5%BC%95%E5%AF%BC%E8%AE%B0%E5%BD%95
Linux内核---20.vfat文件系统分析_第1张图片

  1. 第一个分区是VFAT
  2. [00] --> 00
  3. [01] --> 0x21起始磁头号
  4. [02-03] --> 0x0003
  5. [04] --> 0x83
  6. [05] --> 0xcb
  7. [06-07] --> 0x022a=554
  8. [08] --> 0x0800=2048 --> 起始扇区号
  9. [0C] --> 0xa000=40960 --> 分区总的扇区数 (40960*512/1024/1024=20M 正确)

  10. 第二个分区是EXT3
  11. [00] --> 00
  12. [01] --> 0x21起始磁头号
  13. [02-03] --> 0x0
  14. [04] --> 0x83
  15. [05] --> 0xcb
  16. [06-07] --> 0x022a=554
  17. [08] --> 0x0800=2048 --> 起始扇区号
  18. [0C] --> 0xa000=40960 --> 分区总的扇区数 (40960*512/1024/1024=20M 正确)
一、利用磁盘镜像测试fat32
1.1 步骤如下:
  1. //创建一个1024M的文件
  2. sun@ubuntu:/work/6410/test/fat32$ dd if=/dev/zero of=fatimg bs=1M count=1024

  3. //分区
  4. sun@ubuntu:/work/6410/test/fat32$ sudo fdisk ./fatimg
  5. //查看分区
  6. sun@ubuntu:/work/6410/test/fat32$ sudo fdisk -./fatimg

  7. Disk ./fatimg: 1073 MB, 1073741824 bytes
  8. 139 heads, 8 sectors/track, 1885 cylinders, total 2097152 sectors
  9. Units = sectors of 1 * 512 = 512 bytes
  10. Sector size (logical/physical): 512 bytes / 512 bytes
  11. I/O size (minimum/optimal): 512 bytes / 512 bytes
  12. Disk identifier: 0xe79e9e10

  13.    Device Boot Start End Blocks Id System
  14. ./fatimg1 2048 2097151 1047552 83 Linux

  15. //将镜像与loop设备关联
  16. sun@ubuntu:/work/6410/test/fat32$ sudo losetup -o 1048576 /dev/loop0 fatimg
  17. 注意: losetup 中的-o是跳过多少个字节: 1048576=2048*512 (2048是从fdisk中看出)

  18. //格式化
  19. sun@ubuntu:/work/6410/test/fat32$ sudo mkfs.vfat /dev/loop0

  20. //查看fat32分区表
  21. sun@ubuntu:/work/6410/test/fat32$ sudo dd if=/dev/loop0 of=fat bs=512 count=5000

  22. //挂载
  23. sun@ubuntu:/work/6410/test/fat32$ sudo mount /dev/loop0 /mnt/test

1.2 查看DBR
Linux内核---20.vfat文件系统分析_第2张图片
  1. 【1】0x00~0x02:3B, 跳转指令
  2. 【2】0x03~0x0A:8B, 文件系统标志和版本号,这里为 mkdosfs
  3. 【3】0x0B~0x0C:2B, 每扇区字节数,(02 00)=512B
  4. 【4】0x0D~0x0D:1B, 每簇扇区数,8(08)
  5. 【5】0x0E~0x0F:2B, 保留扇区数,(2000)32个扇区=0x4000
  6. 【6】0x10~0x10:1B, FAT 表个数,2
  7. 【7】0x11~0x12:2B, 根目录最多可容纳的目录项数,FAT12/16(为512), FAT32不使用此处值,置 0
  8. 【8】0x13~0x14:2B, 扇区总数,小于32MB 时使用,超过 32MB 时使用0x20~0x23处的4字节
  9. 【9】0x15~0x15:1B, 介质描述符,0xF8 表示本地硬盘
  10. 【10】0x16~0x17:2B, 每个 FAT 表的大小扇区数(FAT12/16 使用,FAT32 不使用此处,置 0)
  11. 【11】0x18~0x19:2B, 每磁道扇区数,(2000)=32个
  12. 【12】0x1A~0x1B:2B, 磁头数, (4000)=64个
  13. 【13】0x1C~0x1F:4B, 分区前已使用扇区数, (00000 000)=0个
  14. 【14】0x20~0x23:4B, 文件系统大小扇区数, (00f8 1f00)=1ff800=1023M
  15. 【15】0x24~0x27:4B, 每个 FAT 表的大小扇区数, (0008 0000)=0800=2048*512=0x100000
  16. 【16】0x28~0x29:2B, 标记
  17. 【17】0x2A~0x2B:2B, 版本号
  18. 【18】0x2C~0x2F:4B, 根目录簇号,(0200 0000)=2
  19. 【19】0x30~0x31:2B, FSINFO(文件系统信息扇区)扇区号,1, 该扇区为操作系统提供关于空簇总数及下一可用簇的信息
  20. 【20】0x32~0x33:2B, 备份引导扇区的位置,6备份引导扇区总是位于文件系统的 6 号扇区
  21. 【21】0x34~0x3F:12B, 未使用
  22. 【22】0x40~0x40:1B, BIOS INT 13H 设备号,0x80
  23. 【23】0x41~0x41:1B, 未用
  24. 【24】0x42~0x42:1B, 扩展引导标志0x29
  25. 【25】0x43~0x46:1B, 卷序列号通常为一个随机值
  26. 【26】0x47~0x51:11B, 卷标(ASCII 码),如果建立文件系统的时候指定了卷标,会保存在此
  27. 【27】0x52~0x59:8B, 文件系统格式的 ASCII 码,FAT32
  28. 【28】0x5A~0x1FD:410B, 未使用该部分没有明确的用途
  29. 【29】0x1FE~0x1FF:签名标志“55 AA”
1.3 查看 FSINFO

  1. 【1】0x200~0x203: 4B, 扩展引导标志“52526141”
  2. 【2】0x204~0x3E3:480B, 未使用,全部置 0
  3. 【3】0x3E4~0x3E7: 4B, FSINFO 签名“72724161”
  4. 【4】0x3E8~0x3EB: 4B, 文件系统的空簇数, (fafc)=0300
  5. 5】0x3EC~0x3EF: 4B, 下一可用簇号,(0300 0000)=3,第3个簇开始
  6. 【6】0x3F0~0x3FD: 14B, 未使用
  7. 【7】0x3FE~0x3FF: 2B, “55 AA”标志



//装入第一个FAT表扇区号到FirstFATSector 中
arg->FirstFATSector=lb2bb((bpb->BPB_RsvdSecCnt) ,2)+arg->BPB_Sector_No; 

0 reserved-->  0x4000 FAT1 -->0x104000FAT2 -->0x204000 root_dir --->

未写入任何东东之前的分区表 0x4000开始
  1025 0004000: f8ff ff0f ffff ff0f f8ff ff0f 0000 0000  ................
  1026 0004010: 0000 0000 0000 0000 0000 0000 0000 0000

加入文件之后:
  1025 0004000: f8ff ff0f ffff ff0f f8ff ff0f ffff ff0f  ................
  1026 0004010: 0000 0000 0000 0000 0000 0000 0000 0000
    //第3个簇变成 ffff ff0f, 只占用了一个簇
数据区的开始: 023b000

你可能感兴趣的:(linux内核)