kld接口允许系统管理员从运行的系统中动态地添加和删除功能。
这允许设备驱动程序的编写者将他们的新改动加载到运行的内核中,
而不用为了测试新改动而频繁地重启。
kld接口通过下面的特权命令使用:
kldload
- 加载新内核模块
kldunload
- 卸载内核模块
kldstat
- 列举当前加载的模块
内核模块的程序框架
/* * KLD程序框架 * 受Andrew Reiter在Daemonnews上的文章所启发 */#include <sys/types.h>#include <sys/module.h>#include <sys/systm.h> /* uprintf */#include <sys/errno.h>#include <sys/param.h> /* kernel.h中用到的定义 */#include <sys/kernel.h> /* 模块初始化中使用的类型 *//* * 加载处理函数,负责处理KLD的加载和卸载。 */static intskel_loader(struct module *m, int what, void *arg){ int err = 0; switch (what) { case MOD_LOAD: /* kldload */ uprintf("Skeleton KLD loaded.\n"); break; case MOD_UNLOAD: uprintf("Skeleton KLD unloaded.\n"); break; default: err = EOPNOTSUPP; break; } return(err);}/* 向内核其余部分声明此模块 */static moduledata_t skel_mod = { "skel", skel_loader, NULL};DECLARE_MODULE(skeleton, skel_mod, SI_SUB_KLD, SI_ORDER_ANY);
FreeBSD提供了一个makefile包含文件,利用它你可以快速地编译
你附加到内核的东西。
SRCS=skeleton.cKMOD=skeleton.include <bsd.kmod.mk>
简单地用这个makefile运行make
就能够创建文件
skeleton.ko
,键入如下命令可以把它加载到内核:
# kldload -v ./skeleton.ko