dentry 與inode的概念

來源:互聯網
上載者:User

需要注意的幾點如下所示:
1)進程每開啟一個檔案,就會有一個file結構與之對應。同一個進程可以多次開啟同一個檔案而得到多個不同的file結構,file結構描述被開啟檔案的屬性,如檔案的當前位移量等資訊。
2)兩個不同的file結構可以對應同一個dentry結構。進程多次開啟同一個檔案時,對應的只有一個dentry結構。Dentry結構儲存目錄項和對應檔案(inode)的資訊。
3)在儲存介質中,每個檔案對應唯一的inode結點,但是每個檔案又可以有多個檔案名稱。即可以通過不同的檔案名稱訪問同一個檔案。這裡多個檔案名稱對應一個檔案的關係在資料結構中表示就是dentry和inode的關係。
4)Inode中不隱藏檔的名字,它只儲存節點號;而dentry則儲存有名字和與其對應的節點號,所以就可以通過不同的dentry訪問同一個inode。
5)不同的dentry則是同個檔案連結(ln命令)來實現的。
dentry
一、dentry的定義
dentry的中文名稱是目錄項,是Linux檔案系統中某個索引節點(inode)的連結。這個索引節點可以是檔案,也可以是目錄。
二、dentry的結構:以下是dentry的結構體
struct dentry {
atomic_t d_count; 目錄項對象使用計數器
unsigned int d_flags; 目錄項標誌
struct inode * d_inode; 與檔案名稱關聯的索引節點
struct dentry * d_parent; 父目錄的目錄項對象
struct list_head d_hash; 散列表表項的指標
struct list_head d_lru; 未使用鏈表的指標
struct list_head d_child; 父目錄中目錄項對象的鏈表的指標
struct list_head d_subdirs;對目錄而言,表示子目錄目錄項對象的鏈表
struct list_head d_alias; 相關索引節點(別名)的鏈表
int d_mounted; 對於安裝點而言,表示被安裝檔案系統根項
struct qstr d_name; 檔案名稱
unsigned long d_time; /* used by d_revalidate */
struct dentry_operations *d_op; 目錄項方法
struct super_block * d_sb; 檔案的超級塊對象
vunsigned long d_vfs_flags;
void * d_fsdata;與檔案系統相關的資料
unsigned char d_iname [DNAME_INLINE_LEN]; 存放短檔案名稱
};
三、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對象在回收記憶體時可能會被釋放。
  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
struct dentry_operations {
int (*d_revalidate)(struct dentry *);
int (*d_hash) (struct dentry *, struct qstr *);
int (*d_compare) (struct dentry *, struct qstr *, struct qstr *);
void (*d_delete)(struct dentry *);
void (*d_release)(struct dentry *);
void (*d_iput)(struct dentry *, struct inode *);
};
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,就得到全部目錄名稱。
通過inode找到對應的dentry結構:
dentry = d_find_alias(inode);該函數在#include 標頭檔中,dentry是struct dentry *類型的,inode是struct inode *類型的,他們都是指標。
根據dentry轉化為全部目錄名稱,代碼如下:
/* get the deepth of dir */
static int get_level(struct dentry *dentry)
{
int level = 0;
TRACE_ENTRY;
while(dentry->d_parent != dentry)
{
level ++;
dentry = dentry->d_parent;
}
TRACE_EXIT;
return level;
}
/* get path via dentry structure */
static void get_path_via_dentry(struct dentry *dentry, char *pathname)
{
int i, j, k = 0;
int level = 0;
struct dentry *dentry_tmp;
TRACE_ENTRY;
level = get_level(dentry);
for(; level != 0; level--)
{
pathname[k++] = '/';
dentry_tmp = dentry;
for ( i = 0; i < level-1; i++)
{
dentry_tmp = dentry_tmp->d_parent;
}

for(j = 0; dentry_tmp->d_iname[j] != '/0'; j++, k++)
{
pathname[k] = dentry_tmp->d_iname[j];
}
}
// pathname[k] = '/';
pathname[k] = '/0';
TRACE_EXIT;
return ;
}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.