《linux核心設計與實現》
2.主要的物件型別
file_system_type:用於描述具體的檔案系統的型別資訊,所以被
linux
支援的檔案系統,都有且僅有乙個
file_system_type
結構而不管它有零個或多個例項被安裝到系統中。如
ext2,ext3,nfs。
安裝點(
vfsmount):當乙個檔案系統被實際安裝,就有乙個
vfsmount
結構體被建立,這個結構體對應乙個安裝點。與超級塊一樣(即與超級塊是一一對應的),但沒有存放在磁碟中。它包括安裝點的相關資訊,如位置和安裝標誌等。
超級塊物件(
super_block):儲存乙個已安裝的檔案系統的控制資訊(檔案系統的狀態、檔案系統型別、塊大小、區塊數、索引節點數、髒標誌、操作方法),它代表乙個已安裝的檔案系統;每次乙個實際的檔案系統被安裝時,核心會從磁碟的特定位置(磁碟的超級塊位置)讀取一些控制資訊來填充記憶體中的超級塊物件。乙個安裝例項和乙個超級塊物件一一對應。超級塊通過其結中的乙個域
s_type
記錄它所屬的檔案系統型別。即使安裝了兩個相同的檔案系統(
file_system_type
一樣)也會有兩個超級塊(磁碟與記憶體都有兩個)。[磁碟
] 超級塊主要方法:該方法集主要包括對
inode
的操作以及
super_block
的操作
alloc_inode
:初始化乙個索引節點物件
read_inode
:從磁碟上讀取索引節點,並填充記憶體中的索引節點物件
write_inode
:將給定的索引節點寫入磁碟,這才代表真正的建立了乙個檔案
write_super
:將超級塊物件更新到磁碟中
索引節點物件(
inode):儲存了檔案和目錄的相關資訊(和檔案本身是兩個不同的概念。它包含的是諸如檔案的大小、擁有者、建立時間、磁碟位置、檔案操作方法、髒標示等和檔案相關的資訊),代表乙個實質的檔案,在磁碟儲存有該物件。當乙個檔案首次被訪問時,核心會在記憶體中組裝相應的索引節點物件,以便向核心提供對乙個檔案進行操作時所必需的全部資訊。[磁碟
] 索引節點主要方法:包括對
inode
的建立查詢,目錄的建立刪除,符號連線等。
int create(struct inode *dir, struct dentry *dentry, int mode)
:由create
或open
系統呼叫來呼叫,從而為
dentry
物件建立乙個新的索引節點。
struct dentry * lookup(struct inode *dir, struct dentry *dentry)
:通過指定的目錄項找到索引節點。
mkdir(dir, dentry, mode)
:由系統呼叫
mkdir
呼叫,建立乙個新目錄
目錄項物件(
dentry):它代表乙個目錄項(包括該目錄物件對應的索引節點,子目錄鍊錶,父目錄目錄項物件,與它同級的目錄的目錄項物件鍊錶,使用計數,快取標誌),是路徑的乙個組成部分(注:路徑中的每個組成部分都由乙個索引節點物件表示)。該物件只存放在記憶體中。引入目錄項的概念主要是出於方便查詢檔案的目的。乙個路徑的各個組成部分,不管是目錄還是普通的檔案,都是乙個目錄項物件。如,在路徑
/home/source/test.c
中,目錄
/, home, source
和檔案test.c
都對應乙個目錄項物件。不同於前面的三個物件,目錄項物件沒有對應的磁碟資料結構,
vfs在遍歷路徑名的過程中現場將它們逐個地解析成目錄項物件,並使用快取機制,以提高查詢的速度(目錄項物件與索引節點物件一一對應,即它也代表著乙個檔案,這裡的檔案可以是普通檔案也可以是目錄檔案等)。[記憶體
] 目錄項物件有三種狀態:被使用、未被使用和負狀態
被使用:乙個被使用的目錄項對應乙個有效的索引節點(
d_inode
指向相應的索引節點)並且表明該物件存在乙個或多個使用者(
d_count
為正)。乙個目錄項處於被使用狀態,意味著它正被
vfs使用並且指向有效的索引節點,因此不能被釋放。
未被使用:乙個未被使用的目錄項對應於乙個有效的索引節點(
d_inode
指向相應的索引節點),但是應指明
vfs當前並未使用它(
d_count為0
)。該目錄項物件仍指向乙個有效物件,而且被保留在快取中以便需要時再使用它。由於該目錄項不會過早地被銷毀,所以在以後再需要用到它時,不必重新建立,從而使得路徑查詢更迅速。但如果要**記憶體的話,可以銷毀未使用的目錄項。
負狀態:沒有對應的有效索引節點。因為索引節點已被刪除了或路徑不正確,但是目錄項仍然保留,以便快速解析以後的路徑查詢。
以上三種型別的目錄項都會被快取到目錄項快取中,並且雜湊表也會被快取。另外如果目錄項被快取了,並且是被使用狀態,那麼相應的索引節點也會被快取。
檔案物件(
file):是已開啟的檔案在記憶體中的表示(包括相應的目錄項物件、使用計數、訪問模式、當前偏移量、操作方法等),主要用於建立程序和磁碟上的檔案的對應關係。它由
sys_open()
現場建立,由
sys_close()
銷毀。檔案物件和物理檔案的關係有點像程序和程式的關係一樣。當我們站在使用者空間來看待
vfs,我們像是只需與檔案物件打交道,而無須關心超級塊,索引節點或目錄項。因為多個程序可以同時開啟和操作同乙個檔案,所以同乙個檔案也可能存在多個對應的檔案物件。檔案物件僅僅在程序觀點上代表已經開啟的檔案,它反過來指向目錄項物件(反過來指向索引節點)。乙個檔案對應的檔案物件可能不是惟一的,但是其對應的索引節點和目錄項物件無疑是惟一的。[記憶體
] 檔案操作方法:
llseek
:更新偏移量
read
、write
、open
、mmap
、aio_read
、fsync
files_struct:程序開啟的檔案物件集合。雖然使用
open
獲得的是檔案描述符(
int),但是它與
file
物件是一一對應的(檔案描述符是
file_struct
裡的struct file ** fd
陣列的下標)。該結構在
task_struct中。
所以乙個程序在對乙個檔案進行操作時各種物件的引用過程如下:
通過task_struct
得到files_struct
,然後通過檔案描述符(
int fd
)獲得相應的檔案物件(
file **fd
),接下來獲得目錄項物件(
dentry
),最後得到索引節點物件(
inode
),該物件就包括具體操作該檔案的相關操作,這些操作是從超級物件塊中繼承而來的。它與具體的檔案系統相關。
Linux檔案系統學習(三)之結構關係
參考文獻 linux核心設計與實現 3.結構關係 該圖反應的 linux 的檔案系統的體系結構 ext2 jfs 等等 都會匯出一組通用介面,供 vfs 使用。緩衝區快取 buffer cache 會快取檔案系統和相關塊裝置之間的請求。例如,對底層裝置驅動程式的讀寫請求會通過緩衝區快取來傳遞。這就允...
Linux檔案系統學習(一)之相關概念
一切皆是檔案 是 unix linux 的基本哲學之一。不僅普通的檔案,目錄 字元裝置 塊裝置 套接字等在 unix linux 中都是以檔案被對待 它們雖然型別不同,但是對其提供的卻是同一套操作介面。另外所謂的塊裝置 是指支援隨機訪問的儲存裝置 與此相對應的是字元裝置,它只支援順序訪問。另外lin...
Fatfs檔案系統學習
移植過程網上有很多,直接參考就可以了。1 學習過程對api重新理解 f mout f mout fs,0 0 掛載 f mout 0,0 0 解除安裝 一直對解除安裝有錯誤的認識,一直以為解除安裝的時候第乙個形參還是 fs。2 英文長檔名的實現 英文長檔名的實現參考了這個朋友的帖子。define c...