時(shí)間:2015-06-28 00:00:00 來源:IT貓撲網(wǎng) 作者:網(wǎng)管聯(lián)盟 我要評(píng)論(0)
問題一:如果要找某一個(gè)特定的文件,內(nèi)核如何處理?
答案:
?。?)在目錄項(xiàng)緩存中查找,注意這里是通過哈西函數(shù)查找的,而且查找順序?yàn)閺挠蚁蜃蟆?/p>
e.g.
處理/usr/src/jiawei.c,會(huì)從 jiawei.c 開始向上逐級(jí)查找,直到根目錄,這樣的效率很高。
(2)如果緩存中沒有,那么然后文件系統(tǒng)會(huì)從根目錄開始找起,逐級(jí)查找。
具體是這樣,先找到/目錄(根目錄)的dentry(目錄項(xiàng)),然后會(huì)找到它的inode,它的inode會(huì)有一項(xiàng)專門記錄其下一級(jí)的所有 dentry,找到對(duì)應(yīng)的 dentry,再如上述一樣接著進(jìn)行。然后就這樣一直找到所要找的文件(注意 linux下面沒有目錄,因?yàn)槟夸浺彩俏募?。
問題二:dentry 結(jié)構(gòu)體中的 d_inode 指向的的是哪個(gè) inode?
答案:
切記這里指向的是本 dentry 的 inode,而不是下一級(jí)的 inode。
問題三:vfs 中的 dentry 結(jié)構(gòu)體中的 vunsigned 類型?
答案:
如下是在網(wǎng)上下載的源碼(有我們自己的解釋):
struct dentry {
atomic_t d_count; //目錄項(xiàng)對(duì)象使用計(jì)數(shù)器
unsigned int d_flags; //目錄項(xiàng)標(biāo)志
struct inode * d_inode;//與文件名關(guān)聯(lián)的索引節(jié)點(diǎn),從該指針找到 inode,從而找到所要找的文件(應(yīng)該是這樣)
struct dentry * d_parent;// 父目錄的目錄項(xiàng)對(duì)象
struct list_head d_hash; //散列表表項(xiàng)的指針
struct list_head d_lru; //未使用鏈表的指針
struct list_head d_child; //父目錄中目錄項(xiàng)對(duì)象的鏈
struct list_head d_subdirs;//對(duì)目錄而言,表示子目錄目錄項(xiàng)對(duì)象的鏈表
struct list_head d_alias; //相關(guān)索引節(jié)點(diǎn)(別名)的鏈表
int d_mounted;//對(duì)于安裝點(diǎn)而言,表示被安裝文件系統(tǒng)根項(xiàng)
struct qstr d_name; //文件名
unsigned long d_time; /* used by d_revalidate*/
struct dentry_operations *d_op;// 目錄項(xiàng)方法
struct super_block * d_sb; //文件的超級(jí)塊對(duì)象
vunsigned long d_vfs_flags;
void * d_fsdata;//與文件系統(tǒng)相關(guān)的數(shù)據(jù)
unsigned char d_iname [DNAME_INLINE_LEN]; //存放短文件名
};
事實(shí)上 kernel 早就不用這個(gè)數(shù)據(jù)類型了,你可以找找最近2.6 版的,找不到了,下面是 2.6.34.4 的 dentry 源碼。
struct dentry {
atomic_t d_count;
unsigned int d_flags; /* protected by d_lock */
spinlock_t d_lock;/* per dentry lock */
int d_mounted;
struct inode *d_inode; /* Where the name belongs
to - NULL is
* negative */
/*
* The next three fields are touched by
__d_lookup.Place them here
* so they all fit in a cache line.
*/
struct hlist_node d_hash;/* lookup hash list */
struct dentry *d_parent; /* parent directory */
struct qstr d_name;
struct list_head d_lru;/* LRU list */
/*
* d_child and d_rcu can share memory
*/
union {
struct list_head d_child/* child of parent list */
truct rcu_head d_rcu;
} d_u;
struct list_head d_subdirs;/* our children */
struct list_head d_alias;/* inode alias list */
unsigned long d_time;/* used by d_revalidate */
const struct dentry_operations *d_op;
struct super_block *d_sb;/* The root of the dentry
tree */
void *d_fsdata;/* fs-specific data */
unsigned char d_iname[DNAME_INLINE_LEN_MIN]; /*
small names */
};
以上是我們西郵linux興趣小組中fs團(tuán)隊(duì)討論的幾個(gè)問題,現(xiàn)在來給大家說一下我們討論的結(jié)果。如果有異議,希望各位提出來,謝謝!
關(guān)鍵詞標(biāo)簽:linux
相關(guān)閱讀
熱門文章 安裝紅帽子RedHat Linux9.0操作系統(tǒng)教程 Tomcat9.0如何安裝_Tomcat9.0環(huán)境變量配置方法 多種操作系統(tǒng)NTP客戶端配置 Linux操作系統(tǒng)修改IP
人氣排行 Linux下獲取CPUID、硬盤序列號(hào)與MAC地址 dmidecode命令查看內(nèi)存型號(hào) linux tc實(shí)現(xiàn)ip流量限制 安裝紅帽子RedHat Linux9.0操作系統(tǒng)教程 linux下解壓rar文件 lcx.exe、nc.exe、sc.exe入侵中的使用方法 Ubuntu linux 關(guān)機(jī)、重啟、注銷 命令 查看linux服務(wù)器硬盤IO讀寫負(fù)載