日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

2 FreeBSD 核心( 三 )


運行(*mountroot)(mountrootvfsops)后,就指明了root file system的mount.
。vfs_mountroot()(@kern/vfs_conf.c)
管理mount的了文件系統(tǒng)的信息的struct mount(@sys/mount.h),對它進行確認
,然后設(shè)定傳遞過來的對虛擬文件系統(tǒng)的操作群(&ufs_vfsops),才進行"root"
標(biāo)記 。根據(jù)VFS_MOUNT(mp,...)進行mount這個虛擬文件系統(tǒng) 。mount成功后,就
追加file system的list 。這里,由于傳遞了&ufs_vfsops,就可以調(diào)用
ffs_mount()(@ufs/ffs/ffs_vfsops.c)
。ffs_mount()
首先調(diào)用bdevvp()(@kern/vfs_subr.c),進行VBLK類別,spec_vnodeop_p
(@misc/specfs/spec_vnops.c) v-node操作,保證設(shè)定了驅(qū)動號的rootdev的
v-node的最新信息,然后設(shè)定rootvp 。最后,通過ffs_mountfs()調(diào)用進行實際
的mount rootvp操作 。
。ffs_mountfs()
各種各樣的檢查完了后,調(diào)用VOP_OPEN(),打開rootvp的v-node 。在這里,如果
v-node的v_op成員在spec_vnodeop_p存在的話,就調(diào)用spec_open()(@misc/
specfs/spec_vnops.c) 。
.spec_open
由于VBLK里包含v-node的種類,從v-node指定的device號取得major的
號,調(diào)用對應(yīng)driver的XXopen() routine

續(xù)上,由VOP_IOCTL()(還是的通過spec_ioctl()(@misc/specfs/spec_vnops.c))
可以得到partition信息,然后該檢查super block的內(nèi)容 。正確的話,就在struct
ufsmount(@ufs/ufs/ufsmount.h)設(shè)定unix file system,這樣處理過程就完了 。

2.2.4 struct buf 和block的輸入輸出routine
前節(jié)的ffs_mountfs()提到使用bread()(@kern/vfs_bio.c)讀出partition的
super block 。這個接口函數(shù)很快就會解釋 。它主要用于讀取block型的device到
kernel內(nèi)部的buffer中 。
bread(struct vnode *vp, /*(in)輸入對象的v-node*/
daddr_t blkno, /*(in)block號*/
int size, /*(in)讀出的byte數(shù)量,block長的倍數(shù)*/
struct ucred * cred,/*(in)權(quán)限信息*/
struct buf ** bpp)/*(out)存儲讀來的data*/
同樣的buffer link后的block輸出的子程序是bwrite() 。
bwrite(struct buf *bp) /*(out)可以輸出的struct buf*/
兩者之間共同的地方就是struct buf(@/sys/buf.h),它用于io處理中給device driver
做橋梁作用的數(shù)據(jù)結(jié)構(gòu) 。它記錄了v-node,io的區(qū)別,可以io的block位置/byte數(shù),存
儲實際data buffer的address,io處理的進展情況等 。

bread則通過getblk()對block輸入的結(jié)構(gòu)struct buf進行操作 。getblk()調(diào)用在核心
管理buffer link和返回指定大小的block的struct buf 。這個(緩沖區(qū))內(nèi)容在目的
block是否存在與指定v-node的指定位置block是否已經(jīng)構(gòu)成緩沖環(huán)有關(guān) 。struct buf
里面有一個標(biāo)志位,當(dāng)緩沖環(huán)內(nèi)容變化是,這個標(biāo)志位就會改變 。bread()根據(jù)這個
flag判斷block是否已經(jīng)緩沖,如果已經(jīng)完成,它就終止退出 。如果不是這樣,則在
struct buf的mark里面標(biāo)志,然后調(diào)用VOP_STRATEGY() 。在v-node登記的strategy
routine記錄了io處理的過程,所以bread()當(dāng)實際的處理完了后,就調(diào)用biowait()
進入等待狀態(tài) 。然后,就轉(zhuǎn)移到別的進程A 。io處理完了后,調(diào)用biodone(),進程A
也可以繼續(xù)進行 。還有,調(diào)用bread()的一邊,當(dāng)完成操作后,就調(diào)用brelse(),在
里面對struct buf的flag重新設(shè)置,讓它對別的程序開放 。

bwrite也是同樣的通過VOP_STRATEGY()對io處理要求進行登記,同時也調(diào)用biowait()
進入等待狀態(tài),同樣,當(dāng)實際操作完了后,也設(shè)置flag進行復(fù)位,使得其他程序可以
使用io,當(dāng)空閑的時候,io就掛起,轉(zhuǎn)向其他進程處理 。
進程等待進入的時候,當(dāng)然不限于只是調(diào)用biowait() 。在bread()或者bwrite()之前,
系統(tǒng)必須分配足夠的資源供它使用,比如一些緩沖區(qū)等 。當(dāng)進行實際io時候,1個block
也可以,多個block也可以,而且這樣可以獲得更高的效率,這樣看起來,就象實際上
是連續(xù)操作了 。

推薦閱讀