- 论坛徽章:
- 0
|
工作一个多月了,一直很忙,而且接触的知识点也很零碎,没时间也没什么知识点需要整理,很长时间没更新blog了,前几天工作接触了一下/proc文件系统,长了点小经验,记录在此吧。
想要读写内核参数,可以有以下两种方法(不知道还有没有别的方法,暂时我知道的只有这两种):通过/proc文件系统或者利用sysctl系统调用。
一般情况下,利用读写/proc文件系统的方法更简单和方便一些,每种可调内核参数在/proc/sys下都表现为一个子目录,而这个目录下面的每个文件都相应的代表着内核单独的一个可调系统参数。我们想要修改可调内核参数,直接对这些文件进行读写就行了。
如果不使用上面的方法,我们还可以通过sysctl系统调用来实现相同的功能。
看过源代码,我们知道,struct ctl_table是相关的主要的数据结构。定义如下:
struct ctl_table
{
int ctl_name; /* Binary ID */
const char *procname; /* Text ID for /proc/sys, or zero */
void *data;
int maxlen;
mode_t mode;
struct ctl_table *child;
struct ctl_table *parent; /* Automatically set */
proc_handler *proc_handler; /* Callback for text formatting */
ctl_handler *strategy; /* Callback function for all r/w */
void *extra1;
void *extra2;
};
每个这样的数据结构,都对应了/proc/sys目录下的一项内核参数。
其中各字段的意义如下:
ctl_name: 唯一标识此表项的一个整数。
proc_name: 相对于/proc/sys目录下对应的参数名称。
data: 一个void *指针,指向与这个表项相关联的数据的指针。
maxlen: 可以读取或者写入data的最大字节数。eg:data指向的是一个int型参数,则maxlen一般为sizeof(int)。
mode: 文件的权限。
child: 如果此数据结构对应的表项为一目录,则chind是指向其子表项的指针。
parent: 同child,指向其所在目录对应的ctl_table。
proc_handler: 如果是通过/proc/sys文件读写内核运行时的参数,则执行此操作。
strategy: 如果是通过系统调用sysctl对内核参数进行读写,则调用此函数。
extra1和extra2可以指向处理这个表项时的任何补充数据。
-------
个人觉得,上面标红的地方还是很有用的。
下面分别简单说下这两个函数大概的执行流程:
proc_handler:
一般情况下,proc_handler指向proc_dostring(操作数为string)或者proc_dointvec(操作数为int)。
strategy:
sysctl ==> sys_sysctl ==> do_sysctl ==> parse_table ==> do_sysctl_strategy ==> ctl_table中strategy对应的操作。
有关这块的知识点还很多,这里只是记录了一下我工作时用到的内容,对没提到的知识点感兴趣的朋友再去google吧。
ps:刚参加工作,有点累,但是很充实,很庆幸找到了一个自己喜欢的工作,能接触到Linux内核和Tcp/Ip较多的问题。努力吧,前方的路还很远阿。
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/83905/showart_2099601.html |
|