博文

目前显示的是标签为“sysctl”的博文

使用sysctl

前面说到的内核模块参数是在加载模块时使用,而这次我们要说一种在模块加载后修改数据的方法,其是基于后期要说到的procfs而设计的,它是应用程序设置和获取运行时内核配置参数的一种方法,一般相应的参数对应/proc/sys目录,除了使用系统内置的sysctl工具操作,也可直接对/proc/sys目录下的结点直接操作。 对于sysctl会使用到如下函数来注册和释放: 1.注册sysctl struct ctl_table_header *register_sysctl_table(struct ctl_table *table) ; 2.释放sysctl void unregister_sysctl_table(struct ctl_table_header * header) ; 这两个函数在fs/proc/proc_sysctl.c中实现,在include/linux/sysctl.h中声明,从两人函数可以看到两者是通过ctl_table_header结构体连通的,该结构体不详说,接下来看看ctl_table这个结构体,在include/linux/sysctl.h有如下内容: struct ctl_table { const char *procname; /* Text ID for /proc/sys, or zero */ void *data; int maxlen; umode_t mode; struct ctl_table *child; /* Deprecated */ proc_handler *proc_handler; /* Callback for text formatting */ struct ctl_table_poll *poll; void *extra1; void *extra2; }; 其中,procname对应/proc/sys目录下显示的名称,data对应该节点在内核中的变量,maxlen为条目的最大长度(即当对应变量为字符串时,该字条串的长度,超过部分截掉),mode为在/proc/sys对应节点的访问权限(与《模块参数》里说到的八进制数一致,当该ctl_...