幻灯片放映
大纲
1
优化的實現方案
2
支持 Fat12/Fat16/Fat32
支持長文件名
底層對文件名採用到 Unicode
提供兼容當前系統的 ASCII文件名接口
提供一套使用 Unicode 文件名接口
3
優化 Buffer﹐減少 IO 次數
優化文件訪問方式﹐提高隨機訪問速度
面嚮對象結構
增強可擴充性
增強模塊內聚
減小模塊間耦合
增加模塊可復用性
4
最近最少使用算法
虛擬文件系統 VFS
Fat 文件系統
文件名/路徑名解析
系統初始化
5
實現為一個模板類 LruMap
用于需要進行 Buffer/Cache的對象。
主要接口 :
get(key, referFlag)
release(object)
6
使用 Red-Black Tree通過鍵值查找對象。
使用Double-Linked List管理為最近最少使用的可換出的對象(LruList)。
如果對象被引用﹐則引用計數非零﹐此時對象不在 LruList中﹔當引用計數減至零時﹐對象進入 LruList 作為 Head﹐即最近使用的。
如果找到﹐僅增加引用計數﹐否則Load Object﹐必要時換出最近最少使用的對象。
7
內存分配
設備驅動程序(DeviceDriver)
緩沖區管理(BufferManager﹐使用Lru)
文件空間管理(ClusterManager﹐使用Lru)
文件節點管理(DirCtrlBlock﹐目錄管理)
全局文件註冊表(FileMap﹐使用Lru)
8
9
限制文件系統使用的總內存
文件系统初始化时从系统堆申请一块固定空间作為文件系統專用Heap
FsMem_Alloc(size, flag)
如 flag 標明申請的內存是重要的﹐則在內存用量超額時將最近最少使用的Buffer換出。
FsMem_Free(mem)
10
提供按塊讀寫的接口
塊尺寸為標準扇區尺寸(512B)
提供一個最優訪問塊數﹐VFS努力按此塊數为单位讀寫設備
提供低級格式化函數(format)
11
使用Lru算法統一管理系統所有的 Buffer﹔
文件系統不顯式讀取外存﹐只向 BufferManager請求某設備某地址的數據內容。
由BufferManager通過對Buffer的換入換出﹐將數據寫入外存。
解決Buffer重迭問題。
12
一塊對應到外存上的內存﹐最佳情況下為設備的最佳訪問大小﹔
typedef struct tagBufferItem
{
DeviceDriver *device;
PBYTE buffer;
UINT32 size;
UINT32 first;
UINT32 count;
} BufferItem;
13
是文件系統相關的﹔
大多數文件系統為了文件空間管理的方便﹐將外存分為固定大小的Cluster﹔
為了靈活性﹐允許文件分為多個不連續的塊﹔
一般情況下﹐文件佔用的空間都是完全連續的﹐或分作數目不多的一些不連續的塊(簇組Cluster Group) ﹔
實現中解析具體文件系統的文件空間信息﹐將這些信息轉化為統一格式的﹐按文件邏輯順序的多個 Cluster Group。
14
由LruMap來管理﹔
typedef struct tagClusterGroup
{
UINT32 logFirst;// first logic No. of the node
UINT32 first; // first cluster No. of the node
UINT32 count; // count of continuous clusters
UINT32 link; // link for find next cluster group
} ClusterGroup;
一般情況下 count 的數目很大(幾百甚至幾千) 。
如在 Fat 中就可以省去 FatCache.
15
如果 Cluster Group 的數目太多﹐就使用 Lru算法對它們進行管理﹔
此時相當于使用動態跳表﹔
最差情況下﹐查找某分離的 Cluster Group必須從第一個Cluster Group開始﹔
因此﹐第一個 Cluster Group 不能被換出。
16
17
FileTable-FileBaseInfo
18
以(映射關係-1)中的 File_2 為例﹔
弧線箭頭為引用﹐直線箭頭(紅色)為映射。
19
是文件系統相關的﹐主要有﹕
創建文件節點(Create)
刪除文件節點(Delete)
重命名文件(Rename)
讀取文件節點(Read)
改写文件结点(Write)
查找文件節點(Find)
20
在大多數文件系統中﹐目錄都被作為一種特殊的文件來對待。
目錄存儲文件節點﹐一個文件節點可以是一個目錄節點﹐此即多層目錄。
文件節點存儲文件的尺寸﹐起始地址﹐日期時間﹐文件屬性等。
21
獲取文件空間信息的開銷很大。
同一文件可能有多個文件句柄。
多個文件句柄對文件的訪問方式可能不同。
使用Lru算法管理註冊的文件﹐註冊的文件為FileBaseInfo﹐文件第一次載入時﹐即進行註冊。
一旦所有句柄關閉﹐並不立即取消註冊。
直到文件註冊表占滿﹐才換出最近最少使用的FileBaseInfo。
22
Master Boot Record (MBS)
Partition Boot Record (PBS)
Fat Entry Format
Fat Structure
Fat Directory Entry (File Node)
Long File Name Entry
Fat Directory Manager
23
Disk LayOut1(FatSize = 200Sec)
24
25
Fat12﹐每個 Fat Entry占12bit﹕
Fat16﹐每個 Fat Entry占16bit。
Fat32﹐每個 Fat Entry占32bit﹐但只用到低28Bit﹐高4位保留。
26
27
文件的空間在在大部份情況下是連續的;
因此Fat Table的值在大部份情況下是連續的﹐如圖 (ClusterNum = FatIndex – 2);
通過掃描 Fat﹐得出 ClusterGroup.
28
從文件首地址開始,如果Cluster是相鄰的,相應 ClusterNode.count 加一
否則從鏈接地址創建新的 ClusterNode 插入文件的 ClusterTable,直到文件結束.
絕大多數情況下, 整個文件的所有Cluster都是連續的, ClusterNode.count 可以達到幾千甚至幾萬.
29
30
FILE_ATTR_READ_ONLY
FILE_ATTR_HIDDEN
FILE_ATTR_SYSTEM
FILE_ATTR_VOLUME_ID
FILE_ATTR_DIRECTORY
FILE_ATTR_ARCHIVE
FILE_ATTR_LONG_NAME
31
該屬性標明DirEntry是一個子目錄﹔
子目錄與根目錄的區別﹕
子目錄至少包含兩個DirEntry “.”和 “..” ﹔
一個分區必有且只有一個根目錄但可以有零个或多個子目錄﹔
從文件角度看目錄跟文件的不同﹕
目錄總是占有磁盤空間﹔
目錄的FileSize域總為 0﹔
目錄的實際尺寸不可超過 2 M。
32
標明該DirEntry僅存儲長文件名﹐是個LongDirEntry﹔
兼容早期不支持長文件名的Fat系統實現﹔
長文件名存儲為Unicode﹔
一個文件的長文件名最多包含20個LongDirEntry﹔
一個文件最多可以包含259個Unicode字符﹐一個 0結束符。
33
LongDirEntry
兼容ShortDirEntry﹔
長文件名以UniCode存儲﹔
一個長文件名可能由多個LongEntry
拼接成。
34
合法的 LongDirEntry必有一個ShortEntry與之對應﹔
合法的LongDirEntry.bCheckSum必與從ShortName計算出來的相符﹔
從多個LongDirEntry中讀出的文件名要按Order域進行重新排列﹔
如Order有 FAT_LAST_LONG_ENTRY表明這是對應于ShortEntry最後一個LongDirEntry﹔
35
Fat Spec支持 512~4K Byte 的Sector尺寸﹐但得到廣泛支持的只有 512 Byte的Sector﹔用 ulong對sector尋址﹐最大尋址範圍是2T。
Fat支持的最大Cluster尺寸為32K﹐由此可以計算各Fat支持的最大尺寸。
Fat12支持的最小尺寸無限制﹐最大尺寸為 128 M﹐但通常不用于大于4M的盤(分區)。
Fat16支持的最小尺寸為2M﹐最大尺寸為 2G﹐但通常不用于大于512M的盤(分區) 。
Fat32支持的最小尺寸為32M﹐最大尺寸為 8T﹐但Windows限制為最大 32G。
36
路徑分三類﹕
相對路徑(如 “appdata\data.bin”) ﹔
絕對路徑(如“C:\system\appdata\data.bin”) ﹔
分區根路徑(如“\system\appdata\data.bin”) 。
查找文件﹕
使用Regular Expression匹配文件名(如 c:\??*.b?n, a:\[abc]*.b[cde]t) 。
37
從一個 DeviceDrive創建一個ClusterManager﹔
如果成功﹐以該ClusterManager創建一個根分區﹐裝載到系統根﹔
根分區的名字不固定﹐任何合法的ClusterManager可以裝載為任何名字﹐目前按兼容當前文件系統的名字裝載﹔
設置根分區的當前目錄為根目錄。
38
Fat文件系统对目录无排序索引
查找每个文件都需要顺次查找每级目录
不适宜在一个目录下建立太多文件
长文件名的读写需要编码转化和校验,速度比短文件名读写慢,表现在查找文件速度比较慢
39