FAT

文件配置表(英文:File Allocation Table,首字母縮略字:FAT)是一種由微軟發明的並帶有部分專利[1]的文件系統,供MS-DOS使用,也是非NT內核的微軟窗口使用的文件系統。
  FAT文件系統考慮當時計算機效能有限,所以未被複雜化,因而被幾乎所有個人計算機的操作系統支持。這特性使它成爲理想的軟盤和記憶卡文件系統,也適合用作不同操作系統中的數據交流。
  但FAT有一個嚴重的缺點:當文件被刪除並且在同一位置被寫入新數據,他們的片段通常是分散的,減慢了讀寫速度。磁盤碎片重整是一種解決方法,但必須經常重組來保持FAT文件系統的效率。

歷史

   FAT文件系統遵行已用了多年的軟件方法來進行規範。它在1977年由比爾·蓋茨和馬斯·麥當勞爲了管理磁盤而發明,並在1980年被添·彼得遜的 86-DOS操作系統採用。這也是86-DOS操作系統與CP/M操作系統最大的不同點,若非此項差異,86-DOS操作系統與CP/M操作系統幾乎可說 完全相同。
  FAT12
  
初期的FAT就是現在俗稱的FAT12。作爲軟盤的文件系統,它有幾項限制:不支持分層性結構,叢集尋址只有12位(這使得控制FAT有些棘手)而且只支持最多32M(216)的分區。
  當時入門級的磁盤是5.25"、單面、40磁道、每個磁道8個扇區、容量略少於160KB。上面的限制超過了這個容量一個或幾個數量級,同時允許將所有的控制結構放在第一個磁道,這樣在讀寫操作時移動磁頭。這些限制在隨後的幾年時間裏被逐步增大。
  由於唯一的根目錄也必須放在第一個磁道,能夠存放的文件個數就限制在了幾十個。
  目錄
  
爲了很好地支持以帶有10MB硬盤爲特色的IBM PC XT新計算機,在1983年年初MS-DOS 2.0幾乎與該計算機在同時發佈,它引進了層次目錄結構。除了允許更好地組織文件外,目錄允許在硬盤上存儲更多的文件,這是因爲最大文件個數不再受制於 (仍然是固定的)根目錄大小。這個數目現在能夠等同於簇的數目(甚至更大,這是考慮到長度爲0的文件並不佔據任何FAT簇)。
  FAT本身的格式並沒有改變。PC XT的10MB的硬盤有4KB大小的簇。如果後來安裝了一個20MB的硬盤,並且使用MS-DOS 2.0格式化,最後的簇大小將變爲8KB,硬盤容量將變爲15.9MB。
  FAT16的開始
  
在1984年,IBM發佈PC AT,這是一個20 MB的硬盤。微軟公司也同步發佈了MS-DOS 3.0。簇集地址增加至16位,允許更大數量的簇(最大 65,517),所以有更大的文件系統大小。但是,最大數量磁區及最大分割區(相當於磁盤)的大小仍是32 MB。所以,儘管技術上已經是“FAT16”,這種格式並不是我們今天常見到的這個名字所代表的格式。在MS-DOS 3.0格式化一個20 MB的硬盤,這硬盤將不能被MS-DOS 2.0或之前的版本所存取。當然,MS-DOS 3.0 仍然可存取MS-DOS 2.0的格式(8 KB簇的分割區)。
  MS-DOS 3.0也開始支持高密度1.2MB 5.25"磁盤,最著名的是每個磁道有15個扇區,這樣就允許FAT有更大的空間。這或許促進了一個對於簇大小的不確定的優化,簇大小從2個扇區減到1 個。這樣做的最後結果是高密度磁盤比舊的雙密度磁盤的速度大幅度降低。
  擴展分區和邏輯驅動器
  除了改進FAT文件系統本身的結構之外,一個並行的提高FAT存儲空間的開發路線是支持多個磁 盤分區。最初,由於主引導分區中文件分配表的固定結構的原因一個硬盤只能使用多達4個分區。然而,由於DOS設計要求只能有一個分區標識爲“活動的”,它 也是主引導代碼啓動所用的分區。使用DOS工具不可能創建幾個“主”DOS分區,並且第三方的工具也至少會警告這樣一個機制將與DOS不兼容。
  爲了用一種兼容的方式使用更多的分區,一種新的分區類型被開發出來(1986年]1月的MS- DOS 3.2),擴展分區它實際上是另外稱爲邏輯分區的一個容器。最初它裏面只允許有一個邏輯分區、支持最大64MB的硬盤。在MS-DOS 3.3(1987年8月)這個限制更改到24個分區;它可能來自於強制性的C:-Z:的磁盤命名規則。邏輯分區表使用盤上的數據結構來描述,可能是爲了簡 化編碼它與主引導記錄非常相似,並且它們組織成類似於俄羅斯套娃那樣的結構。系統中只能有一個擴展分區。
  在擴展分區引入之前,一些硬盤控制器(當時是獨立的板子,因爲還沒有IDE標準)能夠將大硬盤顯示爲兩個獨立的硬盤。作爲一種選擇,如Ontrack[1]的磁盤管理員這樣的一些特殊軟件可以用於同樣目的。
  最終的FAT16
  1987年11月我們今天稱爲FAT的格式最終到來,它在康柏 DOS 3.31中去掉了磁盤扇區的16位計數器。這個結果曾經一度被稱爲DOS 3.31大文件系統。儘管看起來磁盤上的變動很小,這個DOS的磁盤代碼都必須檢查並轉換到32位的扇區數,由於它全部是16位的彙編語言這樣一個現實, 這項工作就變得非常複雜。
  1988年這項改進通過MS-DOS 4.0得到廣泛應用。現在分區大小受限於每個簇的8位有符號扇區計數,它最大能達到2的64次方,對於一個常用的有32KB個簇每扇區512字節的硬盤來 說,將FAT16分區大小的“明顯”限制擴充到2GB。在磁光盤媒體上,它能使用1或者2KB的扇區,這樣大小限制也就成比例地增大。
  後來,視窗NT通過將每個簇的扇區數當作無符號數將最大的簇大小增加到64KB。然而這個格式與當時其它的任何FAT實現都不兼容並且產生了大量內部碎片。視窗98也支持這種格式的讀寫操作但是它的磁盤管理工具不支持這種格式。
  長文件名(VFAT, LFN)
  Windows 95設計人員的一個用戶體驗目標就是除了傳統的8.3文件名以外在新操作系統中使用長文件名(LFN)。長文件名通過在目錄條目排列時使用一個工作區來實 現(參見下面)。按照Windows 95VxD設備驅動程序的命名規則這個新擴充的文件系統通常稱爲VFAT。
  有意思的是,VFAT驅動在早於Windows 95的Windows for Groups 3.11中就已經出現,但它僅僅用於實現32位文件訪問,一個繞過DOS的視窗自帶高性能保護模式文件管理系統,它能夠直接使用BIOS或者更好的32位 磁盤訪問,如視窗自帶的保護模式磁盤驅動程序。它是一個後門;微軟爲Windows for Groups 3.11所作的廣告說32位文件訪問基於“芝加哥項目的32位文件系統”。
  在Windows NT中,FAT文件系統對於長文件名的支持從3.5版就已經開始了。
  FAT32
  
爲了解決FAT16對於卷大小的限制同時讓DOS的真實模式在非必要情況下不減少可用常規內存狀況下處理這種格式,微軟公司決定實施新一代的FAT,它被稱爲FAT32,帶有32位的簇數,目前用了其中的28位。
  理論上,這將支持總數達268,435,438(<228)的簇,允許磁盤容量達到2字 節。然而,由於微軟公司scandisk工具的限制,FAT不能大於4,177,920(<222)個簇,這將卷的容量限制在了124.55GB, 除非不再使用“scandisk”。[2]
  FAT32隨着視窗95 OSR2發佈,儘管需要重新格式化才能使用這種格式並且DriverSpace 3(視窗95 OSR2和視窗98所帶版本)從來都不支持這種格式。視窗98提供了一個工具用來在不丟失數據的情況下將現有的硬盤從FAT16轉到FAT32格式。在 NT產品線上對於它的支持從視窗2000開始。
  視窗2000和視窗XP能夠讀寫任何大小的FAT32文件系統,但是這些平臺上的格式化程序只 能創建最大32GB的FAT32文件系統。Thompson and Thompson (2003)寫道“奇怪的是微軟公司說這種現象是故意設計的”[3] 微軟公司知識庫文章 184006[4]的確是這麼說的,但是沒有提出任何關於這個限制的合理解釋。Peter Norton的觀點是“微軟公司在有意地削弱FAT32文件系統”[5]。
  第三方支持
  其它IBM PC的可選操作系統—如Linux、FreeBSD和BeOS—都支持FAT格式,並且大部分都在相應的視窗版本發佈以後很快就支持VFAT和FAT32 格式。早期的Linux發佈版本還包括稱爲UMSDOS的格式,它是保存在一個獨立的稱爲--linux-.---的帶有Unix文件屬性(如長文件名和 訪問許可)的FAT。UMSDOS在VFAT發佈以後就不再使用從Linux內核2.5.7開始就禁止了這項功能。Mac OS X操作系統在除啓動盤之外的其它捲上也支持FAT文件系統。
  FAT和其它數據流
  FAT文件系統本身不是爲支持ADS而設計的,但是一些高度依賴它們的操作系統創造出不同的方 法在FAT驅動器上處理它們。這些方法或者在額外的文件或路徑中存儲附加的信息(Mac OS),或者給那些磁盤數據結構中以前沒有使用的變量賦予新的含義(OS/2和視窗NT)。第二種設計,儘管想象起來會更有效率,但是它們不能被不認識這 種格式的工具複製或者備份;使用不能識別這種格式的磁盤工具(如碎片整理或CHKFSK)控制這些磁盤可能會破壞這些信息。
  Mac OS使用PC Exchange存儲不同的數據,文件屬性和文件名存在一個名爲FINDER.DAT的隱藏文件中,資源分支(ADS)存在名爲 RESSOURCE.FRK的子目錄中,這些數據都存在使用它們的每個目錄中。從PC Exchange 2.1開始,它們將Mac OS的長文件名保存爲標準的FAT長文件名,並且將超過31個字符的FAT長文件名轉換爲唯一的31字符能夠被Macintosh應用程序識別的文件名。
  Mac OS X將元數據(資源分支、不同的ADS、文件屬性)保存在與所有人相同並以“._”開始的名字的隱藏文件中,並且Finder將一些文件夾和文件元數據存在名爲“.DS_Store”的隱藏文件中。
  OS/2高度依賴於擴展屬性(EA)並且將它們存在位於FAT12或FAT16的根目錄下名爲 “EA DATA. SF”的隱藏文件中。這個文件使用以前文件(或者目錄)的目錄清單中的兩個保留字節索引。在FAT32格式中,這些字節中存有文件或者目錄開始簇號的高 16位,這樣就使它難於在FAT32上保存EA。擴展屬性可以通過Workplace Shell桌面、REXX腳本、許多系統圖形用戶接口和命令行工具(如4DOS|4OS2]]來訪問。
  Windows NT支持HPFS、NTFS和FAT中所有擴展屬性的處理(所用處理機制完全類似於OS/2),但是不能處理其它一些存於NTFS驅動器的ADS數據。試 圖從複製帶有與NTFS驅動器屬性不同擴展屬性的ADS到FAT驅動器將報告一個警告信息提示ADS將會丟失。
  Windows 2000以後產品的處理類似於視窗NT但複製到FAT32時它們沒有顯示任何警告信息直接丟棄擴展屬性(但報告其它象“Macintosh Finder Info”和“Macintosh Resource Fork”這些ADS引起的警告)。
  前景
  微軟公司最近獲得了VFAT和FAT32的專利(但沒有得到最初的FAT的專利),這引起人們 對於微軟將會尋求從Linux OS發佈和初始化他們產品的媒體廠商收取專利費的擔憂(參見下面的FAT授權協議)。儘管最初的裁定不利於微軟公司,但是微軟仍然取得了勝利並且得到了專 利授權。
  由於微軟公司已經宣佈不再開發基於MS-DOS的消費用操作系統視窗Me的後續版本,所以不再 有可能會有新版的FAT。對於大多數用途來說,爲視窗NT系列開發的NTFS文件系統從效率、性能和可靠性來說都優於FAT;它的主要缺點是小容量文件所 佔的額外空間以及除了基於NT的視窗之外的很少有其他操作系統支持。由於確切的規範是微軟公司的商業祕密,這就使得使用一個DOS軟盤用於恢復目的很困 難。微軟公司提供了一個恢復界面來解決這個問題,由於安全的原因它嚴重限制了缺省情況下它能解決的問題。
  FAT仍然是活動媒體的常用文件系統(CD和DVD是例外),軟碟使用的是FAT12,其它多 數活動媒體用的是FAT16(如用於數位相機的快閃記憶卡和USB隨身碟)。許多活動媒體還沒有達到能夠享用FAT32。出於兼容性和存儲空間利用率的考 慮FAT仍然用在這些驅動器上,同時也是由於這些活動媒體上的文件的許可更容易遇到麻煩而不是更重要這樣一個事實。
  視窗2000和XP支持的FAT32格式化的限制是32GB,這非常有效地強迫使用現代硬盤的用戶或者使用NTFS或者在視窗之外格式化驅動器。一個解決的辦法是使用從Linux移植到視窗平臺的一個工具version of mkdosfs。
  這裏也有一個自由開源的工具。

設計

  主磁盤結構
  一個FAT文件系統包括四個不同的部分。
  保留扇區,位於最開始的位置。第一個保留扇區是引導區(分區啓動記錄)。它包括一個稱爲基本輸 入輸出參數塊的區域(包括一些基本的文件系統信息尤其是它的類型和其它指向其它扇區的指針),通常包括操作系統的啓動調用代碼。保留扇區的總數記錄在引導 扇區中的一個參數中。引導扇區中的重要信息可以被DOS和OS/2中稱爲驅動器參數塊的操作系統結構訪問。
  FAT區域。它包含有兩份文件分配表,這是出於系統冗餘考慮,儘管它很少使用,即使是磁盤修復工具也很少使用它。它是分區信息的映射表,指示簇是如何存儲的。
  根目錄區域。它是在根目錄中存儲文件和目錄信息的目錄表。在FAT32下它可以存在分區中的任何位置,但是在早期的版本中它永遠緊隨FAT區域之後。
  數據區域。這是實際的文件和目錄數據存儲的區域,它佔據了分區的絕大部分。通過簡單地在FAT 中添加文件鏈接的個數可以任意增加文件大小和子目錄個數(只要有空簇存在)。然而需要注意的是每個簇只能被一個文件佔有,這樣的話如果在32KB大小的簇 中有一個1KB大小的文件,那麼31KB的空間就浪費掉了。 例外情況
  Apricot PC的MS-DOS所用FAT的實現有一個不同的啓動扇區組織以使用計算機與IBM不兼容的基本輸入輸出系統。跳轉指令和OEM名被省略並且MS-DOS 文件系統參數位於0x50(在標準扇區中偏移爲0x0B - 0x17)。後來的Apricot MS-DOS版本除了Apricot特有的引導區之外也具有了讀寫標準啓動分區的能力。
  BBC Master 512 上的DOS Plus根本就不使用傳統的引導區。數據磁盤省略了引導區並且以一個單份的FAT開始(FAT的第一個字節用來確定磁盤容量),啓動磁盤使用一個包含啓動調用程序的小型ADFS文件系統,後面跟隨一個單份的FAT。
  文件分配表
  
一個分區分成同等大小的簇,也就是連續空間的小塊。簇的大小隨着FAT文件系統的類型 以及分區大小而不同,典型的簇大小介於2KB到32KB之間。每個文件根據它的大小可能佔有一個或者多個簇;這樣,一個文件就由這些這些(稱爲單鏈表)簇 鏈所表示。然而,這些鏈並不一定一個接着一個在磁盤上存儲,它們經常是在整個數據區域零散的儲存。
  文件分配表(FAT)是映射到分區每個簇的條目列表。每個條目記錄下面五種信息中的一種。
  鏈中下一個簇的地址
  一個特殊的文件結束符(EOF)符號指示鏈的結束
  一個特殊的符號標示壞簇
  一個特殊的符號標示保留簇
  0來表示空閒簇
  每個版本的FAT文件系統使用不同大小的FAT條目。這個大小已經由名字表示出來,例如 FAT16文件系統的每個條目使用16位表示,32位文件系統使用32位表示。這個不同意味着FAT32系統的文件分配表能比FAT16映射更多的簇,它 也允許FAT32有更大的分區大小。這也使得FAT32比FAT16更能有效地利用磁盤空間,因爲每個驅動器能夠尋址更小的簇,這也就意味着更少的空間浪 費。
  目錄表
  目錄表是一個表示目錄的特殊類型文件(現今通常稱爲文件夾)。它裏面保存的每個文件或目錄使用表中的32位條目表示。每個條目記錄名字、擴展名、屬性(檔案、目錄、隱藏、只讀、系統和卷)、創建的日期和時間、文件/目錄數據第一個簇的地址,最後是文件/目錄的大小。
  除了FAT12和FAT16文件系統中的根目錄表佔據特殊的根目錄區域位置之外,所有其它的目錄表都存在數據區域。
  合法的DOS文件名包括下面一些字符:
  大寫字母A-Z
  數字0-9
  空格(儘管結尾的空格被作爲填充而不是文件名的一部分)
  ! # $ % & ( ) - @ ^ _ ` { } ~ '
  數值 128-255
  DOS文件名位於OEM字符集。
  長文件名(LFN)使用一個技巧存儲在FAT文件系統上——在目錄表中添加假的條目。這些條目 使用一個普通文件無法使用的卷標屬性標識,普通文件無法使用是由於它們被大多數舊的MS-DOS程序忽略。很顯然,一個只包含卷標的目錄被當作空卷,這樣 就允許刪除;使用長文件名創建的文件在從普通的DOS刪除就會發生這樣的情形。
  校驗和也允許檢驗長文件名是否與8.3文件名匹配;當一個文件刪除之後使用DOS在同一個目錄 位置重新創建之後就會出現不匹配現象。校驗和使用下面的算法計算。(注意pFcbName是指向如正常目錄條目中所顯示的文件名的指針,例如前八個字符是 文件名,最後三個是擴展名。點是隱含的。文件名中沒有使用的空間將使用空格(ASCII 0x20)補齊。例如,“Readme.txt”將記錄爲"README TXT"。
  unsigned char lfn_checksum(const unsigned char *pFcbName)
  {
  int i;
  unsigned char sum=0;

  for (i=11; i; i--)
  sum = ((sum & 1) ? 0x80 : 0) + (sum >> 1) + *pFcbName++;
  return sum;
  }
  
舊版的PC-DOS錯誤地將根目錄中的長文件名當作卷標,這樣它們就會顯示錯誤的卷標。
  每個假條目包含13UTF-16個字符(26字節),通過使用包含文件大小或者時間記錄的區域獲得除了舊的8+3之外的另外15個字節(但是出於安全和磁盤檢查工具的考慮開始簇的區域沒有使用保留值爲0)。參見8.3中另外的解釋。
  如果一個文件名只包含小寫字母、或者是一個小寫字母的名加上大寫擴展名的混合或者與此相反,沒 有特殊的字符並且滿足8.3的限制,在視窗NT上就不創建VFAT的條目。相反,在目錄條目的偏移0x0c處的沒有說明的位用來指示文件名全部或者部分是 小寫字母。特別明確的是,位4意味着小寫字母的擴展名,位3意味着名是小寫字母,這樣就允許如“example.TXT”和“HELLO.txt”這樣的 組合,但是不允許“Mixed.txt”這樣的組合。很少有操作系統支持這種功能。非NT視窗版本當這個擴展使用時將把文件名當作大寫字母。缺省情況 下,Linux的最近版本將認識這個擴展但是在寫時並不使用它。
  第三方擴展
  在微軟公司添加長文件名和創建/訪問時間戳之前,其它的操作系統使用目錄表字節0x0C-0x15存儲其它的元數據。

FAT授權

  在二十世紀九十年代中期微軟公司申請並獲得了一系列的FAT文件系統內核部分的專利。由於具有廣泛的兼容性和易於理解,FAT經常被選爲用於數碼相機和個人數碼助理中閃存的數據交換格式。
  2003年12月3日微軟公司宣佈使用FAT規範和“相關智慧產權”將需要得到授權,被個銷售單元支付0.25美元的版權費,每個授權協議最多250,000美元的版權費。
  爲了這個目的,微軟公司提及了四個關於FAT文件系統的專利作爲它的知識產權主張的基礎。所有這些與長文件名擴展有關的FAT首先出現在Windows 95中:
  美國專利 5,745,902 - 訪問使用不同文件名格式的文件名的方法和系統。1992年7月6日備案。這包括生成、聯繫一個8.3兼容格式的短文件名和長文件名的方法(如 “Microsoft.txt”和“MICROS~1.TXT”),以及列舉相互衝突的短文件名的方法(如“MICROS~2.TXT”和 “MICROS~3.TXT”)。現在還不清楚這個專利是否覆蓋不具有顯式長文件名能力的FAT實現。Unix文件系統中的硬連接看起來不是先行者:從長 文件名刪除一個FAT文件也將刪除它的短文件名。將一個文件重命名爲一個“短”文件名也將一致地更改長文件名;同樣,將一個文件重命名爲“長”文件名也將 重新生成一個“短”文件名。在NTFS中,硬連結和兩個名字是不同的概念,並且每個硬連結都有兩個名字。最後,在API的層面上,當在系統中進行目錄搜索 時兩個文件名都會出現;它們看起來不是兩個獨立的文件並且它們也沒有有必要去“映射”確定同一個文件。
  美國專利 5,579,517 - 長、短文件名公用的命名空間。1995年4月24日備案。這包括將多個連續8.3目錄條目鏈接在一起支持長文件名的方法,其中一些條目特殊進行標記阻止可能引起混淆地早期的不支持長文件名的FAT實現。
  公共專利基金會成功地對這項專利發起了挑戰;這個專利申請由於所申請的技術在專利美國專利 5,307,494 和 美國專利 5,367,671中的先期發現在2004年9月14日被駁回]。這個決定後來在2006年1月10日被美國專利局所推翻。
  美國專利 5,758,352 - 長、短文件名公用的命名空間。1996年9月5日備案。它非常類似於5,579,517。
  公共專利基金會成功地對這項專利發起了挑戰;美國專利商標局基於"the six assignees names were incorrect" [4]在2005年10月5日駁回了這項專利。這個決定也在後來的2006年1月10日被美國專利局推翻。
  美國專利 6,286,013 - 在操作系統中爲長、短文件名提供一個公用的命名空間的方法和系統。1997年1月28日備案。它所申請的內容包括Windows 95、Windows 98和Windows Me的長文件名提供給它們MS-DOS兼容層所用的方法。它看起來不影響非微軟的FAT實現。
  許多技術評論斷言這些專利僅僅涵蓋了支持長文件名的FAT實現,那些只使用短名字的移動固態媒體和消費設備將不受影響。
  另外,在微軟2000年12月6日出版的"Microsoft Extensible Firmware Initiative FAT 32 File System Specification, FAT: General Overview of On-Disk Format",微軟公司明確地給出了一些授權,許多讀者將它認爲是微軟允許操作系統廠商實現FAT。
  控訴
  由於人們廣泛要求重新審查這些專利,公衆專利基金會向美國專利和商標局(USPTO)提出了一 些證據爭辯這些專利的有效性,其中包括施樂公司和IBM的早期參考資料。美國專利商標局承認這些證據提出了“可專利性的實質性的新問題”並且對於微軟公司 FAT專利的有效性展開調查。
  2004年9月30日,美國專利商標局主要基於公共專利基金會所提供的證據駁回了美國專利 5,579,517的專利主張。這個基金會的執行總裁Dan Ravicher說“現在專利局只不過是確認了我們已經知道了一段時間的事情,微軟公司的專利是假的。”
  PUBPAT的新聞發佈會說,“微軟公司仍然有機會迴應專利局的駁回。有代表性的是第三方的重新審查要求如PUBPAT提供的資料成功地減小了專利的範圍或者有70%的機會完全駁回專利。”
  2005年10月5日,專利局宣佈隨着調查的深入它駁回了專利5.579,517的專利主張,另外它發現專利美國專利 5,758,352有錯誤的專利受益人而無效。
  最後在2006年1月10日,專利局裁定微軟公司的FAT系統的實現特點是“新穎和非顯然的”,推翻了早期的兩個非最終裁決。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章