dentry與inode有什麼聯絡和區別

2021-07-29 15:33:59 字數 3509 閱讀 6094

我們在程序中要怎樣去描述乙個檔案呢?我們用目錄項(dentry)和索引節點(inode)。它們的定義如下:

struct dentry ;

struct inode ;

下邊逐個解釋下。

atomic_t d_count;

d_count是dentry的引用計數,多乙個引用會在數值上加一,當少乙個會減一,為零時會釋放。

unsigned int d_flags;

dentry狀態位。

spinlock_t d_lock;

每乙個目錄結構體都有乙個自旋鎖。

struct inode *d_inode;

目錄的inode。

struct hlist_node d_hash;

雜湊鍊錶節點,dentry被放在雜湊鍊錶dentry_cache上,方便尋找。

struct dentry *d_parent;

父目錄指標。

struct qstr d_name;

檔案或者是目錄的名

struct list_head d_lru;

lru鍊錶

union d_u;

父目錄中目錄項的指標。

struct list_head d_subdirs;

目錄中子項的指標。

struct list_head d_alias;

相關索引節點的指標

unsigned long d_time;

最近使用時間

struct dentry_operations *d_op;

目錄操作函式集合

struct super_block *d_sb;

目錄的超級塊指標

void *d_fsdata;

私有資料。

int d_mounted;

對於安裝點而言表示是否被掛載檔案系統,是不是乙個掛載點。

unsigned char d_iname[dname_inline_len_min];

所謂"檔案", 就是按一定的形式儲存在介質上的資訊,所以乙個檔案其實包含了兩方面的資訊,一是儲存的資料本身,二是有關該檔案的組織和管理的資訊

。在記憶體中,

每個檔案都有乙個dentry(目錄項)和inode(索引節點)結構,dentry記錄著檔名,上級目錄等資訊,正是它形成了我們所看到的樹狀結構;而有關該檔案的組織和管理的資訊主要存放inode裡面,它記錄著檔案在儲存介質上的位置與分布。

同時dentry->d_inode指向相應的inode結構。dentry與inode是多對一的關係,因為有可能乙個檔案有好幾個檔名(硬鏈結, hard link, 可以參考這個網頁

所有的dentry用d_parent和d_child連線起來,就形成了我們熟悉的樹狀結構。

inode代表的是物理意義上的檔案,通過inode可以得到乙個陣列

,這個陣列記錄了檔案內容的位置,如該檔案位於硬碟的第3,8,10塊,那麼這個陣列的內容就是3,8,10。其索引節點號inode->i_ino,在同乙個檔案系統中是唯一的,核心只要根據i_ino,就可以計算出它對應的inode在介質上的位置。就硬碟來說,根據i_ino就可以計算出它對應的inode屬於哪個塊(block),從而找到相應的inode結構。但僅僅用inode還是無法描述出所有的檔案系統,對於某一種特定的檔案系統而言,比如ext3,在記憶體中用ext3_inode_info描述。他是乙個包含inode的"容器"。

struct ext3_inode_info ;

le32 i data[15]這個陣列就是上一段中所提到的那個陣列。

注意,在遙遠的2.4的古代,不同檔案系統索引節點的記憶體映像(ext3_inode_info,reiserfs_inode_info,msdos_inode_info ...)都是用乙個union內嵌在inode資料結構中的. 但inode作為一種非常基本的資料結構而言,這樣搞太大了,不利於快速的分配和**。但是後來發明了container_of(...)這種方法後,就把union移到了外部,我們可以用類似container of(inode, struct ext3_inode_info, vfs_inode),從inode出發,得到其的"容器"。

dentry和inode終究都是在記憶體中的,它們的原始資訊必須要有乙個載體。否則斷電之後豈不是玩完了?且聽我慢慢道來。

檔案可以分為磁碟檔案,裝置檔案,和特殊檔案三種。裝置檔案暫且不表。

磁碟檔案

就磁碟檔案而言,dentry和inode的載體在儲存介質(磁碟)上。對於像ext3這樣的磁碟檔案來說,儲存介質中的目錄項和索引節點載體如下,

struct ext3_inode 

struct ext3_dir_entry_2 ;

le32 i block[ext2 n blocks];/* pointers to blocks */

i_block陣列指示了檔案的內容所存放的地點(在硬碟上的位置)。

ext3_inode是放在索引節點區,而ext3_dir_entry_2是以檔案內容的形式存放在資料區。我們只要知道了ino,由於ext3_inode大小已知,我們就可以計算出ext3_inode在索引節點區的位置( ino * sizeof(ext3_inode) ),而得到了ext3_inode,我們根據i_block就可以知道這個檔案的資料存放的地點。將磁碟上ext3_inode的內容讀入到ext3_inode_info中的函式是ext3_read_inode()。以乙個有100 block的硬碟為例,乙個檔案系統的組織布局大致如下圖。點陣圖區中的每一位表示每乙個相應的物件有沒有被使用。

特殊檔案

特殊檔案在記憶體中有inode和dentry資料結構,但是不一定在儲存介質上有"索引節點",它斷電之後的確就玩完了,所以不需要什麼載體。當從乙個特殊檔案讀時,所讀出的資料是由系統內部按一定的規則臨時生成的,或從記憶體中收集,加工出來的。sysfs裡面就是典型的特殊檔案。它儲存的資訊都是由系統動態的生成的,它動態的包含了整個機器的硬體資源情況。從sysfs讀寫就相當於向kobject層次結構提取資料。

還請注意, 我們談到目錄項和索引節點時,有兩種含義。一種是在儲存介質(硬碟)中的(如ext3_inode),一種是在記憶體中的,後者是根據在前者生成的。記憶體中的表示就是dentry和inode,它是vfs中的一層,不管什麼樣的檔案系統,最後在記憶體中描述它的都是dentry和inode結構。我們使用不同的檔案系統,就是將它們各自的檔案資訊都抽象到dentry和inode中去。這樣對於高層來說,我們就可以不關心底層的實現,我們使用的都是一系列標準的函式呼叫。這就是vfs的精髓,實際上就是物件導向。

我們在程序中開啟乙個檔案f,實際上就是要在記憶體中建立f的dentry,和inode結構,並讓它們與程序結構聯絡來,

把vfs中定義的介面給接起來。我們來看一看這個經典的圖。這張圖之於檔案系統,就像每天愛你多一些之於張學友,番茄炒蛋之於復旦南區食堂,刻骨銘心。

dentry與inode有什麼聯絡和區別

dentry與inode有什麼聯絡和區別 2012 12 06 16 45 54 分類 linux 我們在程序中要怎樣去描述乙個檔案呢?我們用目錄項 dentry 和索引節點 inode 它們的定義如下 struct dentry struct inode 所謂 檔案 就是按一定的形式儲存在介質上的...

Linux中inode節點有什麼作用?

理解inode,要從檔案儲存說起。檔案儲存在硬碟上,硬碟的最小儲存單位叫做 扇區 sector 每個扇區儲存512位元組 相當於0.5kb 作業系統讀取硬碟的時候,不會乙個個扇區地讀取,這樣效率太低,而是一次性連續讀取多個扇區,即一次性讀取乙個 塊 block 這種由多個扇區組成的 塊 是檔案訪問的...

一 inode是什麼?

一 inode是什麼?理解inode,要從檔案儲存說起。檔案儲存在硬碟上,硬碟的最小儲存單位叫做 扇區 sector 每個扇區儲存512位元組 相當於0.5kb 作業系統讀取硬碟的時候,不會乙個個扇區地讀取,這樣效率太低,而是一次性連續讀取多個扇區,即一次性讀取乙個 塊 block 這種由多個扇區組...