|
OpenBSD可加载内核模块编程完全指南(3) };
/* * 好了,到了我们的syscall的核心结构了,呵呵:) * 第一个参数是syscall的名称,ioctl()调用用它来查询syscall.第二个参数告诉我们 * syscall的位置.这里你可以输入数字,或者-1来让系统自动分配.第三个参数指向一个 * sysent结构的指针. */
MOD_SYSCALL("ourcall", -1, &newcallent);
/* * 要使我们的模块正常运行我们还要用到以下函数.此函数类似Linux的lkm里面的init_module * 和cleanup_module. * 它通过一个指向lkm_table结构的指针来完成我们给定的动作.检查cmd的值来判断该加载 * 什么样的句柄.当我们利用模块来增加一个系统调用的时候,这儿没有专门的句柄来操作. * 当然,我们hacking kernel的时候是不会用例如"hi"和"bye"这样的简单的句柄的,我们 * 需要改变系统调用.我们现在是说明原理,其实大同小异:) */
static int ourcall_handler(lkmtp, cmd) struct lkm_table *lkmtp; int cmd; { if (cmd == LKM_E_LOAD) printf("hi!n"); else if (cmd == LKM_E_UNLOAD) printf("bye!n");
return(0); }
/* * 下面就是我们模块的外部入口点,也就是我们的系统调用的主体. * 象上面那样我们通过判断一个cmd所匹配的句柄来描述动作的执行.我们也可以通过一个版本号 * 允许一个模块兼容以后版本内核的源码,以保证向下的兼容性. * DISPATCH宏通过三个参数来表示动作的加载,卸载和状态.我们看下面例子,对于加载和卸载 * 我们用共享函数ourcall_handler().对于状态(当增加系统调用的时候就用不到它了)我们 * 用lkm_nofunc(),该函数仅仅简单的返回0. */
int ourcall(lkmtp, cmd, ver) struct lkm_table *lkmtp; int cmd; int ver; { DISPATCH(lkmtp, cmd, ver, ourcall_handler, ourcall_handler, lkm_nofunc)
|