我們在程序中要怎樣去描述乙個檔案呢?我們用目錄項(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 這種由多個扇區組...