Linux檔案系統學習(二)之重要資料結構

2021-05-25 10:56:26 字數 3880 閱讀 8250

《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...