linux VFS中dentry結構解析

2021-06-25 22:59:07 字數 2206 閱讀 8560

linux vfs中dentry結構解析

先看<>此書中對dentry,file,process,inode這幾個資料結構關係的解析。

程序每開啟乙個檔案,就會有乙個file結構與之對應。同乙個程序可以多次開啟同乙個檔案而得到多個不同的file結構,file結構描述了被開啟檔案的屬性,讀寫的偏移指標等等當前資訊。

兩個不同的file結構可以對應同乙個dentry結構。程序多次開啟同乙個檔案時,對應的只有乙個dentry結構。dentry結構儲存目錄項和對應檔案(inode)的資訊。

在儲存介質中,每個檔案對應唯一的inode結點,但是,每個檔案又可以有多個檔名。即可以通過不同的檔名訪問同乙個檔案。這裡多個檔名對應乙個檔案的關係在資料結構中表示就是dentry和inode的關係。

inode中不儲存檔案的名字,它只儲存節點號;而dentry則儲存有名字和與其對應的節點號,所以就可以通過不同的dentry訪問同乙個inode。

不同的dentry則是同個檔案鏈結(ln命令)來實現的。

dentry

一、dentry的定義

dentry的中文名稱是目錄項,是linux檔案系統中某個索引節點(inode)的鏈結。這個索引節點可以是檔案,也可以是目錄。

二、dentry的結構:以下是dentry的結構體

struct dentry ;

三、dentry與inode

inode(可理解為ext2 inode)對應於物理磁碟上的具體物件,dentry是乙個記憶體實體,其中的d_inode成員指向對應的inode。也就是說,乙個inode可以在執行的時候鏈結多個dentry,而d_count記錄了這個鏈結的數量。

按照d_count的值,dentry分為以下三種狀態:

1、未使用(unused)狀態:該dentry物件的引用計數d_count的值為0,但其d_inode指標仍然指向相關的的索引節點。該目錄項仍然包含有效的資訊,只是當前沒有人引用他。這種dentry物件在**記憶體時可能會被釋放。

3、負(negative)狀態:與目錄項相關的inode物件不復存在(相應的磁碟索引節點 可能已經被刪除),dentry物件的d_inode指標為null。但這種dentry物件仍然儲存在dcache中,以便後續對同一檔名的查詢能夠 快速完成。這種dentry物件在**記憶體時將首先被釋放。

四、dentry與dentry_cache

dentry_cache簡稱dcache,中文名稱是目錄項快取記憶體,是linux為了提高目錄項物件的處理效率而設計的。它主要由兩個資料結構組成:

1、雜湊鍊錶dentry_hashtable:dcache中的所有dentry物件都通過d_hash指標域鏈到相應的dentry雜湊鍊錶中。

2、未使用的dentry物件鍊錶dentry_unused:dcache中所有處於unused狀態和negative狀態的dentry物件都通過其d_lru指標域鏈入dentry_unused鍊錶中。該鍊錶也稱為lru鍊錶。

目錄項快取記憶體dcache是索引節點快取icache的主控器(master),也即 dcache中的dentry物件控制著icache中的inode物件的生命期轉換。無論何時,只要乙個目錄項物件存在於dcache中(非 negative狀態),則相應的inode就將總是存在,因為 inode的引用計數i_count總是大於0。當dcache中的乙個dentry被釋放時,針對相應inode物件的iput()方法就會被呼叫。

五、dentry_operations *d_op

struct dentry_operations ;

d_revalidate:用於vfs使乙個dentry重新生效。

d_hash:用於vfs向雜湊表中加入乙個dentry。

d_compare:dentry的最後乙個inode被釋放時(d_count等於零),此方法被呼叫,因為這意味這沒有inode再使用此dentry;當然,此dentry仍然有效,並且仍然在dcache中。

d_release: 用於清除乙個dentry。

d_iput:用於乙個dentry釋放它的inode(d_count不等於零)

六、d_parent和d_child

每個dentry都有乙個指向其父目錄的指標(d_parent),乙個子dentry的雜湊列表(d_child)。其中,子dentry基本上就是目錄中的檔案。

七、怎樣從inode值得到目錄名?

函式得到當前檔案或目錄的inode值後,進入dcache查詢對應的dentry,然後順著父目錄指標d_parent得到父目錄的dentry,這樣逐級向上直到

Linux VFS中write系統呼叫實現原理

目錄 使用者空間的 write 函式在核心裡面的服務例程為 sys write.1 vfs write 函式實現原理 2 word裡面的目錄複製過來似乎不能直接用。還是放在這裡當主線看吧.使用者空間的 write 函式在核心裡面的服務例程為 sys write root syslab grep wr...

linux vfs系統基礎

struct fs struct define nr open default bits per long define bits per long 32 asm i386 struct files struct 檔案描述符表 struct fdtable 檔案物件 順序打亂,突出重點 struct...

linux VFS資料結構 一

vfs的資料結構 超級塊物件 記錄已安裝檔案系統的整體資訊,由於具體的檔案系統來實現,它對應於具體檔案系統的超級塊或控制塊,儲存在磁碟的特定扇區上,如果不是基於磁碟的檔案系統,比如sysfs,會生成臨時的超級塊,儲存在記憶體當中。01struct super block 第2行指向超級塊鍊錶的指標 ...