整体概述
由于自己水平和精力有限,本篇博文只涉及如何使用的问题,不涉及讲解原理,如果有朋友对如何创建命令的原理感兴趣,可以自己进行探讨。
sysctl概述
在FreeBSD系统上,设备通信和控制主要通过sysctl和ioctl接口,也就是在用户层(shell)配置的方式,进行对底层驱动参数的一个设置。 具体使用方式例如: sysctl -A : 通过此命令查看系统当中都有那些可以配置的参数。 比如输入sysctl -A命令后有以下输出, a.b.c : 1 a.b.c是一种二进制的表示方式,1代表某个参数的值,当然也可以是字符类型或者结构体等。具体的后面遇到代码再讲解。 随后,如果我们输入sysctl a.b.c命令是查看该参数的值, 而sysctl a.b.c=2是将此参数的值进行修改,如果你看到有 0 -> 2的输出就代表值从0修改为了2,已经成功修改了。
sysctl例程感性认识
我们通过一个例程对怎么创建sysctl配置命令的有一个感官上的认识。如下
#include<sys/param.h>
#include<sys/module.h>
#include<sys/kernel.h>
#include<sys/systm.h>
#include<sys/sysctl.h>
static struct sysctl_ctx_list clist;
static struct sysctl_oid *poid;
static int i = 10;
static long j = 20;
static const char *c = "hello init";
static int
sysctl_procedure(SYSCTL_HANDLER_ARGS)
{
const char *buf = "sysctl_procedure call";
return sysctl_handle_string(oidp, buf, strlen(buf), req);
}
static int
sysctl_modevent(module_t mod_unused, int event, void *arg __unused)
{
int error = 0;
switch (event) {
case MOD_LOAD:
sysctl_ctx_init(&clist);
poid = SYSCTL_ADD_NODE(&clist, SYSCTL_STATIC_CHILDREN(), OID_AUTO,
"top", CTLFLAG_RW, 0, "tree top");
if (poid == NULL) {
printf("SYSCTL_ADD_NODE failed\n");
return EINVAL;
}
SYSCTL_ADD_LONG(&clist, SYSCTL_CHILDREN(poid), OID_AUTO,
"long", CTLFLAG_RW, &j, 0, "creat long leaf");
SYSCTL_ADD_INT(&clist, SYSCTL_CHILDREN(poid), OID_AUTO,
"int", CTLFLAG_RW, &i, 0, "creat int leaf");
poid = SYSCTL_ADD_NODE(&clist, SYSCTL_STATIC_CHILDREN(poid), OID_AUTO,
"node", CTLFLAG_RW, 0, "tree node");
if (poid == NULL) {
printf("SYSCTL_ADD_NODE failed\n");
return EINVAL;
}
SYSCTL_ADD_PROC(&clist, SYSCTL_CHILDREN(poid), OID_AUTO,
"proc", CTLFLAG_RD, 0, 0, sysctl_procedure, "A", "creat proc leaf");
poid = SYSCTL_ADD_NODE(&clist, SYSCTL_STATIC_CHILDREN(_debug), OID_AUTO,
"top", CTLFLAG_RW, 0, "tree node");
if(poid == NULL) {
printf("SYSCTL_ADD_NODE failed\n");
return EINVAL;
}
SYSCTL_ADD_STRING(&clist, SYSCTL_CHILDREN(poid), OID_AUTO,
"string", CTLFLAG_RD, c, 0, "new string leaf");
printf("module loaded\n");
break;
case MOD_UNLOAD:
if (sysctl_ctx_free(&clist)) {
printf("sysctl_ctx_free failed.\n");
return -1;
}
printf("module unloaded\n");
break;
default:
error = -1;
break;
}
return error;
}
static moduledata_t sysctl_mod = {
"sysctl_modevent",
sysctl_modevent,
NULL
};
DECLARE_MODULE(sysctl_modevent, sysctl_mod, SI_SUB_EXEC, SI_ORDER_ANY);
makefile:
动态创建sysctl宏总结
SYSCTL_STATIC_CHILDREN 宏
SYSCTL_CHILDREN宏
sysctl接口的简单使用
devlink概述
后面在补齐。
|