從這個的簡單的介紹中可以了解到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 其中碟片和磁頭密封在無塵的金屬殼中。硬碟工作時,碟片以設計轉速高速旋轉,設定在碟片表面的磁頭則在電路控制下徑向...