设为首页  
联系我们  
加入收藏  
网页制作 冲浪宝典 图形图像 操作系统 软件教学 编程开发 认证考试 安全技术 站长专区 文学驿站 娱乐天地 游戏天地 办公软件
文章搜索
您的位置: 首页 >> 文章首页 >> 操作系统 >> OpenBSD >> OpenBSD可加载内核模块编程完全指南
精品推荐
OpenBSD点击TOP10
·Free BSD,Linux之比较
·freebsd VPN 搭建
·freebsd系统时间同步及ntp服务的提供
·freebsd ipf+ipnat+ipfw建立带流量控制的透明网关
·FreeBSD的配置
·ipf+ipnat+ipfw建立带流量控制的透明网关
·POSTFIX下的反垃圾反病毒邮件系统
·FreeBSD 5.2.1R Web Server架设实例过程
·OpenBSD可加载内核模块编程完全指南
·FreeBSD+IPFILTER实现整网(N个Vlan)透明代理上网
操作系统点击TOP10
·Windows Vista完全硬盘安装法
·Windows Vista 激活不求人
·Windows Vista局域网网络连接设置
·Windows Vista系统动态桌面截图欣赏
·Windows XP中磁盘的分区应用
·Windows NT/2000/XP 出现蓝屏并显示“STOP 0x0000007f”错误
·让Windows XP变身Vista
·一招搞定Vista系统软件不兼容问题
·教你如何正确配置和优化Windows Vista
·只转两圈 加快Windows XP启动速度
精选专题

OpenBSD可加载内核模块编程完全指南

作者: 来源:网络文章 时间:2005-12-13 0:45:31

OpenBSD可加载内核模块编程完全指南(2) 了一个指向结构sysent的模块框架
我们将用MOD_SYSCALL宏来安装它:

MOD_SYSCALL("ourcall", -1, &newcallent)

我们来分析一下上面的宏,很明显,模块名为"ourcall",用来标示模块,还有一个作用就是我们利用modstat命令时会显示出来.-1代表我们

的syscall该插入的位置,在这个
宏当中的-1的意思是我们不用关心位置具体在什么地方,它会被分配到一个空的位置.最后一个字段newcallent是一个指向sysent的结构,

它包含了我们系统调用的相应的数
据.
除此之外我们还需要一个句柄用来加载和卸载内核模块,好,在这个例子中我用'hi'来加载,用'bye'来卸载.这对我们调试程序很有帮助.句柄可

以是相同的函数或者单个函数,
如果没有定义句柄,那么lkm_nofunc()会简单的返回0,这个模块是没有加载卸载的,也就失去了作用.

我们模块的外部入口点是ourcall():

int
ourcall(lkmtp, cmd, ver)
        struct lkm_table *lkmtp;
        int     cmd;
        int     ver;
{
        DISPATCH(lkmtp, cmd, ver, ourcall_handler, ourcall_handler, lkm_nofunc)
}

这个句柄可以用来加载,卸载模块.第四个参数我们用作加载操作,第五个参数用作卸载操作,第六个参数是状态函数(在此例中没有用到).
ok!完整的系统调用模块代码如下(syscall.c):

#include <sys/param.h>
#include <sys/systm.h>
#include <sys/ioctl.h>
#include <sys/cdefs.h>
#include <sys/conf.h>
#include <sys/mount.h>
#include <sys/exec.h>
#include <sys/lkm.h>
#include <sys/proc.h>
#include <sys/syscallargs.h>


/* 定义我们自己的系统调用原型 */
int     newcall __P((struct proc *p, void *uap, int *retval));

/*
* 所有的系统调用都有三个参数: 一个指向proc结构的结构指针,一个空指针指向参
* 数本身和一个返回指针.下面,我们定义这些参数的结构.如果你只有一个参数,则
* 只需要一个入口就可以了.
*/

struct newcall_args{
        syscallarg(int) value;
        syscallarg(char *) msg;
};

/*
* 下面这个结构定义了我们的系统调用.第一个参数是系统调用的参数数目,第二个参数
* 是参数的大小,第三个参数是我们的系统调用的代码了,呵呵:)  
*/

static struct sysent newcallent = {
        2, sizeof(struct newcall_args), newcall

1.OpenBSD可加载内核模块编程完全指南(1)
2.OpenBSD可加载内核模块编程完全指南(2)
3.OpenBSD可加载内核模块编程完全指南(3)
4.OpenBSD可加载内核模块编程完全指南(4)
5.OpenBSD可加载内核模块编程完全指南(5)
6.OpenBSD可加载内核模块编程完全指南(6)
7.OpenBSD可加载内核模块编程完全指南(7)
8.OpenBSD可加载内核模块编程完全指南(8)
9.OpenBSD可加载内核模块编程完全指南(9)
10.OpenBSD可加载内核模块编程完全指南(10)
11.OpenBSD可加载内核模块编程完全指南(11)
12.OpenBSD可加载内核模块编程完全指南(12)
13.OpenBSD可加载内核模块编程完全指南(13)
14.OpenBSD可加载内核模块编程完全指南(14)
15.OpenBSD可加载内核模块编程完全指南(15)
16.OpenBSD可加载内核模块编程完全指南(16)
17.OpenBSD可加载内核模块编程完全指南(17)
18.OpenBSD可加载内核模块编程完全指南(18)
19.OpenBSD可加载内核模块编程完全指南(19)
共19页 9 7 [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] [16] [17] [18] [198 :>

OpenBSD可加载内核模块编程完全指南 相关文章:
OpenBSD可加载内核模块编程完全指南 相关软件:
特别声明:本站除部分特别声明禁止转载的专稿外的其他文章可以自由转载,但请务必注明出处和原始作者。文章版权归文章原始作者所有。对于被本站转载文章的个人和网站,我们表示深深的谢意。如果本站转载的文章有版权问题请联系编辑人员,我们尽快予以更正。
转载请注明来源:http://www.xgdown.com