open系統呼叫流程 從vfs到底層檔案系統

2021-06-14 08:58:53 字數 1360 閱讀 1870

sys_open (filename,flag,mode)

do_sys_open (dfd=-100, filename=null,flags=35137, mode=438)

get_unused_fd_flags(flags),獲得乙個檔案控制代碼fd

do_filp_open

(dfd,pathname,open_flag,mode),獲得乙個檔案物件

path_lookup_create(lookup_parent,&nd),獲得父目錄的nameidata資訊,這個函式會生成file物件,引用計數器預設值為1

dentry=lookup_hash

(&nd),獲得要查詢檔案的dentry資訊

inode_permission,檢驗一下父目錄的inode

__lookup_hash(name,base,nd)

cached_lookup(base,name,nd),在快取中查詢,看是否有dentry

new=d_alloc(base,name),在記憶體中沒有,就生成乙個新的dentry物件,包括空間的申請,一些數值的初始化

atomic_set(&dentry->d_count, 1);引用計數器置為1

dentry->d_flags = dcache_unhashed;置為unhashed

capfs_lookup(inode,new,nd),其中,inode為父目錄的inode,

這裡是具體檔案系統的lookup操作

capfs_wrap_lookupdata (dir,dentry,nd),向mds傳送命令,查詢對應的檔案是否存在。

如果查詢成功呼叫

capfs_fhget

,這個檔案對應的具體檔案系統inode結構

ifind(),查詢是否inode已經存在,

這裡是核心部分

get_new_inode,生成新的inode

alloc_inode,申請乙個新的inode(capfs_i_info)

alloc_inode(

呼叫具體檔案系統的alloc_inode方法)

atomic_set(&inode->i_count, 1);計數器置為1

查詢不成功,status置為-enoent,inode=null

d_splice_alias(dentry,inode),dentry為上層傳遞下來的,inode為剛剛建立的。

d_add(dentry,inode)

d_instantiate(dentry,inode),把dentry加入到剛剛建立的inode對應的dentry鏈中,同時dentry指向inode

d_rehash(dentry),把dentry插入到其父目錄dentry所有用的雜湊鍊錶中,方便下一次查詢

從使用者態的open到核心驅動實現流程

華清遠見嵌入式學院 講師。在講授linux初級驅動的時候,我發現困惑很多同學的是不真正理解從應用層到我們自己所寫的驅動層的呼叫過程,所以寫此文章來大概描述。首先我們知道,在我們目前的linux系統中,我們大概共約300左右個系統呼叫,其中syscall table.s列出了所有的系統呼叫表。long...

從使用者態的open到核心驅動實現流程

從使用者態的open到核心驅動實現流程 在講授linux初級驅動的時候,我發現困惑很多同學的是不真正理解從應用層到我們自己所寫的驅動層的呼叫過程,所以寫此文章來大概描述。首先我們知道,在我們目前的linux系統中,我們大概共約300左右個系統呼叫,其中syscall table.s列出了所有的系統呼...

open系統呼叫在核心中的流程分析

真是蠻複雜的,我分三步走,力求講得比較清楚。以字元裝置為例,相對於塊裝置要簡單些。基於2.6.26的核心 一 驅動註冊open函式都幹了些什麼?register chrdev cdev add kobj map file fs char dev.c int register chrdev unsig...