续《linux的netlink机制》:其实只要同时提供实现一个内核netlink的内核模块和一个定制用户策略的用户空间netlink程序,你就可以完全控制linux内核了,这里内核的netlink就是机制,而用户的netlink就是策略,正好一套,这样的机制是在太棒了,把自己的机制和策略用netlink随意往linux里面插,linux竟然成了一个舞台了,实际情况就是这样的。

linux中不乏用户空间与内核空间的通信的机制,比如netlink,procfs,sysctl,/dev下的设备驱动,当然还有更xx的系统调用。其实这些都是机制和策略的结合,内核实现的是机制,而用户实现的是策略,在代码表现上,一般都是一套代码,也就是一套程序,用户空间的策略控制程序和内核空间的机制代码逻辑,内核空间傻傻的为用户服务,它只知道来命令就做事而根本不管是什么命令以及这个命令达到了什么效果,这就是linux,机制和策略分离,很好很强大。前面分析了netlink,其实正如《linux的netlink机制》说的,netlink必须提供一套程序才会发挥作用,一个机制一个策略,那么sysctl当然也是这样的,在linux中有sysctl机制,它可以控制和改变内核中的变量,然后各个模块可以根据这些变量的值来采取不同的行为,这些变量就好像开关一样负责内核中一些重要机制的开关和微调。
在内核中sysctl机制的实现十分简单,和linux内核的大多数机制一样,采用先注册后使用的方式,只要你register了一个sysctl的实体,那么在用户空间你就可以控制你注册的实体变量了,然后在内核中你就可以用这些变量,根据这些变量的不同值来采取不同的动作,内核中的sysctl实现根本不涉及任何用户策略方面的东西,仅仅是注册,具体如何使用,那纯粹是用户设计该sysctl实体时要考虑的事情。下面就是一个例子:
static struct ctl_table zhaoya_test[] = {