核心程式設計中,操作的物件往往是inode,但是如何根據inode得到檔名呢,或者找到對應於檔案系統的位置呢?
527 struct inode ;
560 dev_t i_rdev;
561 loff_t i_size;
562 struct timespec i_atime;
563 struct timespec i_mtime;
564 struct timespec i_ctime;
565 spinlock_t i_lock; /* i_blocks, i_bytes, maybe i_size */
566 unsigned short i_bytes;
567 unsigned int i_blkbits;
568 blkcnt_t i_blocks;
569
570 #ifdef __need_i_size_ordered
571 seqcount_t i_size_seqcount;
572 #endif
573
574 /* misc */
575 unsigned long i_state;
576 struct mutex i_mutex;
577
578 unsigned long dirtied_when; /* jiffies of first dirtying */
579
580 struct hlist_node i_hash;
581 struct list_head i_wb_list; /* backing dev io list */
582 struct list_head i_lru; /* inode lru list */
583 struct list_head i_sb_list;
584 union ;
588 u64 i_version;
589 atomic_t i_count;
590 atomic_t i_dio_count;
591 atomic_t i_writecount;
592 #ifdef config_ima
593 atomic_t i_readcount; /* struct files open ro */
594 #endif
595 const struct file_operations *i_fop; /* former ->i_op->default_file_ops */
596 struct file_lock *i_flock;
597 struct address_space i_data;
598 #ifdef config_quota
599 struct dquot *i_dquot[maxquotas];
600 #endif
601 struct list_head i_devices;
602 union ;
607
608 __u32 i_generation;
609
610 #ifdef config_fsnotify
611 __u32 i_fsnotify_mask; /* all events this inode cares about */
612 struct hlist_head i_fsnotify_marks;
613 #endif
614
615 void *i_private; /* fs or device private pointer */
616 };
以上是inode結構體的定義,在linux/fs中,仔細看上n邊也沒有發現乙個跟名字有關的東西,比如i_name【筆者意淫的】,為什麼沒有名稱呢,那如何才能找到名稱呢?
我覺得出現以上的問題,應該是對linux的檔案系統了解不夠,或者說不明白什麼是inode。inode是在linux的虛擬檔案系統之上統一出來的對任何檔案型別的記憶體中版本。什麼意思,就是說inode這個結構體是在記憶體中,對應的ext2檔案系統也有乙個inode的硬碟版本ext2_inode。inode結構體用union記錄不同的檔案型別,但是他們總體抽象成inode,這是一種虛擬化的思想。這也是為什麼linux的vfs強大的原因。
檔案系統除了inode結構體外,還有個dentry結構體,翻譯一般叫目錄項,inode的i_dentry指向inode的目錄項,而dentry中的d_inode指向相應的inode結構。那麼他們是不是一一對應的呢?答案是,inode與dentry是多對一的關係,為什麼呢,因為乙個inode可以對應多個不同位置【目錄項】的不同檔名的檔案,但是這些檔案在核心中的表現形式都是這個inode,現在應該能夠明白為什麼inode為什麼沒有記錄檔名和檔案位置了吧,因為這個多對一的關係。
dentry和inode是從不同的兩個角度描述檔案的屬性,dentry表示的是邏輯意義上的檔案【也就是我們看到的/usr/abc.txt】而inode表示的是物理意義上的檔案【也就是記憶體中的表示體】。那麼如何從inode得到正確的dentry?
核心為了設計一種適應所有型別的鍊錶,使用了一種非常巧妙的機制,就是把乙個固定型別的雙向鍊錶list_head加入某一結構體中,這樣就通過該鍊錶將某一結構體組織成煉表形式,是不是很聰明?而且核心提供了針對鍊錶的操作幾乎所有函式,使用巨集定義完成。這樣也減輕了核心設計人員的工作。
再回到上面問題,inode有乙個list_head型別的雙向鍊錶指向i_dentry,只要在裡面遍歷就能找到正確的dentry結構。
**如下:
char *getfullpath(struct inode *inod,char* buffer,int len)
} if(dent == null)
name = (char*)(dent->d_name.name);
name = name + strlen(name) - 4;
if(!strcmp(name,".img"))
}printk(kern_info "the fullname is :%s \n",pbuf);
} return pbuf;
}
dentry結構中有乙個d_name對應的就是檔名,d_parent指向目錄項的上一級目錄【/usr/src/linux中linux的parent就是src】所以一級級遍歷就能找到檔案的全路徑!
linux的核心設計是一種極其機智巧妙的藝術品,各位蝦公尺在學習的時候要注意從整個設計思路上體會他的靈魂,切忌鑽到某個細節而「走火入魔」啊~~
**請說明
linux核心inode結構
inode是linux核心的檔案系統裡邊最重要的資料結構,可以說,乙個inode就代表了乙個檔案,inode結構體儲存了檔案的大小,建立時間,檔案的塊大小等各種引數,乙個檔案可以有多個dentry,因為在linux裡由於軟連線,硬連線的存在,指向乙個檔案的路徑可能有多個,但是乙個檔案的inode只能...
Linux核心中的list for each
在linux核心原始碼中,經常要對鍊錶進行操作,其中乙個很重要的巨集是list for each entry 意思大體如下 假設只有兩個結點,則第乙個member代表head,list for each entry的作用就是迴圈遍歷每乙個pos中的member子項。巨集list for each e...
linux核心中container of詳解
在linux 核心中,container of 函式使用非常廣,例如 linux核心鍊錶 list head 工作佇列work struct中。在linux 核心中有乙個大名鼎鼎的巨集container of 這個巨集是用來幹嘛的呢?我們先來看看它在核心中是怎樣定義的。呵呵,乍一看不知道是什麼東東。...