zoukankan      html  css  js  c++  java
  • 《Orange‘s》FAT12文件系统

    FAT12

    层次

    • 扇区(Sector):磁盘上的最小数据单元
    • 簇(Cluster):一个或多个扇区
    • 分区(Partition):通常指整个文件系统

    引导扇区

    引导扇区是整块软盘的第0个扇区,在这个扇区中有一个重要的数据结构叫BPB(BIOS Patameter Block)。格式如下表所示:

    其中以BPB_开头的域属于BPB,以BS_开头的不属于BPB,只是引导扇区的一部分。

    紧跟着引导扇区的是两个完全相同的FAT表,每个占用9个扇区。第二个FAT表后是根目录区的第一个扇区。根目录区后面是数据区。如下图所示:

    根目录区放的是文件条目,每个条目占32字节,格式如下:

    根目录区和数据区

    这部分来实操一下书中的一个小例子。

    首先,使用bximage创建一个虚拟软盘x.img。

    接着,在FreeDOS下创建文本文件RIVER.TXT,内容为riverriverriver。
    TREE.TXT 内容为treetreetree。再添加一个HOUSE目录,在目录下添加两个文本文件CAT.TXT,DOG.TXT内容同上。 FreeDOS下可使用EDIT来创建文件。 刚开始我使用书中之前虚拟FreeDOS的bochsrc,发现EDIT不存在。和freedos自带的bochsrc比较了下,发现自带的启动的是c.img。另外,比较a.img和c.img,也会发现两者大小相差很大。于是我猜测c.img才是完整的freedos。于是直接在自带的bochsrc上修改,并拷贝了c.img。成功启动后果然可以使用edit了。如果懒得修改可以直接参考:

    ###############################################################
    # Configuration file for Bochs
    ###############################################################
    
    
    # how much memory the emulated machine will have
    megs: 32
    
    
    # filename of ROM images
    romimage: file=/usr/share/bochs/BIOS-bochs-latest
    vgaromimage: file=/usr/share/vgabios/vgabios.bin
    
    
    # what disk images will be used
    floppya: 1_44=x.img, status=inserted
    ata0-master: type=disk, path=c.img, cylinders=306, heads=4, spt=17
    boot: c
    
    
    # where do we send log messages?
    # log: bochsout.txt
    
    
    # disable the mouse
    mouse: enabled=0
    
    
    # enable key mapping, using US layout as default.
    keyboard_mapping: enabled=1, map=/usr/share/bochs/keymaps/x11-pc-us.map
    

    启动后,首先格式化x.img。

    format A:
    

    格式化后,进入A分区创建上述文件。(注:edit使用Alt键可切换至菜单)

    接下来我们计算一下根目录的偏移量。由前面可知,根目录区从第19扇区开始,每个扇区为512字节,别忘记扇区从0开始计数,所以第一个字节位于偏移19×512=0x2600处。接着查看一下x.img偏移0x2600处是什么:

    看到了刚刚创建的几个文件和文件夹。以RIVER.TXT为例,它的各项值如下表所示:

    分别是:文件名、大小、时间、’日期、文件开始簇号和文件大小。
    需要注意的是,数据区的第一个簇的簇号是2,不是0或1。
    RIVER.TXT的开始簇号就是2,也就是说此文件的数据开始于数据区第一个簇。
    想计算出第一个簇即第一个扇区,必须要知道根目录区所占的扇区数。
    在本例中,每扇区字节数为200h,根目录文件数最大值E0h,由上文可知一个文件条目为32字节,所以根目录占用空间大小为32×E0h=1C00h,对应1C00h/200h=Eh=14个扇区。本例刚好整除,否则扇区数还要加1。
    所以,数据区开始扇区号=根目录开始扇区号+14=19+14=33。偏移量为33×512=0x4200,接下来看一下内容:

    果然就是RIVER.TXT的内容。

    FAT表区

    FAT表有2个,FAT2可看作是FAT1的备份。先用xxd看下它的结构(FAT1的开始扇区号是1,偏移为512字节=0x200):

    其中,每12位称为一个FAT项(即FAT12),代表一个簇。第0个和第1个FAT项始终不使用,从第2个FAT项开始表示数据区的每一个簇。照应了前文所说的数据区第一个簇的簇号是2。

    通常,FAT项的值代表的是文件的下一个簇号,但如果值大于或等于0xFF8,则表示当前簇已经是本文件的最后一个簇。如果值为0xFF7,表示它是一个坏簇。

    以文件RIVER.TXT为例,开始簇号为2,对应FAT表中的值为0xFFF,表示这个簇已经是最后一个。

    要注意的是,一个FAT项可能会跨越两个扇区,这种情况在编码实现的过程中要考虑在内。

  • 相关阅读:
    44.分治算法练习:  一元三次方程求解
    44.分治算法练习:  一元三次方程求解
    44.分治算法练习:  一元三次方程求解
    MVC-04 视图(1)
    MVC-03 控制器(5)
    MVC-03 控制器(4)
    MVC-03 控制器(3)
    MVC-03 控制器(2)
    MVC-03 控制器(1)
    MVC-02 路由
  • 原文地址:https://www.cnblogs.com/cknightx/p/7880157.html
Copyright © 2011-2022 走看看