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

Solaris內(nèi)核目錄( 六 )


| | pr_lookup_function-----------------------
程| | | pr_lookup_piddir() |
| | Construct full path name,-----------------------
| | looking up each element | pr_lookup_lwpdir() |
| | in the path.-----------------------prgetnode()
| | | pr_lookup_objectdir() | /
| |-----------------------/
| | | | |/
| | ...... | ......
| | |
|-------------------------------------------
| VOP_OPEN() -> propen()
V

圖4. 打開一個procfs文件時的基本流程

--------------------------------------------------------------------------

圖4中流程從應(yīng)用程序開始,針對一個procfs文件做open(2)系統(tǒng)調(diào)用 。進入
vnode內(nèi)核層(vn_open()),完成一系列查找以構(gòu)建目標(biāo)/proc文件的完整路徑名 。通過vnode層的宏進入文件系統(tǒng)相關(guān)操作 。在上面的圖例中,VOP_LOOKUP()解析成procfs的pr_lookup()函數(shù) 。pr_lookup()完成訪問權(quán)限檢查并根據(jù)目錄文件類型調(diào)用相應(yīng)的procfs函數(shù),比如pr_lookup_piddir()針對/proc/目錄進行查找工作 。每個pr_lookup_xxx()目錄查找函數(shù)完成某些目錄類型相關(guān)的工作,然后調(diào)用prgetnode()獲取prnode 。

prgetnode()為/proc文件創(chuàng)建prnode(其中內(nèi)嵌了vnode),并初始化prnode和vnode結(jié)構(gòu)的某些成員 。對于/proc/和/proc//lwp/,還會創(chuàng)建
prcommon結(jié)構(gòu),掛接到prnode結(jié)構(gòu)上,并部分初始化 。注意,對于/proc下的目錄文件,為了正確反映目錄文件類型,vnode類型從VPROC(初始設(shè)置)改變成VDIR,表示這是一個procfs目錄文件 。

一旦完整路徑名構(gòu)建完畢,通過VOP_OPEN()宏進入文件系統(tǒng)相關(guān)的open()函數(shù) 。procfs的propen()函數(shù)完成prnode和vnode結(jié)構(gòu)的其余初始化以及針對特定文件類型的訪問測試工作 。一旦propen()完成,控制返回到vn_open() 。最終一個代表procfs文件的文件句柄返回給主調(diào)者 。

讀取一個procfs數(shù)據(jù)文件(和目錄文件相對)類型打開流程,read()系統(tǒng)調(diào)用最終
進入procfs的prread()函數(shù) 。procfs實現(xiàn)為每個可用文件對象(不同的數(shù)據(jù)結(jié)構(gòu))定義了一個數(shù)據(jù)文件對象相關(guān)的讀函數(shù),比如pr_read_psinfo()、pr_read_pstatus()、
pr_read_lwpsinfo()等等 。這些函數(shù)指針構(gòu)成一個數(shù)組,以文件類型做下標(biāo)進行索引,prread()最終調(diào)用了它們 。整個流程類似lookup操作 。

Solaris 7 的procfs實現(xiàn)是基于64-bit內(nèi)核的,但是同時支持32-bit和64-bit應(yīng)
用,在/proc層次結(jié)構(gòu)上提供了32-bit版本的可用數(shù)據(jù)文件 。在64-bit Solaris 7內(nèi)核中,描述每個/proc文件對象內(nèi)容的數(shù)據(jù)結(jié)構(gòu)同時擁有32-bit版本和64-bit版本,比如lwpstatus和lwpstatus32、psinfo和psinfo32等等 。針對每個32-bit版本的結(jié)構(gòu)定義,相應(yīng)pr_read_xxx()函數(shù)做了支持32-bit數(shù)據(jù)模式的編碼 。

procfs用戶并不會意識到64-bit內(nèi)核中多種數(shù)據(jù)模式實現(xiàn) 。調(diào)用到prread()時,
它會檢查主調(diào)者使用的數(shù)據(jù)模式,并激活相應(yīng)數(shù)據(jù)模式的函數(shù) 。這里有一個例外,讀取/proc//as(地址空間)文件時,主調(diào)者必須擁有與/proc//as文件一樣的
數(shù)據(jù)模式,換句話說,64-bit內(nèi)核中32-bit應(yīng)用程序可以讀取另外一個32-bit進程的AS(地址空間)文件,但是不能讀取另外一個64-bit進程的AS文件 。

scz注:我覺得這里倒不如說,/proc//as本身是擁有單一數(shù)據(jù)模式的,要么
32-bit,要么64-bit,不可得兼 。而其他/proc數(shù)據(jù)文件對象可能同時支持兩
種數(shù)據(jù)模式 。

pr_read_xxxx()函數(shù)從內(nèi)核里讀取相關(guān)數(shù)據(jù),然后寫入相應(yīng)的procfs數(shù)據(jù)結(jié)構(gòu),最終返回給主調(diào)者 。例如,pr_read_psinfo()從目標(biāo)進程的proc結(jié)構(gòu)、cred結(jié)構(gòu)和as結(jié)構(gòu)讀取數(shù)據(jù),寫入psinfo結(jié)構(gòu)中相應(yīng)成員 。訪問內(nèi)核數(shù)據(jù)時靠proc結(jié)構(gòu)的p_lockp成員確定的互斥鎖進行同步,這樣確保每次只有一個客戶線程能夠訪問per-process或per-lwp內(nèi)核數(shù)據(jù) 。

很少需要寫訪問procfs文件 。姑且不考慮寫目錄創(chuàng)建數(shù)據(jù)文件,典型的寫操作就

推薦閱讀