procfs(/proc文件系统);sysctl(/proc/sys目录);sysfs(/sys文件系统)
==============================================================================
内核通过各种不同的接口吧内部信息输出到用户空间。其中有3个特殊接口(在这之中有2个虚拟文件系统)
procfs(/proc文件系统)
这是一个虚拟文件系统,通常mount在/proc,允许内核以文件的形式向用户空间输出内部信息。这些信息并没有实际存在于磁盘中。
网络代码注册文件位于/proc/net,在系统引导或模块加载时进行注册
sysctl(/proc/sys目录)
此接口允许用户空间读取or修改内核变量的值。注意:不是所有的变量在此接口都是可见的。可以通过两种方式访问sysctl输出的变量:
1.sysctl系统调用
2.procfs:当内核支持procfs时,会在/proc目录下添加一个特殊目录/proc/sys,为每个由sysctl输出的内核变量引入一个文件。
/proc/sys目录下的文件实际上就是一个个内核变量;内核变量定义了在/proc/sys目录下的路径;定义了文件名;定义了访问权限。有些变量内容是在引导期间静态定义的;其他的则是运行期间添加的(例如模块新功能、模块加载卸载)。。
/proc/sys目录下的文件和目录都是基于ctl_table结构定义的;ctl_table结构实例的注册和除名是通过register_sysctl_table、unregister_sysctl_table函数完成的。
struct ctl_table
{
int ctl_name; /* Binary ID */ //###结点标识,同一层的结点用不同的数字来标识
const char *procname; /* Text ID for /proc/sys, or zero */ //###/proc/sys目录下的文件名
void *data; //###实际的系统参数在内核中的数据结构
int maxlen; //###内核变量的尺寸大小
mode_t mode; //###/proc/sys目录下对应文件的访问权限
ctl_table *child; //###子结点的clt_table结构指针
proc_handler *proc_handler; /* Callback for text formatting */ //###对/proc/sys下面的文件读写的时候将调用这个例程
ctl_handler *strategy; /* Callback function for all r/w */ //###用sysctl读写系统参数时候,将调用这个例程
//###根据文件关联的变量种类而定,proc_handler、strategy的初始化会不同;
//###初始化proc_handler的函数:proc_dostring、proc_dointvec、proc_dointvec_minmax等等
//###初始化strategy的函数:sysctl_string、sysctl_intvec等等
struct proc_dir_entry *de; /* /proc control block */ //###指向在/proc/sys中的结点(proc文件系统数据结构)
void *extra1; //###2个可选参数,通常用于蒂尼变量的最大值和最小值
void *extra2; //###例如ip_local_port_range文件使用这2个指针限定了port的范围
};
sysfs(/sys文件系统)
这是一种相对较新的文件系统,sysctl所输出的部分信息被移植到sysfs。
-------------------------------------------------------------------------
procfs:主要输出只读数据;
sysctl:大多数sysctl信息都是可读可写的。
procfs:输出相对复杂的数据结构,或者有特使格式要求时,使用procfs
sysctl:输出简单的内核变量or数据结构关联的一些文件