分享
 
 
 

Solaris内核目录

王朝other·作者佚名  2006-11-24
窄屏简体版  字體: |||超大  

目录:

概述

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

类似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进程没有这样一个文件与之对应。

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

◆ procfs的实现

procfs是通过动态可加载内核模块的方式实现的。系统启动时自动加载

/kernel/fs/procfs,/etc/vfstab文件中存在缺省/proc入口,系统启动过程中/proc将被mount上来。mount过程中将调用procfs的prinit()和prmount()函数,它们为procfs初始化vfs(虚拟文件系统)结构,为根目录/proc/创建并初始化一个vnode。vfs结构定义在/usr/include/sys/vfs.h文件中,vnode结构定义在/usr/include/sys/vnode.h文件中。

/proc目录所涉及的内核内存空间绝大部分是动态分配的。但是系统支持的最大

进程数(可以通过/etc/system的max_nprocs参数配置)决定了/proc下子目录插槽数目,这个是静态分配初始化的。内核变量procdir是一个指向procent结构数组的指针,每个procent结构对应一个procfs目录入口,procent结构数组元素数量源自系统启动时初始化的v.v_proc变量的值,也就是系统支持的最大进程数。

scz注:在Solaris Kernel Hacking过程中,应该习惯使用下面这两种命令,很多未公开内核数据结构在/usr/include下的头文件中有相当体现,然后利用nm命

令确认当前内核正在使用这些内核数据结构或者内核函数。

# 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结构中pe_proc成员指向对应的proc结构,pe_next成员指向数组的下一个元素(scz:不但是数组,也形成链表)。整个procdir数组由进程PID结构的pid_prslot成员索引。创建进程时(fork())系统在procdir数组中为之分配一个元素,参看图1。

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

+--------+ +---->+---------+<----procdir(procent结构数组)

| proc |<-----------------------|-----| pe_proc |

| | | | pe_next |--+ 0

| p_pidp |----> +------------+ | +---------+ | |

内 +--------+ | 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结构的pid_prslot成员用于索引procdir数组

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

下面是在我的Sun工作站上找到的相应头文件内容:

/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内核代码描述了procfs目录入口的精确格式,这个格式以典型的磁盘文件

系统为模板,内核中每个入口对应一个目录名。目录入口包含在目录中的偏移(第几个入口)、长度域以及inode号。/proc下文件对象的inode号源自文件对象类型和进程号。注意,/proc目录入口不会出现在目录名搜索缓存中,根据定义,/proc目录入口总是位于物理内存中(不会被扇出?)。

因为procfs是一个文件系统,它构建在虚拟文件系统VFS和Solaris vnode构架之上,文件系统实例作为一个VFS对象存在,其中的文件通过vnode描述。procfs创建VFS和vnode结构,通过它们可以针对procfs进行文件系统相关操作,比如mount和umount,可以针对/proc目录及文件对象进行open、read和write操作。

除了VFS和vnode结构,procfs实现中主要定义了两个数据结构用于描述/proc目录下文件对象。第一个是prnode结构(/usr/include/sys/proc/prdata.h),描述那些最终链接到vnode的文件系统相关数据。内核UFS实现定义了一个inode做为描述一个UFS文件的文件系统相关数据结构,类似的,内核procfs实现定义了一个prnode描述一个procfs文件。/proc目录下的每个文件有一个vnode和prnode对应。

第二个是prcommon结构,遍布整个/proc目录结构,换句话说,每个/proc/

和/proc//lwp/目录本身都对应一个prcommon结构,但是这些目录下的

文件对象并没有对应一个prcommon结构,因为访问这些文件对象时必然与一个确定的进程或者LWP相关。prcommon结构对这些目录下的文件对象共性进行抽象。prnode和prcommon结构定义在/usr/include/sys/proc/prdata.h文件中。参看图2。

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

/proc

\

\ prnode prcommon

+--+ +--+

+---------------------------------+ | | | |

| | +--+ +--+

| |

| +------------------------------------------------------+

| prnode prcommon | prnode prnode prnode per-process |

lwp +--+ +--+ | as +--+ cred +--+ psinfo +--+ ... file objects |

/ | | | | | | | | | | | |

/ +--+ +--+ | +--+ +--+ +--+ |

/ prnode prcommon +------------------------------------------------------+

+--+ +--+

\ | | | |

\ +--+ +--+

\

+-------------------------------------------------------------------------------+

| prnode prnode prnode prnode per-lwp |

| lwpctl +--+ lwpinfo +--+ lwpstatus +--+ lwpusage +--+ ... file objects |

| | | | | | | | | |

| +--+ +--+ +--+ +--+ |

+-------------------------------------------------------------------------------+

图2. prnode和prcommon结构定义

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

每个进程有自己的主/proc vnode(就是说这个vnode对应/proc/文件),进程中

每个LWP有自己的vnode对应/proc//lwp/文件,参看图3。

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

回指到proc结构

<-------------+

prnode prcommon |

+-------------+ +->+-------------+ +->+----------+ procdir |

| proc | | | pr_next ----|--+ | | prc_slot ---->+---------+ |

| structure | /proc | | pr_common --|--|-+ +----------+ | pe_proc --+

| +---------+ | /| | pr_files ---|--|----------------+ | pe_next |

| | | | vnode | | pr_vnode | | | +------

[1] [2] [3] 下一页

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有