FAT文件系統(tǒng)原理詳細(xì)介紹.docx_第1頁
FAT文件系統(tǒng)原理詳細(xì)介紹.docx_第2頁
FAT文件系統(tǒng)原理詳細(xì)介紹.docx_第3頁
FAT文件系統(tǒng)原理詳細(xì)介紹.docx_第4頁
FAT文件系統(tǒng)原理詳細(xì)介紹.docx_第5頁
已閱讀5頁,還剩2頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

FAT文件系統(tǒng)原理詳細(xì)介紹2012-03-29 23:09434人閱讀評論(0)收藏舉報(bào)磁盤數(shù)據(jù)結(jié)構(gòu)byteextension存儲dateFAT文件起源于70年代末80年代初,用于微軟的MS-DOS操作系統(tǒng)。它開始被設(shè)計(jì)成一個簡單的文件系統(tǒng)用于小于500K的軟件盤。后來被功能被大大增強(qiáng)用于支持越來越大的媒質(zhì)。現(xiàn)在的文件系統(tǒng)有FAT12,F(xiàn)AT16和FAT32三種子類。FAT12是最早的一版,主要用于軟盤,它對簇的編址采用12bit寬度的數(shù),所以稱為FAT12。12bit的地址可以尋址4096個簇,事實(shí)上在FAT12中只能尋址4078個簇(在Linux下可尋址4084個簇),有一些簇號是不能用的,在后面會給出具體的說明。磁盤的扇區(qū)是用16bit的數(shù)進(jìn)行計(jì)算的,所以磁盤的容量就被局限在32M空間之內(nèi)。在FAT16中,采用了16bit寬的簇地址,32bit寬扇區(qū)地址。雖然32bit的扇區(qū)地址可以尋址232*512,約2個TB的容量,但于由規(guī)定每簇最大的容量不超過1024*32,所以FAT16文件系統(tǒng)的容量也就限制到了216*1024*32,大約2.1GB的空量,并且實(shí)際還達(dá)不到這個值。FAT32文件系統(tǒng)使用了32bit寬的簇地址,所以稱為FAT32。但在微軟件的文件系統(tǒng)中只使用了低28位,最大容量為228*1024*32,約8.7TB的空量。有的人認(rèn)為32bit全用,最大容量為232*1024*32,這種說法是不正確的。雖然FAT32具有容納近乎8.7TB的容量,但實(shí)際應(yīng)用中通常不使用超過32GB的FAT32分區(qū)。WIN2000及之上的OS已經(jīng)不直接支持對超過32GB的分區(qū)格式化成FAT32,但WIN98依然可以格式化大到127GB的FAT32分區(qū),但不推薦這樣做。下面是一個FAT分區(qū)的構(gòu)成概況引導(dǎo)扇區(qū)其他保留扇區(qū)(可選)FAT表1FAT表2根目錄區(qū)(僅FAT12/16)數(shù)據(jù)區(qū)(用于文件和目錄)需要說明的是:1引導(dǎo)扇區(qū)和其他保留扇區(qū)一起稱為保留扇區(qū),而其他保留扇區(qū)是可選的,當(dāng)沒有時候,引導(dǎo)扇區(qū)后緊跟的就是FAT表12根目錄區(qū)是僅FAT12/16才有,F(xiàn)AT32的目錄項(xiàng)位于數(shù)據(jù)區(qū)。由于FAT12/16的根目錄區(qū)是一個固定的區(qū)域,所以它的根目錄的項(xiàng)數(shù)是有限制的,意即不能在根錄建立超過這個定數(shù)的目錄項(xiàng)數(shù)。(一)引導(dǎo)扇區(qū)與BPBBPB(BIOS Parametre Block)是FAT文件系統(tǒng)中第一個重要的數(shù)據(jù)結(jié)構(gòu),它位于該FAT分區(qū)的第一個扇區(qū),同時也屬于FAT文件系統(tǒng)基本區(qū)域的保留區(qū),在下面的描述中。凡名稱以BPB_開頭的都是BPB的一部分,凡名稱與BS_開頭的項(xiàng)都是啟動扇區(qū)的一部分,而不是屬于BPB的內(nèi)容,以下是啟動扇區(qū)的結(jié)構(gòu)offset(byte)長度(byte)描述BS_jmpBoot0x003跳轉(zhuǎn)指令,指向啟動代碼BS_OEMName0x038建議值為“MSWIN4.1”。有些廠商的FAT驅(qū)動可能會檢測此項(xiàng),所以設(shè)為“MSWIN4.1”可以盡量避免兼容性的問題BPB_BytsPerSec0x0b2每扇區(qū)的字節(jié)數(shù),取值只能是以下幾種:512,1024,2048或是4096。設(shè)為512會取得最好的兼容性,目前有很多FAT代碼都是硬性規(guī)定每扇區(qū)的字節(jié)數(shù)為512,而不是實(shí)際的檢測此值。但微軟的操作系統(tǒng)能夠很好支持1024,2048或是4096BPB_SecPerClus0x0d1每簇的扇區(qū)數(shù),其值必須中2的整數(shù)次方(該整數(shù)必須=0),同時還要保證每簇的字節(jié)數(shù)不能超過32K,也就是1024*32字節(jié)BPB_RsvdSecCnt0x0e2保留扇區(qū)的數(shù)目,此域不能為0,F(xiàn)AT12/FAT16必須為1,F(xiàn)AT32的典型值取為32,微軟的系統(tǒng)支持任何非0值BPB_BumFATs0x101分區(qū)中FAT表的份數(shù),任何FAT格式都建議為2BPB_RootEntCnt0x112對于FAT12和FAT16此域包含根目錄中目錄的個數(shù)(每項(xiàng)長度為32bytes),對于FAT32,此項(xiàng)必須為0。對于FAT12和FAT16,此數(shù)乘以32必為BPB_BytesPerSec的偶數(shù)倍,為了達(dá)到更好的兼容性,F(xiàn)AT12和FAT16都應(yīng)該取值為512BPB_ToSec160x132早期版本中16bit的總扇區(qū),這里總扇區(qū)數(shù)包括FAT卷上四個基本分區(qū)的全部扇區(qū),此域可以為0,若此域?yàn)?,那么BPB_ToSec32必須為0,對于FAT32,此域必為0。對于FAT12/FAT16,此域填寫總扇區(qū)數(shù),如果該值小于0x10000的話,BPB_ToSec32必須為0BPB_Media0x151對于“固定”(不可移動)存儲介質(zhì)而言,0xF8是標(biāo)準(zhǔn)值,對于可移動存儲介質(zhì),經(jīng)常使用的數(shù)值是0xF0,此域合法的取值可以取0xF0,0xF8,0xF9,0xFA,0xFC,0xFD,0xFE,0xFF。另外要提醒的是,無淪此域?qū)懭胧裁磾?shù)值,同時也必須在FAT0的低字節(jié)寫入相同的值,這是因?yàn)樵缙诘腗SDOS 1.x使用該字節(jié)來判定是何種存儲介質(zhì)BPB_FATz160x162FAT12/FAT16一個FAT表所占的扇區(qū)數(shù),對于FAT32來說此域必須為0,在BPB_FATZ32中有指定FAT表的大小BPB_SecPerTrk0x182每磁道的扇區(qū)數(shù),用于BIOS中斷0x13,此域只對于有“特殊形狀”(由磁頭和柱面每分割為若干磁道)的存儲介質(zhì)有效,同時必須可以調(diào)用BIOS的0x13中斷得到此數(shù)值BPB_NumHeads0x1A2磁頭數(shù),用于BIOS的0x13中斷,類似于上面的BPB_ SecPerTrk,只對特殊的介質(zhì)才有效,此域包含一個至少為1的數(shù)值,比如1,4M的軟盤此域?yàn)?BPB_HidSec0x1C4在此FAT分區(qū)之前所隱藏的扇區(qū)數(shù),必須使得調(diào)用BIOS的0x13中斷可以得到此數(shù)值,對于那些沒有分區(qū)的存儲介質(zhì),此域必須為0,具體使用什么值由操作系統(tǒng)決定BPB_ToSec320x204該卷總扇區(qū)數(shù)(32bit),這里的扇區(qū)總數(shù)包括FAT卷四個個基本分的全部扇區(qū),此域可以為0,若此域?yàn)?,BPB_ToSec16必須為非0,對FAT32,此域必須是非0。對于FAT12/FAT16如果總扇區(qū)數(shù)大于或等于0x10000的話,此域就是扇區(qū)總數(shù),同時BPB_ToSec16的值為0。FAT32的BPB的內(nèi)容和FAT12/16的內(nèi)容在地址36以前是完全一樣的,從偏移量36開始,他們的內(nèi)容有所區(qū)別,具體的內(nèi)容要看FAT類型為FAT12/16還是FAT32,這點(diǎn)保證了在啟動扇區(qū)中包含一個完整的FAT12/16或FAT32的BPB的內(nèi)容,這么做是為了達(dá)到最好的兼容性,同時也為了保證所有的FAT文件系統(tǒng)驅(qū)動程序能正確的識別和驅(qū)動不同的FAT格式,并讓他們良好地工作,因?yàn)樗麄儼爽F(xiàn)有的全部內(nèi)容從offset 36開始FAT12/FAT16的內(nèi)容開始區(qū)別于FAT32,下面分兩個表格列出,下表為FAT12/FAT16的內(nèi)容名稱offset(byte)長度(byte)描述BS_drvNum0x241用于BIOS中斷0x13得到磁盤驅(qū)動器參數(shù),(0x00為軟盤,0x80為硬盤)。此域?qū)嶋H上由操作系統(tǒng)決定BS_Reseved10x251保留(供NT使用),格式化FAT卷時必須設(shè)為0BS_VolID0x261擴(kuò)展引導(dǎo)標(biāo)記(0x29)用于指明此后的3個域可用BS_BootSig0x274卷標(biāo)序列號,此域以BS_VolLab一起可以用來檢測磁盤是否正確,F(xiàn)AT文件系統(tǒng)可以用此判斷連接的可移動磁盤是否正確,引域往往是由時間和日期組成的一個32位的值BS_VolLab0x2B11磁盤卷標(biāo),此域必須與根目錄中11字節(jié)長的卷標(biāo)一致。FAT文件系統(tǒng)必須保證在根目錄的卷標(biāo)文件列改或是創(chuàng)建的同時,此域的內(nèi)容能得到時的更新,當(dāng)FAT卷沒有卷標(biāo)時,此域的內(nèi)容為“NO NAME”BS_FilSysType0x368以下的幾種之一:“FAT12”,“FAT16”,“FAT32”不少人錯誤的認(rèn)為FAT文件系統(tǒng)的類型由此域來確認(rèn),他細(xì)點(diǎn)你就能發(fā)現(xiàn)此域并不是BPB的一部分,只是一個字符串而已,微軟的操作系統(tǒng)并不使用此此域來確定FAT文件的類型,;因?yàn)樗31粚戝e或是根本就不存在。下表為FAT32的內(nèi)容名稱offset(byte)長度(byte)描述BPB_FATSz320x244一個FAT表所占的扇區(qū)數(shù),此域?yàn)镕AT32特有,同時BPB_FATSz16必須為0BPB_Flags0x282此域FAT32特有。Bits0-3:不小于0的FAT(active FAT)數(shù)目,只有在鏡像(mirrorig)禁止時才有效。Bits 4-6:保留Bits 7:0表示FAT實(shí)時鏡像到所有的FAT表中 1表示只有一個活動的FAT表。這個表就是Bits0-3所指定的那個Bits8-15:保留BPB_FSVer0x2A2此域?yàn)镕AT32特有,高位為FAT32的主版本號,低位為次版本號,這個版本號是為了以后更高級的FAT版本考慮,假設(shè)當(dāng)前的操作系統(tǒng)只能支持的FAT32版本號為0.0。那么該操作系統(tǒng)檢測到此域不為0時,它便會忽略FAT卷,因?yàn)樗陌姹咎柋认到y(tǒng)能支持的版式本要高BPB_RootClus0x2C4根目錄所在第一個簇的簇號,通常該數(shù)值為2,但不是必須為2磁盤工具在改變根目錄位置時,必須想辦法讓磁盤上第一個非壞簇作為根目錄的第一個簇(比如第2簇,除非它已經(jīng)被標(biāo)記為壞簇),這樣的話,如果此域正好為0的話磁盤檢測工具也能輕松的找到根目錄所在簇的位置BPB_FSIfo0x302保留區(qū)中FAT32卷FSINFO結(jié)構(gòu)所占的扇區(qū)數(shù),通常為1在Backup Boot中會有一個FSINFO的備份,但該備份只是更新其中的指針,也就是說無論是主引導(dǎo)記錄還是備份引導(dǎo)記錄都是指向同一個FSINFO結(jié)構(gòu)BPB_BkBootSec0x322如果不為0,表示在保留區(qū)中引導(dǎo)記錄的備數(shù)據(jù)所占的扇區(qū)數(shù),通常為6。同時不建議使用6以外的其他數(shù)值BPB_Reserved0x3412用于以后FAT擴(kuò)展使用,對FAT32。此域用0填充BS_DrvNum0x401與FAT12/16的定義相同,只不過兩者位于啟動扇區(qū)不同的位置而已BS_Reserved10x411與FAT12/16的定義相同,只不過兩者位于啟動扇區(qū)不同的位置而已BS_BootSig0x421與FAT12/16的定義相同,只不過兩者位于啟動扇區(qū)不同的位置而已BS_VolID0x434與FAT12/16的定義相同,只不過兩者位于啟動扇區(qū)不同的位置而已BS_FilSysType0x4711與FAT12/16的定義相同,只不過兩者位于啟動扇區(qū)不同的位置而已BS_FilSysType0x528通常設(shè)置為“FAT32”,請參照FAT12/16此部分的陳述。關(guān)于FAT啟動扇區(qū)還有一點(diǎn)重要的說明,我們假設(shè)里面的內(nèi)容是按字節(jié)排序的,那么扇區(qū)510的內(nèi)容一定0x55,扇區(qū)511的內(nèi)容一定是0xAA很多FAT資數(shù)文檔會把0xAA55說成是“啟動扇區(qū)最后兩字節(jié)的內(nèi)容”,這樣的陳述是正確的僅僅是如果BPB_BytsPerSec的值為512的話。若BPB_BytsSec的值大于512,該標(biāo)記的位置并沒有改變(雖然在啟動扇區(qū)的最后兩個字節(jié)寫0xAA55并沒有問題)關(guān)于BPB_ToSec16/32這里再作一點(diǎn)補(bǔ)充:假設(shè)一現(xiàn)在我們有一塊磁盤或一個分區(qū),它的扇區(qū)數(shù)為DskSz,如果BPB_aToSec(BPB_ToSec16或是BPB_ToSec32基中不為0的那個)的值小于或等于DskSz并不會使該FAT卷在使用中出現(xiàn)什么錯誤,實(shí)際上BPB_ToSec16/32的值不要比DskSz小得離譜就不會有什么錯誤這樣做將造成磁盤空間的浪費(fèi),程序本身并不會認(rèn)為該FAT卷存在什么錯誤,但是,如果BPB_ToSec16/32的值比DskSz大將會使FAT卷遭到嚴(yán)重的損壞,因?yàn)樗隽舜鎯橘|(zhì)或是磁盤分區(qū)的邊界。當(dāng)BPB_ToSec16/32的值比DskSz大時,一些數(shù)據(jù)將不幸地被丟失FAT文件系統(tǒng)數(shù)據(jù)結(jié)構(gòu)C語言表示FAT文件系統(tǒng)相關(guān)數(shù)據(jù)結(jié)構(gòu)struct fat_boot_sector uint8_t ignored3; /* 0x00 Boot strap short or near jump */ int8_t system_id8; /* 0x03 Name - can be used to special case partition manager volumes */ uint8_t sector_size2; /* 0x0B bytes per logical sector */ uint8_t sectors_per_cluster; /* 0x0D sectors/cluster */ uint16_t reserved; /* 0x0E reserved sectors */ uint8_t fats; /* 0x10 number of FATs */ uint8_t dir_entries2; /* 0x11 root directory entries */ uint8_t sectors2; /* 0x13 number of sectors */ uint8_t media; /* 0x15 media code (unused) */ uint16_t fat_length; /* 0x16 sectors/FAT */ uint16_t secs_track; /* 0x18 sectors per track */ uint16_t heads; /* 0x1A number of heads */ uint32_t hidden; /* 0x1C hidden sectors (unused) */ uint32_t total_sect; /* 0x20 number of sectors (if sectors = 0) */ /* The following fields are only used by FAT32 */ uint32_t fat32_length; /* 0x24=36 sectors/FAT */ uint16_t flags; /* 0x28 bit 8: fat mirroring, low 4: active fat */ uint8_t version2; /* 0x2A major, minor filesystem version */ uint32_t root_cluster; /* 0x2C first cluster in root directory */ uint16_t info_sector; /* 0x30 filesystem info sector */ uint16_t backup_boot; /* 0x32 backup boot sector */ uint8_t BPB_Reserved12; /* 0x34 Unused */ uint8_t BS_DrvNum; /* 0x40 */ uint8_t BS_Reserved1; /* 0x41 */ uint8_t BS_BootSig; /* 0x42 */ uint8_t BS_VolID4; /* 0x43 */ uint8_t BS_VolLab11; /* 0x47 */ uint8_t BS_FilSysType8; /* 0x52=82*/ /* */ uint8_t nothing420; /* 0x5A */ uint16_t marker; _attribute_ (_packed_);struct msdos_dir_entry int8_t name8,ext3; /* 00 name and extension */ uint8_t attr; /* 0B attribute bits */ uint8_t lcase; /* 0C Case for base and extension */ uint8_t ctime_ms; /* 0D Creation time, milliseconds */ uint16_t ctime; /* 0E Creation time */ uint16_

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論