Chinaunix首页 | 论坛 | 博客
  • 博客访问: 276727
  • 博文数量: 61
  • 博客积分: 655
  • 博客等级: 上士
  • 技术积分: 489
  • 用 户 组: 普通用户
  • 注册时间: 2010-10-21 18:21
文章分类

全部博文(61)

文章存档

2014年(9)

2013年(23)

2012年(26)

2011年(3)

我的朋友

分类: LINUX

2013-03-11 16:48:28

    最近在解决龙芯pmon 在含有2G以上文件的fat文件系统优盘加载 vmlinux 时出错的问题,上网查到关于 fat 文件系统的结构,转载帖过来
    原文地址:http://blog.chinaunix.net/uid-26913704-id-3213948.html   
对磁盘的物理结构,逻辑结构和存储结构有了比较深入的了解后,我们来仔细探讨FAT32文件系统的存储组织结构。说到文件系统的组织结构,我们应该马上意识到,这指的是文件系统在同一个分区内的组织结构,在这个话题上,我们完全可以不管分区之外的所有事情。

     为了分析FAT32文件系统的存储组织结构,我们来建立一个实实在在的文件系统:将U盘插入电脑,将U盘格式化成FAT32分区格式:

格式化U盘

以建好的U盘FAT32文件系统为基础,下面从文件系统的各个组成来分别加以介绍。

分区引导扇区DBR

用winhex打开U盘显示如下:

分区引导DBR

这是FAT32分区引导记录 ,定义如下:

偏移00H: 3字节的 跳转指令  EB 58 90,跳过下面的BPB和扩展BPB部分

偏移03H:8字节的硬盘分区类型文本字符名:4D 53 44 4F 53 35 2E 30 即: MSDOS5.0

偏移0BH: 25字节的分区参数块(BPB),细分如下:

偏移0BH:扇区字节数     00 02 即0X0200,512字节

偏移0DH:每簇扇区数    08即每簇包括8个扇区

偏移0EH:保留扇区数    24 00即保留36个扇区

偏移10H:FAT表份数    02即两个FAT表

偏移11H:未用         00 00

偏移13H:未用         00 00

偏移15H:介质类型  F8即本地硬盘

偏移16H:未用         00 00

偏移18H:每磁道扇区数   3F 00 即每磁道63扇区 

偏移1AH:磁头数     FF 00即255个磁头

偏移1CH:隐藏扇区数    80 1F即8064个隐藏扇区

偏移20H:磁盘总扇区数 80 F0 77 00即总共7860352个扇区(7860352*512=4024500224,因为我的U盘是4G)

偏移24H:52字节的扩展分区参数块(扩展BPB),细分如下:

偏移24H:FAT表占用扇区数  EE 1D  00 00即FAT表占7662个扇区

偏移28H:未用  00 00 00 00

偏移2CH:根目录入口簇号 02 00 00 00即根目录从02号簇开始

偏移30H:文件系统信息扇区号  01 00即扇区1

偏移32H:备份引导扇区的位置 06 00即6号扇区(第7个扇区),从WINHEX中我们也可以看到,6号扇区的内容和0号引导扇区内容     是 一样的

偏移34H:未用         00 00 00 00 00 00 00 00 00 00 00 00

偏移40H:物理磁盘号  00

偏移41H:未用  00

偏移42H:扩展引导标志 29即0X29

偏移43H:磁盘序列号F1 2A 27 04通常为一随机数

偏移47H:卷标ASCII 4E 4F 20 4E 41 4D 45 20 20 20 20 即NO NAME

偏移52H:文件系统格式ASCII  46 41 54 33 32 20 20 20即FAT32

偏移5AH:分区引导代码 420字节:

                      33C98ED1BCF47B8EC18ED9BD007C884E028A5640B408CD137305B9FFFF8AF166

                      0FB6C640660FB6D180E23FF7E286CDC0ED0641660FB7C966F7E1668946F8837E1

                      6007538837E2A007732668B461C6683C00CBB0080B90100E82B00E94803A0FA7DB

                      47D8BF0AC84C074173CFF7409B40EBB0700CD10EBEEA0FB7DEBE5A0F97DEBE0

                      98CD16CD196660663B46F80F824A00666A0066500653666810000100807E02000F8

                      52000B441BBAA558A5640CD130F821C0081FB55AA0F851400F6C1010F840D00FE4

                      602B4428A56408BF4CD13B0F96658665866586658EB2A6633D2660FB74E1866F7F1

                      FEC28ACA668BD066C1EA10F7761A86D68A56408AE8C0E4060ACCB80102CD13666

                      10F8254FF81C300026640490F8571FFC34E544C445220202020202000000000000000

                      00000000000000000000000000000000000000000000000000000000000000000000000

                      00000000000000D0A52656D6F7665206469736B73206F72206F74686572206D656469

                      612EFF0D0A4469736B206572726F72FF0D0A507265737320616E79206B657920746F2

                      0726573746172740D0A0000000000ACCBD80000

偏移1FEH:有效扇区结束标志 55 AA

到此分区引导扇区介绍结束。

文件分配表FAT

简介:

     FAT表(文件分配表),是FAT文件系统中用于磁盘数据索引和定位而引进的一种链式结构。在FAT文件系统中,文件的存储依照FAT表制定的簇链式数据结构来进行。同时,FAT文件系统将组织数据时使用的目录也抽象为文件,以简化对数据的管理。

FAT1表位置的定位:

     在我们前面介绍分区引导记录的时候提到,在偏移0EH处存储了保留扇区的个数,这个保留扇区数指的就是当前分区内DBR到FAT表之间的所有扇区的个数 (包括DBR但不包括FAT表)。因此,我们可以定位FAT表所在的起始偏移位置了,即24H*200H=4800H。我们贴出4800H处得部分内容如 下:

FAT1

     显然没有错,这就是我们FAT1所存储的位置,只是当前没有存储文件,所以FAT比较简单罢了。

FAT2表位置的定位:

     在我们前面介绍分区引导记录的时候提到,在偏移24H处存储了FAT表所占用的扇区个数,我们又知道FAT2是紧邻FAT1的,所以可以很容易得到 FAT2的存储位置的偏移地址:FAT1的起始偏移地址+FAT1的大小=4800H+1DEEH*200H=3C2400H,我们贴出3C2400H处 的部分内容如下:

FAT2

      显然没有错,这就是我们FAT2所存储的位置,内容与FAT1相同。

FAT表的特性:

     FAT表由一系列大小相等的FAT表项组成,它有如下特性:
     FAT32中每个簇的簇地址,使用32bit(4个字节)记录在FAT表中。FAT表中的所有字节位置以4个字节为单位进行划分,并对所有划分后的位置由 0进行地址编号。0 号地址与1号地址被系统保留并存储特殊标志内容。从2号地址开始,每个地址对应于数据区的簇号,FAT表中的地址编号与数据区中的簇号相同。我们称FAT 中的这些地址为FAT表项,FAT表项中记录的值称为FAT表项值。
     当文件系统被创建,也就是进行格式化操作时,分配给FAT区域的空间将会被清空,在FAT1与FAT2的0号表项与1号表项写入特定值。由于创建文件系统 的同时也会创建根目录,也就是为根目录分配了一个簇空间,通常为2号簇,所以2号簇所对应的2号FAT表项也会被写入一个结束标记。
     如果某个簇未被分配使用,它所对应的FAT表项内的FAT表项值即用0进行填充,表示该FAT表项所对应的簇未分配使用。
     当某个簇已被分配使用时,则它对应的FAT表项值也就是该文件的下一个存储位置的簇号。如果该文件结束于该簇,则在它的FAT表项中记录的是一个文件结束标记,对于FAT32而言,代表文件结束的FAT表项值为0x0FFFFFFF。
     如果某个簇存在坏扇区,则整个簇会用FAT表项值0x0FFFFFF7标记为坏簇,不再使用,这个坏簇标记就记录在它所对应的FAT表项中。
     由于簇号起始于2,所以FAT表的0号表项与1号表项不与任何簇对应。FAT32的0号表项值总是“F8FFFF0F”。1号表项可能被用于记录脏标志, 以说明文件系统没有被正常卸载或者磁盘表面存在错误。不过此值似乎并不重要,因此我们只要了解就可以。正常情况下,1号表项值为“FFFFFFFF”或 “FFFFFF0F"。
     在文件系统中新建文件时,如果新建的文件只占用一个簇,为其分配的簇所对应的FAT表项将会被写入结束标记。如果新建的文件不只占用一个簇,则在其所占用的每个簇对应的FAT表项中写入为其分配的下一簇的簇号,在最后一个簇对应的FAT表项中写入结束标记。
     新建目录时,只为其分配一个簇的空间,对应的FAT表项中写入结束标记。当目录增大超出一个簇的大小时,将会在空闲空间中继续为其分配一个簇,并在FAT表中为其建立FAT表链以描述它所占用的簇情况。
     对文件或目录进行删除操作时,它们所对应的FAT表项将会被清空,设置为0以表示其所对应的簇处于未分配状态。

根目录区

简介:

      在FAT32文件系统中,根目录的位置不再硬性地固定,可以存储在分区内可寻址的任意簇内,不过通常根目录是最早建立的(格式化就生成了)目录表。所以, 我们看到的情况基本上都是根目录首簇紧邻FAT2,占簇区顺序上的第1个簇(即2号簇)。同时,FAT32文件系统将根目录当做普通的数据文件来看,所有 没有了目录项数的限制,在需要的时候可以分配空簇,存储更多的目录项。

起始偏移地址定位:

     根目录起始扇区=保留扇区数+FAT×2+(起始簇-2)x每簇的扇区数,在我们前面介绍分区引导记录的时候提到,偏移2CH处保存了根目录起始簇号是 2,所以求得根目录起始扇区是24H+1DEEH*2H+(2-2)*8H=3C00H,即求得偏移地址3C00H*200H=780000H,我们贴出 780000H处的部分内容如下:

780000H

     目录区的一个目录项占用32个字节,可以是长文件名目录项、文件目录项、子目录项等。

                                          短文件名格式的目录项  

   对于短文件名格式的目录项。其参数意义如下:

短文件名

   根据参数定义,我们来分析一下上图的目录项 54 45 53 54 5F 46 41 54 33 32 20 08 00 00 00 00 00 00 00 00 00 00 19 95 10 3F 00 00 00 00 00 00。其中起始11字节54 45 53 54 5F 46 41 54 33 32 20 是卷标TEST_FAT32;第12字节08指示当前目录项保存的是卷标;第23-24字节19 95即9519H,是最近修改时间:19点40分50秒;第25-26字节10 3F即3F10H,是最近修改日期:2011年8月16日;

                                               长文件名格式的目录项

FAT32的一个重要的特点是完全支持长文件名。长文件名依然是记录在目录项中的。为了低版本的OS或程序能正确读取长文件名文件,系统自动为所有 长文件名文件创建了一个对应的短文件名,使对应数据既可以用长文件名寻址,也可以用短文件名寻址。不支持长文件名的OS或程序会忽略它认为不合法的长文件 名字段,而支持长文件名的OS或程序则会以长文件名为显式项来记录和编辑,并隐藏起短文件名。

   当创建一个长文件名文件时,系统会自动加上对应的短文件名,其原则如下:
     (1)、取长文件名的前6个字符加上"~1"形成短文件名,扩展名不变。
     (2)、如果已存在这个文件名,则符号"~"后的数字递增,直到5。
长 文件名的实现有赖于目录项第12字节属性字节,当此字节的值为0FH时,支持长文件名的系统会将其当做长文件名的依据,而只支持短文件名的系统会认为是异 常而忽略掉。系统将长文件名以13个字符为单位进行切割,每一组占据一个目录项。所以可能一个文件需要多个目录项,这时长文件名的各个目录项按倒序排列在 目录表中,以防与其他文件名混淆。
长文件名中的字符采用unicode形式编码,每个字符占据2字节的空间。其目录项定义如:

长文件名

下面是我建立的长文件名文件夹abcdefghijklmnopqrstuvwxyz1234567890的目录项:

长目录名

阅读(719) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~