如何从文件系统中读取文件内容

【0】写在前面

0.0) text description from orange’s implemention of a os ,文末总结系个人臆测出的干货


【1】intro to FAT12(file allocation table 12)文件系统格式(from Baidu Baike)

  • (1)FAT12定义: FAT12是DOS时代就开始使用的文件系统(File System),直到2009年仍然在软盘上使用。
  • (2)FAT12的主磁盘结构:
    • 2.1)引导扇区(Boot Sector):位于第一个扇区,在软盘上就是0柱面(磁道)0磁头1扇区。
    • 2.2)文件分配表(FAT):紧接着引导扇区的是两个完全相同的FAT表,每个FAT表占用9个(FAT2是FAT1 的 copy)
    • 2.3)根目录区: FAT表之后是根目录区,根目录区长度不固定
    • 2.4)数据区:根目录后面就是数据区
      这里写图片描述

【2.1】FAT12的引导扇区格式:

名称  开始字节    长度  内容  参考值
BS_jmpBOOT  0   3   一个短跳转指令 jmp Label_07c00H
nop
BS_OEMName  3   8   厂商名 'QingFeng'
BPB_BytesPerSec 11  2   每扇区字节数(Bytes/Sector)    0x200
BPB_SecPerClus  13  1   每簇扇区数(Sector/Cluster)   0x1
BPB_ResvdSecCnt 14  2   Boot记录占用多少扇区    ox1
BPB_NumFATs 16  1   共有多少FAT表    0x2
BPB_RootEntCnt  17  2   根目录区文件最大数   0xE0
BPB_TotSec16    19  2   扇区总数    0xB40[2*80*18]
BPB_Media   21  1   介质描述符   0xF0
BPB_FATSz16 22  2   每个FAT表所占扇区数 0x9
BPB_SecPerTrk   24  2   每磁道扇区数(Sector/track)    0x12
BPB_NumHeads    26  2   磁头数(面数) 0x2
BPB_HiddSec 28  4   隐藏扇区数   0
BPB_TotSec32    32  4   如果BPB_TotSec16=0,则由这里给出扇区数  0
BS_DrvNum   36  1   INT 13H的驱动器号    0
BS_Reserved1    37  1   保留,未使用  0
BS_BootSig  38  1   扩展引导标记(29h) 0x29
BS_VolID    39  4   卷序列号    0
BS_VolLab   43  11  卷标  'QingFeng'
BS_FileSysType  54  8   文件系统类型  'FAT12'
引导代码及其他内容   62  448 引导代码及其他数据   引导代码(剩余空间用0填充)
结束标志0xAA55  510 2   第510字节为0x55,第511字节为0xAA 0xAA55

【2.2】文件分配表-FAT

  • a)FAT的作用:当文件size 大于 512B,则FAT是找出该文件所占用的簇(簇:一个或多个扇区,引导扇区的BPB_SecPerClus记录该数字)
  • b)FAT项:每个项占用12 位,代表一个簇,第0和1个簇不使用,从第2个FAT项 开始表示数据区的每一个簇,即是第2个FAT项表示数据区第一个簇。数据区的第一个簇号是2,和这里是呼应的 。(注意: FAT项值代表的是文件的下一个簇号)
    这里写图片描述
  • 看个荔枝(只看16个字节):(干货)

    如FAT所在扇区(一个扇区512字节)存储值为:F0 FF FF FF 8F 00 FF FF FF FF FF FF 09 A0 00 FF  ,  0F  00 00 ;
    则簇号分别为:0-FF0 1-FFF 2-FFF 3-008 4-FFF 5-FFF 6-FFF 7-FFF 8-009 9-00A A-FFF
    

    如果根目录去中有条目记载某文件A 的 DIR_FstClus=3的话,则对应第3个FAT项,结合上一行,我们知道FAT3==008,所以下一个簇号是8-009 , 以此类推9-00A、 A-FFF。FFF就表示这个簇是最后一个簇了。

【2.3】根目录区-root dir sector

  • a)根目录区中的每一个条目占用32字节,每个条目格式如下:
    这里写图片描述
  • b)根目录区的大小依赖于 BPB_RootEntCnt(引导扇区中的BPB_RootEntCnt,根目录区文件最大数==根目录条目数),所以长度不固定;

如何计算根目录区的扇区数量?
这里写图片描述
显然,BPB_RootEntCnt 和 BPB_BytePerSec 都是由软盘(文件系统FAT12所在的分区)的引导扇区提供的;
所以,我们可以算出该软盘的根目录扇区数量。

【2.4】数据区

  • a)数据区的第一个簇的簇号是2,而不是0 or 1;
    这里写图片描述

【3】下面,我们讲一下,如何从文件系统中读取一个文件的内容(读取某文件的步骤)(纯属个人臆测,干货):

  • a)应用程序给出文件名;
  • b)通过该分区(文件系统)的引导扇区算出 根目录目录 所占扇区大小 和 数据区的起始扇区;
  • c)依据app 给出的文件名 和 根目录项的DIR_Name 定位该文件名对应的根目录项(根目录条目);
  • d)该条目记录了 对应文件的起始簇号,并将 该簇号 送到 FAT1 以找出该文件的占用的所有簇号;(FAT2 是 FAT1 的copy)
  • e)拿到该文件的所有簇号后,依据步骤a)算出的数据区起始扇区,从数据区中 取出 这些簇号里的内容,至此,取出该文件的内容;
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值