關於linux文件系統的理解(二)

在上一節中我們基本瞭解到了文件的一般屬性,本節主要介紹VFS的結構:VFS 的結構主要包括了文件和文件系統
文件的表示方式:inode 是內核選擇用於表示文件內容和相關元數據的方法,抽象對底層文件系統的訪問:
1:inode 的操作,創建鏈接、文件重命名,在目錄中生成新的文件,刪除文件
2:文件操作,主要作用文件的數據內容。文件的讀寫操作和創建內存映射。
對應inode 的操作可以提供有關文件系統特性和現在的信息。打開的文件總是會分配到一個特定的進程中,所以內核必須在數據結構中存儲文件和進程之間的關聯,訪問時使用文件描述符作爲索引。
文件系統和超級塊的信息:
超級塊結構:存儲文件系統相關的信息,對於磁盤文件系統來說,這個對象通常對應磁盤上的一個文件系統控制塊,包括了相關文件系統中所有修改過的inode。
inode 數據結構中包含了各個文件操作的屬性,比如:i_size 表示文件長度;i_block表示文件按塊計算長度,每個VFS inode都有一個唯一的標識保存在i_ino裏面,i_count 是個記錄進程訪問該結構的數目,i_nlink 則是表示硬件鏈接數。
inode 表示設備文件時需要i_rdev,它表示與那個設備進程通信
inode 表示塊設備,i_pipe包含了用於實現管道的inode 的信息
inode 的操作:內核提供大量的函數對inode進行操作,主要有兩個指針(i_op和i_fop)指向實現了上述抽象的函數。
i_op與特定的inode操作有關,i_fop提供了文件操作
inode 可以存儲在鏈表中,因此inode 的三種狀態:
inode 存在內存中,無關聯到任何文件,無action 狀態
inode 存在內存中 正在由一個文件或者多個進程使用,通常爲一個文件,文件內容和inode 信息和塊設備上的信息一致,文件已經掛載。
inode 結構存在內存中,有一個或者多個進程使用,其數據內容和存儲介質不一致,此時爲髒數據
特定於進程的信息:文件描述符用於一個進程內唯一標識地打開文件。內核能夠在用戶進程中的描述符和內核內部使用的結構之間建立一種關聯。進程的文件數據都保存在fs中,其能打開的文件數由NR_OPEN_DEFAULT定義
文件操作主要包含以下幾點:
file_operatuons 包含了指向所有可能文件操作的函數指針。該指針結構主要包含以下一些操作:
1:read和write 分別負責讀寫操作;其參數涉及有文件描述符,緩衝區和偏移量。另外一個參數是需要讀寫的數目量。
2:文件的內容映射到進程的虛擬地址空間中,通過mmap可以輕鬆訪問文件。
3:ioctl 用於與硬件設備通信,所以只能用於設備文件。
VFS 命名空間是所有已經裝載、構成某個容器目錄樹的文件系統的集合,同時nsproxy 該成員負責命名空間的處理。
目錄項緩存:linux 使用目錄項緩存(dentry)來快速訪問此前的查找操作的結果,dentry不僅使得易於處理文件系統,對提高系統性能也很關鍵,通過最小話與底層文件系統的通信,加速了VFS的處理。dentry對象在內存中的組織主要涉及兩個部分:
1:一個散列表包含了所有的dentry對象
2:一個LRU 鏈表,其中不再使用的對象將授予一個最後寬限期,
內核有幾個標準函數用於輔助dentry,簡化對dentry對象的操作,其實現主要是鏈表管理和數據結構的處理的練習。
上面描述的各種數據結構 是VFS 層的工作基礎,現在接着處理VFS 對象(文件系統操作),我們從標準庫用來與內核通信的系統調用說起。內核在編譯的時候可以設置是否支持某種文件系統,因此一個文件系統的所用需要提前註冊到內核。
1:註冊文件系統 register_filesystem 用來註冊文件系統
2:裝載和卸載 需要向鏈表添加對象,由mount系統調用發起,每個裝載的文件系統都對應於一個vfsmount結構的實例
3:超級塊的管理 加載新文件系統時 vfsmount 並不是唯一需要在內核中創建的結構,而是需要開始於超級塊的讀取。在超級塊的數據結構中有個s_root用於檢測文件系統是否已經掛載,如果爲NULL則該文件是個僞文件系統。
delete_inode 將inode從內存和底層介質刪除,會移除指向相關數據塊的指針,但文件數據不受影響。 當某個inode不再使用,vfs內部調用clear_inode 它釋放了包含數據的所有相關內存頁面
mount 系統調用的過程如下:
sys_mount->複製裝載選項->do_mount->path_lookup->根據標誌調用相應的裝載函數。
do_new_mount(do_kernel_mount和do_add_mount)
do_kernel_mount 的任務是使用get_fs_type找到匹配的file實例,該函數會掃描鏈表找到是否已註冊文件系統的鏈表返回正確的值,如果沒有找到就自動加載對應的模塊。
do_add_mount 處理一些必要的鎖操作。
僞文件系統:
文件系統未必都需要底層塊設備的支持,ramfs和tmpfs 是以內存做爲存儲的;procfs和sysfs 不需要後備儲存,僞文件系統是不能裝載的文件系統,因此不能直接再用戶層看到。主要包括有(負責表示塊設備的inode的bdev、處理管道的pipefs、處理套接字的socket)
MS_NOUSER 標識是mount 允許文件掛載的一個標識。
文件操作:
1:查找inode(nameidata) 通過name和flags,內核使用path_lookup函數查找路徑或者文件名。
2:打開文件
3:讀取和寫入
read 三個參數:文件描述符、保存數據的緩存區、讀取字符數目的長度
1:異步讀取,如果設置了O_DIRECT標誌則直接讀取,不使用頁緩存。
2:從映射中讀取文件 通過映射機制,將文件中需要讀取的部分映射到內存頁中。通過大循環持續向內存寫入,直到所有文件都傳輸到內存中。
下一節我們將重點介紹下EXT2和EXT3相關的內容,敬請關注!!














































發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章