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


    【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)算出的数据区起始扇区,从数据区中 取出 这些簇号里的内容,至此,取出该文件的内容;

    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    微信视频号里的视频如何保存下来呢?
    jQuery实现平面图区域标记
    npm安装教程 yarn 基本安装和使用
    VitePress :VuePress 下一代建站工具
    基于CentOS的ECS实例实现OSS反向代理
    备份MySQL数据库到七牛云的shell脚本
    ShedLock 解决分布式结构下定时任务重复执行问题
    linux清除日志和文件缓存
    Communications link failure:The last packet successfully received from the server was 0 millisecond ago
    CentOS7安装nodeJs
  • 原文地址:https://www.cnblogs.com/pacoson/p/4893157.html
Copyright © 2020-2023  润新知