|
OpenBSD可加载内核模块编程完全指南(14) 我们看看上面的代码,第一个参数是我们的模块名,第二个参数offset,这个参数在我们的vfs模块中无关紧要(前面说过,可以不用).最后一个参
数是我们的文件系统的结构. 在你的模块的外部接口中,你必须调用vfs_opv_init_eXPlicit和vfs_opv_init_default来分配和初始化默认操作向量.因为文件系统被编译
进内核,所以通过定义在 /usr/src/sys/kern/vfs_conf.c里的vfs_opv_desc[]来在系统启动的时候装载.
一个需要注意的是当用需要用ld程序来链接多个源代码文件来为modload提供目标文件时,你必须用-r标记来创建一个可重定位的目标文件.
因为modload在把你的模块链接进 内核的同时需要用到ld程序.可以用modload的-d标记来察看ld运行的内部参数. 这儿是一个fs模块的完整代码 (nullmod.c):
#include <sys/param.h> #include <sys/ioctl.h> #include <sys/systm.h> #include <sys/conf.h> #include <sys/mount.h> #include <sys/exec.h> #include <sys/lkm.h> #include <sys/file.h> #include <sys/errno.h>
/* * 文件系统的操作结构 * 参考:/usr/src/sys/miscfs/nullfs/ */
extern struct vfsops null_vfsops; extern struct vnodeopv_desc null_vnodeop_opv_desc;
struct vfsconf nullfs_vfsconf = { &null_vfsops, MOUNT_NULL, 9, 0, 0, NULL, NULL };
/* * 声明我们的模块结构,通过我们文件系统的模块名,offset和初始的vfsconf结构 */
MOD_VFS("nullfs", -1, &nullfs_vfsconf)
/* * 我们的外部接口.我们初始化文件系统并且用到了DISPATCH宏,在此例中没有用到句柄 */
int nullfsmod(lkmtp, cmd, ver) struct lkm_table *lkmtp; int cmd; int ver; { vfs_opv_init_explicit(&null_vnodeop_opv_desc); vfs_opv_init_default(&null_vnodeop_opv_desc);
DISPATCH(lkmtp, cmd, ver, lkm_nofunc, lkm_nofunc, lkm_nofunc) }
好,编译安装它: (一些其他的附加代码在/usr/src/sys/miscfs/nullfs里)
[e4gle@openbsd29]# gcc -D_KERNEL -I/sys -c null_subr.c
|