【導讀】進程文件系統 -- procfs -- 允許像管理文件那樣直接管理內核進程。是一個偽文件系統,提供了內核進程表的文件系統接口。
/proc/目錄簡介
進程文件系統,procfs,是一個偽文件系統,它允許對一些非傳統意義上的文件通過標准文件I/O接口進行訪問。procfs將Solaris內核進程架構進行了抽象,比如當前系統中所有運行著的進程會在/proc/目錄下有所體現。系統中每個進程對應/proc/目錄下的一個子目錄,子目錄名即相應進程號(PID),所有進程號子目錄構成了/proc/目錄的全部內容。
許多提供進程數據和控制點的內核數據結構在/proc//子目錄下有相應反映,
比如,多線程進程中每個LWP的相關數據和控制結構體現在/proc//lwp/ 中。 /proc/目錄下的對象不是真實磁盤文件,這些對象位於內核內存中,用戶執行ls(1)命令顯示/proc/目錄結構時,系統讀取內核內存並返回相應內容。
通過/proc,相對簡便地就可以獲取進程信息,比如進程執行環境、內核資源利用率。進程控制和procfs直接相關,procfs最初的設計目的很簡單,就是為編寫調試器提供一組接口,現在已經有了相當大的改進。
Solaris系統在/usr/proc/bin/目錄下提供了一組工具從/proc中析取進程信息,同時可以進行簡單的進程控制。可以參看proc(1)手冊頁。進程狀態命令ps(1)也利用了procfs接口。
下面列舉可以通過/proc文件系統獲取的控制和信息數據,關於這些文件的詳細信息參看proc(4)手冊頁。
/proc -- procfs的根目錄
/proc/ -- 某一確定進程的根目錄,進程PID正是子目錄名
/proc//as -- 進程地址空間,即struct proc結構中p_as成員。換句話說,進程地址空間以/proc//as文件的形式展現出來,通過這個偽文件系統接口可以訪問相應進程地址空間。
struct as * p_as; /* 進程地址空間指針 */
# ls -l /proc/53/as
-rw------- 1 root root 1458176 2月 8 17:34 /proc/53/as
struct proc結構定義在/usr/include/sys/proc.h文件中。
/proc//ctl -- 一個進程控制文件。可以只寫打開該文件,然後給相應進程發送控制信息。可以停止、啟動進程,設置進程停止於某一特殊事件。這演示了procfs的強大和便捷。進程控制、事件跟蹤可以通過打開相應進程的控制文件完成,只需要寫入期待行為的控制信息。參看proc(4)手冊了解控制信息和控制函數的詳細介紹。
/proc//status -- 進程狀態信息。對應/usr/include/sys/procfs.h文件裡定義的struct pstatus結構。proc(4)手冊頁裡也有描述。這個結構中有一個成員
lwpstatus_t pr_lwp; /* status of the representative lwp */
該成員對應一個有代表性的LWP(輕量級進程)。單線程進程只有一個LWP,很容易選定這個有代表性的LWP。那些多線程進程通常有多個LWPs,一個內核函數遍歷當前進程的所有LWPs,根據他們的狀態選取這個有代表性的LWP。首先選取正在執行中的LWP,如果不存在這樣的LWP,按照可運行、休眠、停止的順序選取LWP。
/proc//lstatus -- lwpstatus結構數組,進程中每個LWP對應一個lwpstatus結構。struct lwpstatus結構定義在/usr/include/sys/procfs.h文件中。
/proc//psinfo -- 類似ps(1)命令提供的進程信息。對應struct psinfo結構,類似struct pstatus結構,struct psinfo結構中有一個成員
lwpsinfo_t pr_lwp; /* information for representative lwp */
該成員的對應一個有代表性的LWP。
/proc//lpsinfo -- lwpsinfo結構數組,進程中每個LWP對應一個lwpsinfo結構
/proc//map -- 地址空間映射信息,可以用pmap(1)命令顯示這些數據信息。
/proc//rmap -- 進程中保留地址空間段。用pmap -r命令顯示這些數據信息。
/proc//xmap -- 擴展地址空間映射信息。用pmap -x命令顯示這些數據信息。
/proc//cred -- 進程身份驗證信息,對應/usr/include/sys/procfs.h文件中
定義的struct prcred結構。
/proc//sigact -- sigaction結構數組,描述和本進程相關的所有信號設置。
struct sigaction結構定義在/usr/include/sys/signal.h文件中。
/proc//auxv -- auxv_t結構數組,包含進程執行時傳遞給動態鏈接器的初始值。
auxv_t結構定義在/usr/include/sys/auxv.h文件中。
/proc//ldt -- 局部描述符表(LDT),僅存於Intel x86架構。
/proc//usage -- 進程資源利用率的相關數據,對應struct prusage結構,該
結構定義在/usr/include/sys/procfs.h文件中。
/proc//lusage -- prusage結構數組,對應各個LWP資源利用狀況。
/proc//pagedata -- 進程地址空間的另外一種表現方式,可以用於跟蹤頁面級
的引用和修改。參看struct prpageheader結構定義。
/proc//watch -- prwatch結構數組。通過寫控制文件/proc//ctl可以設置PCWATCH操作,此時建立該文件。允許監視一個或多個地址空間范圍,當訪問這些被監視頁面時,產生一次陷入。
scz注:這個功能和SoftIce的BPR功能類似,adb支持這種陷入,不知是否利用了procfs
/proc//cwd -- 到進程當前工作目錄的符號鏈接
/proc//root -- 到進程根目錄的符號鏈接(和上面那個什麼區別)
/proc//fd -- 這是一個子目錄,包含進程打開的文件句柄
/proc//fd/nn -- 對應進程打開的某個確定的文件句柄
/proc//object -- 這是一個子目錄,包含進程相關的可執行文件以及動態鏈接庫。
/proc//object/nn -- 二進制目標文件。進程對應的可執行文件名為a.out,其余是進程相關的動態鏈接庫文件。
object目錄提供的信息是進程級的,每個/proc//目錄有一個lwp子目錄,提供了LWP級的信息:
/proc//lwp -- 這是一個子目錄,包含進程中所有LWPs的信息
/proc//lwp/ -- 這是一個子目錄,包含對應lwpid的LWP信息
/proc//lwp//lwpctl -- 一個控制文件,通過它可以在LWP級上針對每個LWP發布控制操作
/proc//lwp//lwpstatus -- LWP狀態信息,對應lwpstatus結構,該結構定義在/usr/include/sys/procfs.h文件中
/proc//lwp//lwpsinfo -- 對應lwpsinfo結構,同樣定義在/usr/include/sys/procfs.h文件中
/proc//lwp//lwpusage -- LWP資源利用信息,對應prusage結構
/proc//lwp//xregs -- 這個文件是處理器架構相關的,某些平台上可能沒有這個文件。對於SPARC系統,這個文對/usr/include/sys/procfs_isa.h文件中定義的prxregset結構。
/proc//lwp//gwindows -- 常規寄存器窗口。這個文件僅存於SPARC架構的系統,描述LWP使用的常規寄存器組(硬件上下文的一部分),對應gwindows結構,該結構定義在/usr/include/sys/regset.h文件中。
/proc//lwp//asrs -- 輔助寄存器組,僅存於SPARC V9(UltraSPARC)架構,專為SPARC V9架構定義的一組額外的硬件寄存器,要求sun4u、64-bit內核(Solaris 7及其後續版本)、64-bit進程。注意,64-bit內核可以運行32-bit進程,但是32-bit進程沒有這樣一個文件與之對應。