FAT檔案系統學習記錄一

2021-06-09 00:34:08 字數 3465 閱讀 1285

從這個的簡單的介紹中可以了解到fat

檔案系統的布局,

fat表的組織,目錄的形式,長短檔案目錄項的關係等等。這些都是

fat檔案系統的一些基本思想。

圖一:fat32

的組織形式

為了了解fat

的格式,需要仔細而詳細的閱讀《

fat檔案系統原理》的

4.3  fat

表和資料的儲存原則。後面繼續將到了 

fat32 

短檔案目錄和

fat32

長檔案目錄的定義,關於長短檔案目錄項,可以在後面介紹原始碼的時候詳細的解釋。

從《fat

檔案系統原理》可以看出

fat表中差不多是採用了一種程式語言中的鍊錶技術來組織

fat表的。

圖二:用winhex

檢視fat32

格式的sd

卡的fat

表,該fat32

檔案系統的簇大小為

0x800,

沒有保留簇,所以

fat表從第

2簇開始。

從上圖可以看出,fat32

是以f8 ff ff ff 

表示乙個

fat表的開始。

fat表中的每乙個表項為

2個位元組,儲存的是檔案接下來的資料在哪乙個簇中。

fat表中以乙個

ff ff

來表示乙個檔案的結束。從上表中可以看出,其中乙個長檔案

a是從第

0x4簇開始的,到第

0x45

簇結束(圖二中紅線部分)。接下來的8個

0xff

表示儲存的是

4個小檔案。同樣其中乙個檔案

b是從第

0x48

簇開始,到第

0x89

簇結束。那麼有人就會要問,我怎麼知道乙個檔案到底是從哪個簇開始的,總不至於搜尋這個

fat表吧。

這個問題分兩步來回答,其中一部分涉及到了fat

檔案的目錄表項。在

linux

中用結構體

struct msdos_dir_entry

來描述。另外乙個涉及到了所謂的

fat表

cache

的結構體。

有人可能就有疑問了,像上面的檔案a

,它所占用的簇都是連續的,如果每次都是從第乙個簇開始查詢,這不是太麻煩了。可不可以將連續的簇合併?

下面就先從struct fat_cache

結構體開始吧。

struct fat_cache ;

struct fat_cache *hit = &nohit, *p;

int offset = -1;

spin_lock(&msdos_i(inode)->cache_lru_lock);

//函式遍歷與

inode

對應的msdos_inode_info

結構體的

cache_lru

佇列。這就是該

inode

的fat_cache

佇列list_for_each_entry(p, &msdos_i(inode)->cache_lru, cache_list)  else 

//剩下的工作只能從

fat表中乙個乙個的查詢了,確實是乙個乙個查詢,從後面的**

(*fclus)++;

也可以看出來。

fatent_init(&fatent);

//這樣可能會出現兩種情況

//1. *fclus  =  cluster即需要查詢的

cluster

已經被包含在

cache

中,那麼皆大歡喜,查詢結束

//2.*fclus < cluster, cache

中包含不完全,其中

* dclus

中返回的是離

cluster

最近的cluster

在磁碟上位置。然後根據該

dclus

從fat

表中查詢

while (*fclus < cluster)

//根據

dclus

中fat

表查詢出,下乙個

cluster

在磁碟上的位置。

nr = fat_ent_read(inode, &fatent, *dclus);

if (nr < 0)

goto out;

else if (nr == fat_ent_free) else if (nr == fat_ent_eof)

(*fclus)++;

*dclus = nr;

if (!cache_contiguous(&cid, *dclus))

cache_init(&cid, *fclus, *dclus);

}nr = 0;

//查詢結束,需要將相應的結果新增到

cache

中,便於下一次查詢

fat_cache_add(inode, &cid);

out:

fatent_brelse(&fatent);

//最終返回檔案

cluster

對應的磁碟

cluster號

return nr;

}說到fat_ent_read函式就不得不說struct fatent_operations結構體,因為這個函式用到了很多的函式指標,因為不同的fat型別(fat12,fat16,fat32)而不同。

struct fatent_operations ;

int fat_ent_read(struct inode *inode, struct fat_entry *fatent, int entry)

fatent_set_entry(fatent, entry);

//要獲得乙個檔案

cluster

對應的磁碟

cluster

要分為三步: 1.

算出檔案

cluster

在fat

表中對應的位置,

ent_blocknr完成

2.讀出

fat表中的內容,

ent_bread完成

3.獲得對應的磁碟

cluster

,ent_get完成

ops->ent_blocknr(sb, entry, &offset, &blocknr);

if (!fat_ent_update_ptr(sb, fatent, offset, blocknr))

return ops->ent_get(fatent);

}

fat檔案系統

在主引導區後面就是fat表。從上面可以得知乙個fat表是229個扇區。它裡邊的內容很簡單,裡邊的內容就是指出下乙個簇在 你的盤有多少個簇,那麼它的fat表就要有多少個項來描述它們。因為fat16是用2個位元組 16位 來描述乙個簇的,所以這時fat表的大小就應該是2位的簇數個位元組。fat表中,第4...

FAT檔案系統原理 一

一 硬碟的物理結構 硬碟儲存資料是根據電 磁轉換原理實現的。硬碟由乙個或幾個表面鍍有磁性物質的金屬或玻璃等物質碟片以及碟片兩面所安裝的磁頭和相應的控制電路組成 圖1 其中碟片和磁頭密封在無塵的金屬殼中。硬碟工作時,碟片以設計轉速高速旋轉,設定在碟片表面的磁頭則在電路控制下徑向移動到指定位置然後將資料...

FAT檔案系統原理 一

fat檔案系統原理 一 一 硬碟的物理結構 硬碟儲存資料是根據電 磁轉換原理實現的。硬碟由乙個或幾個表面鍍有磁性物質的金屬或玻璃等物質碟片以及碟片兩面所安裝的磁頭和相應的控制電路組成 圖1 其中碟片和磁頭密封在無塵的金屬殼中。硬碟工作時,碟片以設計轉速高速旋轉,設定在碟片表面的磁頭則在電路控制下徑向...