資源描述:
《linux_kernel_fuse_源碼剖析》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫(kù)。
1、FUSE源碼剖析?1.?前言????本文是對(duì)FUSE-2.9.2源碼的學(xué)習(xí)總結(jié)。FUSE代碼在用戶空間和內(nèi)核空間都有運(yùn)行,為了突出重點(diǎn),先簡(jiǎn)要描述了在基于FUSE的用戶空間文件系統(tǒng)中執(zhí)行write操作的一般流程,接下來介紹了重要的數(shù)據(jù)結(jié)構(gòu),最后以FUSE的運(yùn)行過程為線索,剖析FUSE程序運(yùn)行過程的3個(gè)關(guān)鍵步驟:???????1.FUSE模塊加載?????????2.mount和open過程????????3.對(duì)文件write。???????對(duì)于虛擬文件系統(tǒng)和設(shè)備驅(qū)動(dòng)的相關(guān)概念本文僅作簡(jiǎn)要說明。需要說明的是,由于內(nèi)核的復(fù)雜性及個(gè)人能力的有限,本文省略了包括內(nèi)核同步,異
2、常檢查在內(nèi)的諸多內(nèi)容,希望可以突出重點(diǎn)。?2.?FUSE下write的一般流程???????????????????????????????????????????????????????????????????????????????????圖1???????在基于FUSE的用戶空間文件系統(tǒng)中執(zhí)行write操作的流程如圖1所示(由于版面關(guān)系,圖中部分函數(shù)是縮寫,請(qǐng)參考源碼):???????1.客戶端在mount目錄下面,對(duì)一個(gè)regular?file調(diào)用write,?這一步是在用戶空間執(zhí)行???????2.write內(nèi)部會(huì)調(diào)用虛擬文件系統(tǒng)提供的一致性接口vfs_w
3、rite???????3.根據(jù)FUSE模塊注冊(cè)的file_operations信息,vfs_write會(huì)調(diào)用fuse_file_aio_write,將寫請(qǐng)求放入fuse?connection的request?pending?queue,?隨后進(jìn)入睡眠等待應(yīng)用程序reply???????4.用戶空間的libfuse有一個(gè)守護(hù)進(jìn)程通過函數(shù)fuse_session_loop輪詢雜項(xiàng)設(shè)備/dev/fuse,?一旦request?queue有請(qǐng)求即通過fuse_kern_chan_receive接收???????5.fuse_kern_chan_receive通過read讀取
4、request?queue中的內(nèi)容,read系統(tǒng)調(diào)用實(shí)際上是調(diào)用的設(shè)備驅(qū)動(dòng)接口fuse_dev_read???????6.在用戶空間讀取并分析數(shù)據(jù),執(zhí)行用戶定義的write操作,將狀態(tài)通過fuse_reply_write返回給kernel???????7.fuse_reply_write調(diào)用VFS提供的一致性接口vfs_write???????8.vfs_write最終調(diào)用fuse_dev_write將執(zhí)行結(jié)果返回給第3步中等待在waitq的進(jìn)程,此進(jìn)程得到reply?后,write返回?3.?數(shù)據(jù)結(jié)構(gòu)???????本節(jié)主要介紹了FUSE中比較重要的數(shù)據(jù)結(jié)構(gòu),需要說
5、明的是圖示中只列出了與敘述相關(guān)的數(shù)據(jù)成員,完整的數(shù)據(jù)結(jié)構(gòu)細(xì)節(jié)請(qǐng)參考源碼。3.1.?內(nèi)核部分?????????????????????????????????????????圖2???????struct?fuse_conn:每一次mount會(huì)實(shí)例化一個(gè)struct?fuse_conn即fuse?connection,?它代表了用戶空間和內(nèi)核的通信連接。fuse?connection維護(hù)了包括pending?list,?processing?list和io?list在內(nèi)的request?queue,fuse?connection通過這些隊(duì)列管理用戶空間和內(nèi)核空間通信過
6、程。???????struct?fuse_req:每次執(zhí)行系統(tǒng)調(diào)用時(shí)會(huì)生成一個(gè)struct?fuse_req,?這些fuse_req依據(jù)state被組織在不同的隊(duì)列中,struct?fuse_conn維護(hù)了這些隊(duì)列.??????struct?file:?存放打開文件與進(jìn)程之間進(jìn)行交互的有關(guān)信息,描述了進(jìn)程怎樣與一個(gè)打開的文件進(jìn)行交互,這類信息僅當(dāng)進(jìn)程訪問文件期間存在于內(nèi)核內(nèi)存中。???????struct?inode:文件系統(tǒng)處理文件所需要得所有信息都放在一個(gè)名為inode(索引節(jié)點(diǎn))的數(shù)據(jù)結(jié)構(gòu)中。文件名可以隨時(shí)更改,但是索引節(jié)點(diǎn)對(duì)文件是唯一的,并且隨著文件的存在而
7、存在。???????struct?file_operation:定義了可以對(duì)文件執(zhí)行的操作。?3.2.?用戶空間部分????????????????????????????????????圖3???????struct?fuse_req:這個(gè)結(jié)構(gòu)和上文中內(nèi)核的fuse_req同名,有著類似的作用,但是數(shù)據(jù)成員不同。???????struct?fuse_session:定義了客戶端管理會(huì)話的結(jié)構(gòu)體,包含了一組對(duì)session可以執(zhí)行的操作。???????struct?fuse_chan:定義了客戶端與FUSE內(nèi)核連接通道的結(jié)構(gòu)體,包含了一組對(duì)channel可以執(zhí)行