|
OpenBSD可加载内核模块编程完全指南(6) char *lkm_name; u_long lkm_offset; DEVTYPE lkm_devtype; union { void *anon; struct bdevsw *bdev; struct cdevsw *cdev; } lkm_dev; union { struct bdevsw bdev; struct cdevsw cdev; } lkm_olddev; };
首先我们需要一个模块的类型(这里是LM_DEV),然后是lkm的版本号,再就是它的名称和它在cdevsw[]或者bdevsw[]表中的位置
(lkm_offset).然后我们到了DEVTYPE定义的 lkm_devtype成员,它定义了我们设备的类型,或者是一个字符型设备或者是一个块设备,分别被LM_DT_CHAR或者LM_DT_BLOCK宏指
定.再下面定义了两个枚举类型的结构,在模 快被加载的时候分别定义了新的设备的操作空间以及保留了老的设备结构,此结构通过MOD_DEV宏来初始化: MOD_DEV("ourdev", LM_DT_CHAR, -1, &cdev_ourdev)
首先我们通过我们的模块名以及设备类型,在此例中我们得知我们创建的是一个字符型的设备.接下来需要在cdevsw[]中有个入口,就象上面
的系统调用的例子那样,-1代表我们可以 不去关心放置的确切位置,让系统自己去寻找可用的入口.如果没有空闲的入口,函数ENFILE ("Too many open files in system")将会被
返回.最后我们通过初始化cdevsw 结构来对我们的设备进行操作. 我们的字符设备将会支持四种操作:open,close,read和ioctl.不能干再多的事情了,它将存储一个字符串和一个数字,该数字可以被ioctl调用
设置和返回,字符串也可以用read 调用返回. 我们定义的内部结构如下:
#define MAXMSGLEN 100
struct ourdev_io { int value;
|