在FreeBSD
系统上,设备通信和控制主要通过sysctl
和ioctl
接口:
Generally, sysctls are employed to adjust parameters, and ioctls are used for everything else—that’s why ioctls are the catchall of I/O operations.
ioctl
比较简单,不在这里赘述。
要在kernel
模块中增加对sysctl
的支持,首先要调用sysctl_ctx_init
初始化一个sysctl_ctx_list
结构体(使用完,通过sysctl_ctx_free
来进行释放);然后使用SYSCTL_ADD_*
系列函数加入系统支持的参数。需要注意的是,SYSCTL_ADD_*
系列函数的第二个参数用来指定新加入参数属于哪个parent node
,可以使用下面两个macro
来指定其位置:SYSCTL_STATIC_CHILDREN
和SYSCTL_CHILDREN
(如果SYSCTL_STATIC_CHILDREN
没有参数,则会新增加一个系统的top-level category
)。
另外,SYSCTL_ADD_PROC
会增加一个处理函数。其参数是SYSCTL_HANDLER_ARGS
:
#define SYSCTL_HANDLER_ARGS struct sysctl_oid *oidp, void *arg1, \
intptr_t arg2, struct sysctl_req *req
arg1
指向sysctl
命令需要处理的数据,arg2
指向数据的长度。
参考资料:
FreeBSD Device Drivers。