中国DOS联盟论坛

中国DOS联盟
-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:bbs.cn-dos.net

DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

» 游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助

 

作者:
标题: 再转个这个:FAT文件系统解析(英汉对照) 上一主题 | 下一主题
starsky
初级用户




积分 191
发帖 22
注册 2004-7-30
状态 离线
『楼 主』:  再转个这个:FAT文件系统解析(英汉对照)

原文出处:http://www.nondot.org/sabre/os/f ... s/fatFilesystem.txt
译文出处:阿甘(个人站点,地址忘了:()
By: Inbar Raz
--------------------------------------------------------------------
(见下:译文)

The FAT is a linked-list table that DOS uses to keep track of the physical
position of data on a disk and for locating free space for storing new files.
The word at offset 1aH in a directory entry is a cluster number of the first
cluster in an allocation chain.  If you locate that cell in the FAT, it will
either indicate the end of the chain or the next cell, etc.  Observe:
                                    starting cluster number --|
Directory +--------------------------+-+-------------------+---+---+-+-+-------+
Entry --    |M Y F I L E   T X T|a|                     |tim|dat|08 | size  |
              +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-|-+-+-+-+
                                                     +------------------------+
      00  01  02  03  04  05  06  07    08  09  0a  0b  0c  0d  0e  0f
   +--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--+
    00| ID | |ff  ||03--04--05--ff||00||00 | |09--0a--0b--15||00||00||00||00|
   +--++--++--++--++--++--++--++--++--++--++--++|-++--++--++--++--+
                               +-------------------------------------+
   +--++--++--++--++--++-|++--++--++--++--++--++--++--++--++--++--+
    10 |00||00||00||00||00||16--17--19| |f7||1a--1b--ff||00||00||00||00|
   +--++--++--++--++--++--++--++|-++--++|-++--++--++--++--++--++--+
                                +-------+
This diagram illustrates the main concepts of reading the FAT.  In it:
* The file MYFILE.TXT is 10 clusters long.  The first byte is in cluster 08
  and the last is in cluster 1bH.  The chain is 8,9,0a,0b,15,16,17,19,1a,1b.
  Each entry indicates the next entry in the chain, with a special code in
  the last entry.
* Cluster 18H is marked bad and is not part of any allocation chain.
* Clusters 6,7, 0cH-14H, and 1cH-1fH are empty and available for allocation.
* Another chain starts at cluster 2 and ends at cluster 5.
+-----------+
| FAT Facts | The FAT normally starts at logical sector 1 in the DOS partition
+-----------+ (eg, you can read it with INT 25H with DX=1).  The only way to
be sure is to read the boot sector (DX=0), and examine offset 0eH.  This
tells how many boot and reserved sectors come before the FAT.  Use that
number (usually 1) in DX to read the FAT via INT 25H.
There may be more than one copy of the FAT.  There are usually two complete
copies.  If there are two or more, they will all be adjacent (the second FAT
directly follows the first).
You have the following services available to help you determine information
about the FAT:
   * Use INT 25H to read the Boot Sector and examine the data fields therein
   * Use DOS Fn 36H or 1cH to determine total disk sectors and clusters
   * Use DOS Fn 44H (if the device driver supports Generic IOCTL)  DOS 3.2
   * Use DOS Fn 32H to get all kinds of useful information.   UNDOCUMENTED
Note: The boot sector of non-booting disks (such as network block devices
       and very old hard disks) may contain nothing but garbage.
+---------------+
| 12-bit/16-bit | The FAT can be laid out in 12-bit or 16-bit entries. 12-bit
+---------------+ entries are very efficient for media less than 384K--the
entire FAT can fit in a single 512-byte disk sector.  For larger media, each
FAT entry must map to a larger and larger cluster size--to the point where a
20M hard disk would need to allocate in units of 16 sectors in order to use
the 12-bit format (in other words, a 1-byte file would take up a full 8K
cluster of a disk).
16-bit FAT entries were introduced with DOS 3.0 with the necessity of
efficient handling the AT's 20-Megabyte hard disk.  However, floppy disks
and 10M hard disks continue to use the 12-bit layout.  You can determine if
the FAT is laid out with 12-bit or 16-bit elements:
  DOS 3.0 says: If a disk has more than 4086 (0ff6H) clusters, it uses 16 bits
                (4096 is max value for a 12-bit number and >0ff6H is reserved)
  DOS 3.2 says: If a disk has more than 20740 (5104H) SECTORS, it uses 16 bits
                (in other words, any disk over 10 Megabytes uses a 16-bit FAT
                 and all others--including large RAM disks--use 12-bits).
Note: It's a common misconception that the 16-bit FAT allows DOS to work with
      disks larger than 32 Megabytes.  In fact, the limiting factor is that
      INT 25H/26H (through which DOS performs its disk I/O) in unable to
      access a SECTOR number higher than 65535.  Normally, sectors are 512
      bytes (?-K), so that sets the 32M limit.
      In DOS 4.0, INT 25H/26H supports a technique for accessing sector
      numbers
      higher than 65535, and thus supports trans-32M DOS partitions.  This
      has no effect on the layout of the FAT itself.  Using 16-bit FAT
      entries and 4-sector clusters, DOS now supports partitions up to 134M
      (twice that for 8-sector clusters, etc.).
+-----------------+
| Reading the FAT | To read the value of any entry in a FAT (as when following
+-----------------+ a FAT chain), first read the entire FAT into memory and
obtain a starting cluster number from a directory.  Then, for 12-bit entries:
* Multiply the cluster number by 3 ===============|
* Divide the result by 2   =========+= (each entry is 1.5 (3/2) bytes long)
* Read the WORD at the resulting address (as offset from the start of the FAT)
* If the cluster was even, mask the value by 0fffH (keep the low 12 bits)
  If the cluster number was odd, shift the value right by 4 bits (keep the
  upper 12 bits)
* The result is the entry for the next cluster in the chain (0fffH=the end).
Note: A 12-bit entry can cross over a sector boundary, so be careful with
      1-sector FAT buffering schemes.
16-bit entries are simpler--each entry contains the 16-bit offset (from the
start of the FAT) of the next entry in the chain (0ffffH indicates the end).
+-------------+
| FAT Content | The first byte of the FAT is called the Media Descriptor or
+-------------+ FAT ID byte.  The next 5 bytes (12-bit FATs) or 7 bytes
(16-bit FATs) are 0ffH.  The rest of the FAT is composed of 12-bit or 16-bit
cells that each represent one disk cluster.  These cells will contain one of
the following values:
    * (0)000H ................... an available cluster
    * (f)ff0H through (f)ff7H ... a reserved cluster
    * (f)ff7H ................... a bad cluster
    * (f)ff8H through (f)fffH ... the end of an allocation chain
    * (0)002H through (f)fefH ... the number of the next cluster in a chain
Note: the high nibble of the value is used only in 16-bit FATs; eg, a bad
      cluster is marked with 0ff7H in 12-bit FATs, and fff7H with 16-bit FATs.
+------------------------------------------------+
| Converting a Cluster Number to a Sector Number | After you obtain a file's
+------------------------------------------------+ starting cluster number
from a directory entry you will want to locate to actual disk sector that
holds the file (or subdirectory) data.
A diskette (or a DOS partition of a hard disk) is laid out like s
* Boot and reserved sector(s)
* FAT #1
* FAT #2 (optional -- not used on RAM disks)
* root directory
* data area (all file data reside here, including files for directories)
Every section of this layout is variable and the sizes of each section must
be known in order to perform a correct cluster-to-sector conversion.  The
following formulae represent the only documented method of determining a DOS
logical sector number from a cluster number:
       RootDirSectors = sectorBytes / (rootDirEntries * 32)
       FatSectors     = fatCount * sectorsPerFat
       DataStart      = reservedSectors + fatSectors + rootDirSectors
  INT 25h/26h Sector  = DataStart + ((AnyClusterNumber-2) * sectorsPerCluster)
Where the variables:
       sectorBytes      sectorsPerFat      fatCount
       rootDirEntries   reservedSectors    sectorsPerCluster
are obtained from the Boot Sector or from a BPB (if you can get access).  The
resulting sector number can be used in DX for INT 25H/26H DOS absolute disk
access.
If you are a daring sort of person, you can save trouble by using the
undocumented DOS Fn 32H (Get Disk Info) which provides a package of pre-
calculated data, including the sector number of the start of file data (it
gives you "DataStart", in the above equation).
Author's note:  The best use I've found for all this information is in
directory scanning; ie, to bypass the DOS file-searching services and read
directory sectors directly.  For a program that must obtain a list of all
files and directories, direct access of directory sectors will work roughly
twice as fast as DOS Fns 4eH and 4fH.

翻译:
FAT文件系统解析(阿甘译)http://www.nondot.org/sabre/os/f ... s/fatFilesystem.txt
原文作者: Inbar Raz
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  FAT是一个链表结构,DOS利用这个链表来保持对硬盘上数据的物理位置的追踪,并且可以为储存新文件分配空间。
   处于目录入口点谝移地址1ah的一个字(word)是这个分配链结构中,第一个簇的簇号。如果你在FAT中定位这个单元,它指向
链结构的尾部,或者下一个单元,等等。观察下面示例:
     (图见原文上)   
  这个图表显示了读取FAT的一些重要概念。其中:
 1>这个文件--MYFILE.TXT有10个簇的长度。第一个字节在簇08H处,最后一个字节在簇1bH处,这个链结构是:8,9,0a,0b,15,
16,17,19,1a,1b。每个入口都指示了链结构的下一个入口,最后一个入口被赋予特殊的代码(ff)。
 2>簇18H被标识为坏簇,不能分配给任何链结构。
 3>簇6,7,0cH-14H,1cH-1fH是空闲的,并且能够被分配。
 4>另外有一个链结构开始于簇2,结束于簇5。
+------------+
|  FAT细节   | FAT结构一般开始于DOS分区的第一个逻辑分区,(你可以使用INT 25H 并且 DX=1 来读取它)。唯一确保的方
+------------+
法是读取启动扇区(DX=0),检查偏移0eH。这样能够知道在FAT之前有多少启动扇区和保留扇区,将这个值(通常是1)赋给DX,然后通
过中断INT 25H来读取FAT。
  有可能存在不止一份的FAT的拷贝。通常存在两份完全的FAT拷贝。如果存在两份或者更多,他们都会被放在连续的空间(第二份
FAT紧接着第一份放置)。
  你可以通过下面的手段来帮助你确定FAT的信息:
 1>使用INT 25H来读取启动扇区,并检验其中的数据域。
 2>使用DOS系统功能调用 36H 或者1CH 来检验硬盘总扇区和簇数。
 3>使用DOS系统功能调用 44H(假如设备驱动支持Generic IOCTL) DOS3.2
 4>使用DOS系统功能调用 32H来获得所有有用的信息。(未公开发布)
   注意:一些非启动型磁盘的启动扇区(例如 一些网络块设备和一些非常老式的硬盘)没有包含任何有
用的东西。
+-------------+
| 12位/16位 | FAT表能够是12位或者16位的。12位入口对小于384K的媒体存储效率很高,(整个入口的FAT表能够放置在单个512
+-------------+
字节的磁盘扇区。对于更大的媒体,每个FAT表入口必须映射到一个更大的簇尺寸),由此,一个20M的硬盘将需要分配16个磁盘扇区
单元,才能使用12位格式(换一种说法,1个一字节的文件将会整整占用8K大小的磁盘簇)。 16位FAT表入口被DOS3.0引入,目的是为
了更有效地管理AT的20M硬盘。尽管如此,软盘和10M硬盘继续使用12位格式。你能够判断FAT表是12位结构还是16位结构的:

 DOS 3.0 : 如果一个磁盘有超过4086(0ff6H)的簇,它将使用16位格式(4096是12位格式簇的最大值,大于0ff6H是保留簇)。
 DOS 3.2 : 如果一个磁盘有多于20740(5104H)的簇,它将使用16位格式(即:任何超过10M大小的磁盘都使用16位格式,所有其
他的--包括大容量的RAM磁盘--都使用12位格式)。

  注意:一个很常见的误区是:是16位格式的FAT允许DOS工作在大于32M的磁盘上。实际上,限制因素是中断调用?INT 25H/26H
(DOS通过它进行磁盘的输入输出) 不能访问簇号高于65535。一般地,簇大小为512字节(远小于1K),所以有32M的限制。
 在DOS 4.0中,INT 25H/26H支持一种允许访问簇号高于65535的技术,所以支持大于32M DOS分区。这对FAT的实现并没有影响。
使用16位的FAT入口和4扇区的簇,现在DOS支持分区的大小高达134M(是8扇区簇的两倍)。

+-----------+
| 读FAT表  |   在读取一个FAT表入口的过程中(沿着FAT链结构)??首先将整个FAT表读入内存中, 从目录表中得到起始簇号,
+-----------+
然后对12位的入口进行下面的操作:
 * 将簇号乘以3     -------------|
 * 将上面的结果除以2? -------------+-------(每个入口都是1.5(3/2)字节长)
 * 在得到的地址处读取一个字(WORD).(作为与FAT表起始位置的偏移)
 * 假设该簇号是偶数,用0FFFH来屏蔽这个值(保留低12位)
  假设该簇号是奇数,将其值右移4位(保留高12位)
 * 得到的结果就是链结构中下一个簇的入口。

  注意:一个12位的入口能够跨越扇区的边界,因此必须小心处理一个扇区中FAT表的缓冲设计。
 16位的入口要简单一些---每个入口包含16位的偏移,这个偏移是链结构中下个入口相对于FAT表起始位置的偏移(0ffffH表示链结
构结束)。
+--------------+
| FAT 表的内容 | FAT表的第一个字节叫做媒体描述符(Media Descriptor)或者FAT表的ID字节。接下来的5个字节(12位的FAT表)
+--------------+ 
或者7个字节(16位的FAT表)都是0FFH,FAT表的其余部分由一些12位或者16位的单元组成,每个单元代表磁盘上的一个簇。这些单元
包含下面值当中的一个:

 * (0)000H ................... 空闲簇
 * (f)ff0H through (f)ff7H ... 保留簇
 * (f)ff7H ................... 坏簇
 * (f)ff8H through (f)fffH ... 链结构的结束簇
 * (0)002H through (f)fefH ... 链结构中的下一个簇
 注意:上面值的高半个字节仅仅在16位的FAT表中使用,例如:一个坏簇在12位的FAT表中被标识为0FF7H,在16位的FAT表中被标
识为0FFF7H。
+------------------------------------------+
|         将一个簇号转换成扇区号         | 当你从目录接口中得到一个文件的起始簇号,你也许想定位存储文件(或者子
+------------------------------------------+
目录)数据的物理扇区。
  一个物理磁盘(或者一个硬盘的DOS分区)被设计成下面的样子:
 * 启动扇区和保留扇区
 * 第一个FAT表
 * 第二个FAT表 (可选的 -- 在RAM磁盘上不使用)
 * 根目录
 * 数据区 (所有的文件数据都定居在这里^_^, 包括文件和目录)
  这个设计的每个区段都是可变的。必须获得每个区段的大小,以便进行簇到扇区正确的转换。下面的公式提供了一个官方发布的
方法,来根据簇号得到DOS 的逻辑扇区号:
 
  根目录扇区数   = 每扇区的字节数/ (根目录的入口数 * 32)
  FAT表的扇区数   =  FAT表数目 * ?每个FAT表的扇区数
  数据起始扇区号  = 保留扇区数 + FAT表的扇区数+ 根目录扇区数
 INT 25h/26h 扇区号 = 数据起始扇区号 + ((某个簇号-2) * 每个簇的扇区数)
 其中下面的变量:
  每扇区的字节数  每个FAT表的扇区数   FAT表数目 
  根目录的入口数  保留扇区数       每个簇的扇区数
   都是从启动扇区或者BPB结构(如果能够访问)。得到的扇区号可以被赋给DX,通过INT 25H/26H来直接访问DOS 磁盘。
   如果你是一个怕麻烦的人,你可以通过使用未公开发布的DOS系统功能调用(fn 32h--获得磁盘信息),省去计算的麻烦,
这个功能调用已经预先将数据计算好了,包括文件数据起始扇区号(也就是上面提到的“数据起始扇区号”).
   作者友情提示:上面我所发现的信息用处最大的地方是在对目录的扫描上。例如:可以省略DOS 的文件查找功能,可以直接
对目录扇区的直接读操作。在一个必须得到所有文件和目录的清单的程序中,直接地访问目录扇区将会比DOS 功能调用fns 4eH和
4FH大约快两倍。

[此贴子已经被作者于2004-8-28 23:12:14编辑过]



2004-8-28 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
starsky
初级用户




积分 191
发帖 22
注册 2004-7-30
状态 离线
『第 2 楼』:  

:( 发现这里对不齐的,上面的那张图错位了
还是上传文件吧:打开附件

[此贴子已经被作者于2004-8-28 23:14:55编辑过]



2004-8-28 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转:  



[ 联系我们 - 中国DOS联盟 ]


Powered by Discuz! © 2001-2011