dentry

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

基本介紹

  • 中文名:目錄項
  • 外文名:dentry
  • 系統:Linux檔案系統
  • 含義索引節點(inode)的連結
  • 類型:檔案、目錄
  • 屬性:dentry是一個記憶體實體
struct dentry 的結構,區分,dentry與inode,dentry與dentry_cache,dentry_operations *d_op,d_parent和d_child,怎樣從inode值得到目錄名,

struct dentry 的結構

{atomic_td_count;目錄項對象使用計數器unsignedintd_flags;目錄項標誌structinode*d_inode;與檔案名稱關聯的索引節點structdentry*d_parent;父目錄的目錄項對象structlist_headd_hash;散列表表項的指針structlist_headd_lru;未使用鍊表的指針structlist_headd_child;父目錄中目錄項對象的鍊表的指針structlist_headd_subdirs;對目錄而言,表示子目錄目錄項對象的鍊表structlist_headd_alias;相關索引節點(別名)的鍊表intd_mounted;對於安裝點而言,表示被安裝檔案系統根項structqstrd_name;檔案名稱unsignedlongd_time;/*usedbyd_revalidate*/structdentry_operations*d_op;目錄項方法structsuper_block*d_sb;檔案的超級塊對象vunsignedlongd_vfs_flags;void*d_fsdata;與檔案系統相關的數據unsignedchard_iname[DNAME_INLINE_LEN];存放短檔案名稱};

區分

dentry與inode

(可參照理解為ext2 inode)
inode對應於物理磁碟上的具體對象,
dentry是一個記憶體實體,其中的d_inode成員指向對應的inode。
也就是說,一個inode可以在運行的時候連結多個dentry,而d_count記錄了這個連結的數量。
按照d_count的值,dentry分為以下四種狀態:
0、空閒狀態:處於該狀態的目錄項對象不包括有效信息,且沒有被VFS使用。
1、未使用(unused)狀態:該dentry對象的引用計數d_count的值為0,但其d_inode指針仍然指向相關的的索引節點。該目錄項仍然包含有效的信息,只是當前沒有人引用他。這種dentry對象在回收記憶體時可能會被釋放。
2、正在使用(inuse)狀態:處於該狀態下的dentry對象的引用計數d_count大於0,且其d_inode指向相關的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

structdentry_operations{int(*d_revalidate)(structdentry*);int(*d_hash)(structdentry*,structqstr*);int(*d_compare)(structdentry*,structqstr*,structqstr*);void(*d_delete)(structdentry*);void(*d_release)(structdentry*);void(*d_iput)(structdentry*,structinode*);};
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,這樣逐級向上直到dentry= root,就得到全部目錄名稱。

相關詞條

熱門詞條

聯絡我們