Solaris内核目录

目录:

概述
◆ /proc/目录简介
◆ procfs的实现
后记

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

概述:

进程文件系统 -- procfs -- 允许像管理文件那样直接管理内核进程 。

进程文件系统,procfs,是一个伪文件系统,提供了内核进程表的文件系统接口,
Jim Mauro 在这里概要介绍了procfs 。

翻译本文的目的在于编写64-bit下的SLKM,欢迎对此感兴趣的朋友交流 。

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

◆ /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结构,

推荐阅读