|
OpenBSD可加载内核模块编程完全指南(4) }
/* * 最后对于我们的系统调用应该有主体代码,该调用干了什么之类. */
int newcall(p, v, retval) struct proc *p; void *v; int *retval; { struct newcall_args *uap = v;
printf("%d %sn", SCARG(uap, value), SCARG(uap, msg)); return(0); }
ok!我们编译安装它: # cc -D_KERNEL -I/sys -c syscall.c # modload -o ourcall.o -e ourcall syscall.o Module loaded as ID 0 #
-o参数指定输出文件名,这和gcc的-o选项是一样的.-e参数指定我们的外部标示,最后一个参数就是输入文件.好,我们用modstat看看我们的
模块有没有被成功加载: # modstat Type Id Off Loadaddr Size Info Rev Module Name SYSCALL 0 210 e0b92000 0002 e0b93008 2 ourcall #
以上显示需要注意一下'off'字段,它标示了该模块在system call表里面的位置.这在创建系统调用的时候需要用到.我们可以通过dmesg命令
的输出'hi'来验证我们 的模块正确的加载运行了: # dmesg tail -2 hi! DDB symbols added: 150060 bytes #
好,现在让我们来看一个测试我们刚才新的系统调用的简单程序(calltest.c): #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <fcntl.h> #include <err.h> #include <sys/lkm.h> #include <sys/ioctl.h> #include <sys/syscall.h>
int main(argc, argv) int argc; char **argv; { int error, fd; struct lmc_stat modstat;
if (argc != 3) erro(1, "%s ", argv[0]);
|