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

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



procfs是通過動態(tài)可加載內(nèi)核模塊的方式實現(xiàn)的 。系統(tǒng)啟動時自動加載
/kernel/fs/procfs,/etc/vfstab文件中存在缺省/proc入口,系統(tǒng)啟動過程中/proc將被mount上來 。mount過程中將調(diào)用procfs的prinit()和prmount()函數(shù),它們?yōu)閜rocfs初始化vfs(虛擬文件系統(tǒng))結(jié)構(gòu),為根目錄/proc/創(chuàng)建并初始化一個vnode 。vfs結(jié)構(gòu)定義在/usr/include/sys/vfs.h文件中,vnode結(jié)構(gòu)定義在/usr/include/sys/vnode.h文件中 。

/proc目錄所涉及的內(nèi)核內(nèi)存空間絕大部分是動態(tài)分配的 。但是系統(tǒng)支持的最大
進程數(shù)(可以通過/etc/system的max_nprocs參數(shù)配置)決定了/proc下子目錄插槽數(shù)目,這個是靜態(tài)分配初始化的 。內(nèi)核變量procdir是一個指向procent結(jié)構(gòu)數(shù)組的指針,每個procent結(jié)構(gòu)對應(yīng)一個procfs目錄入口,procent結(jié)構(gòu)數(shù)組元素數(shù)量源自系統(tǒng)啟動時初始化的v.v_proc變量的值,也就是系統(tǒng)支持的最大進程數(shù) 。

scz注:在Solaris Kernel Hacking過程中,應(yīng)該習(xí)慣使用下面這兩種命令,很多未公開內(nèi)核數(shù)據(jù)結(jié)構(gòu)在/usr/include下的頭文件中有相當(dāng)體現(xiàn),然后利用nm命
令確認(rèn)當(dāng)前內(nèi)核正在使用這些內(nèi)核數(shù)據(jù)結(jié)構(gòu)或者內(nèi)核函數(shù) 。

# find /usr/include -name "*" | xargs grep -i "procdir"
# /usr/ccs/bin/nm -x /dev/ksyms | grep -i "|procdir"
[1433] |0x0000104570d0|0x000000000008|OBJT |LOCL |0 |ABS |procdir
# /usr/ccs/bin/nm -x /dev/ksyms | grep -i "|v$"
[8741] |0x00001041e1f4|0x00000000003c|OBJT |GLOB |0 |ABS |v
[6634] |0x00001041e1f4|0x00000000003c|OBJT |GLOB |0 |ABS |v

每個procent結(jié)構(gòu)中pe_proc成員指向?qū)?yīng)的proc結(jié)構(gòu),pe_next成員指向數(shù)組的下一個元素(scz:不但是數(shù)組,也形成鏈表) 。整個procdir數(shù)組由進程PID結(jié)構(gòu)的pid_prslot成員索引 。創(chuàng)建進程時(fork())系統(tǒng)在procdir數(shù)組中為之分配一個元素,參看圖1 。

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

------------> --------- <----procdir(procent結(jié)構(gòu)數(shù)組)
| proc |<-----------------------|-----| pe_proc |
| | | | pe_next |--0
| p_pidp |---->------------|---------| |
內(nèi)--------| pid_prslot |----| pe_proc |<-|
| ^ | pid_id | | pe_next |--|
核 V |---------------------| |
--------| pe_proc |<-|
進 | proc | | pe_next |--|
| |----> ---------| |
程 | p_pidp |---->------------| | pe_proc |<-|
--------| pid_prslot |----| pe_next |--|
表 | ^ | pid_id |---------| |
V |-----------------| pe_proc |<-|
--------| | pe_next | |
| proc |<--------------------------------|
| | | | |
| p_pidp | | | V
--------| | v.v_proc


圖1. 進程PID結(jié)構(gòu)的pid_prslot成員用于索引procdir數(shù)組

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

下面是在我的Sun工作站上找到的相應(yīng)頭文件內(nèi)容:

/usr/include/sys/proc.h

struct proc
{
struct proc * p_next; /* active chain link next */
struct proc * p_prev; /* active chain link prev */
struct pid * p_pidp; /* process ID info */
struct vnode * p_trace; /* pointer to primary /proc vnode */
struct vnode * p_plist; /* list of /proc vnodes for process */
}

/* process ID info */
struct pid
{
unsigned int pid_prslot :24;
pid_t pid_id;
};

procfs內(nèi)核代碼描述了procfs目錄入口的精確格式,這個格式以典型的磁盤文件
系統(tǒng)為模板,內(nèi)核中每個入口對應(yīng)一個目錄名 。目錄入口包含在目錄中的偏移(第幾個入口)、長度域以及inode號 。/proc下文件對象的inode號源自文件對象類型和進程號 。注意,/proc目錄入口不會出現(xiàn)在目錄名搜索緩存中,根據(jù)定義,/proc目錄入口總是位于物理內(nèi)存中(不會被扇出?) 。

因為procfs是一個文件系統(tǒng),它構(gòu)建在虛擬文件系統(tǒng)VFS和Solaris vnode構(gòu)架之上,文件系統(tǒng)實例作為一個VFS對象存在,其中的文件通過vnode描述 。procfs創(chuàng)建VFS和vnode結(jié)構(gòu),通過它們可以針對procfs進行文件系統(tǒng)相關(guān)操作,比如mount和umount,可以針對/proc目錄及文件對象進行open、read和write操作 。

推薦閱讀