|
OpenBSD可加载内核模块编程完全指南(11) return 0; }
好了,最后我们可以用modload的-p参数来安装我们的设备模块,我可以写一个脚本来完成编译安装我们的设备的任务.脚本利用mknod在
/dev目录里面创建了一个设备,就叫 '/dev/ourdev'.在此安装脚本中,我们用模块号作为第一个参数,模块的类型作为第二个参数.如果模块是一个系统调用,我们还需要指定系统
调用号作为第三个参数这里,我 们的第三个参数是主设备号. 以下就是该安装脚本(dev-install.sh):
#!/bin/sh MAJOR=`modstat -n ourdev tail -1 awk '{print $3}'` mknod -m 644 /dev/ourdev c $MAJOR 0 echo "created device /dev/ourdev, major number $MAJOR" ls -l /dev/ourdev
好,开始安装. 首先编译源码: [e4gle@openbsd29]# gcc -D_KERNEL -I/sys -c chardev.c [e4gle@openbsd29]#
安装模块: [e4gle@openbsd29]# modload -o ourdev.o -eourdev -p ./dev-install.sh chardev.o Module loaded as ID 0 created device /dev/ourdev, major number 29 crw-r--r-- 1 root wheel 29, 0 Jul 10 05:16 /dev/ourdev [e4gle@openbsd29]#
看看日志确定模块是否被正常加载: [e4gle@openbsd29]# dmesg tail -2 loading module ourdev DDB symbols added: 140232 bytes [e4gle@openbsd29]#
好,我们测试一下我们新创建的设备,用dd命令来测试: [e4gle@openbsd29]# dd if=/dev/ourdev of=/dev/fd/1 count=1 bs=100 hello world! 1+0 records in 1+0 records out 100 bytes transferred in 1 seCS (100 bytes/sec) [e4gle@openbsd29]#
现在我来通过一个测试程序来测试一下我们的ioctl调用是否工作.测试程序必须包括模块代码和头文件common.h:
#define MAXMSGLEN 100
struct ourdev_io { int value; char msg[MAXMSGLEN]; };
#define ODREAD _IOR('O', 0, struct ourdev_io) #define ODWRITE _IOW('O', 1, struct ourdev_io)
#ifdef _KERNEL
/* open, close, read, ioctl */ #define cdev_ourdev_init(c,n) { dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), (dev_type_write((*))) lkmenodev, dev_init(c,n,ioctl),
|