|
OpenBSD可加载内核模块编程完全指南(13) error = ioctl(fd, ODREAD, &a); if (error == -1) err(1, "ioctl");
printf("%d %s", a.value, a.msg); close(fd); exit(0); }
首先它读取存在的值,然后自己替换掉.最后它读取这个新的值并且打印出来,用来确定它们替换成功.
编译测试程序:
[e4gle@openbsd29]# gcc -o chardevtest chardevtest.c [e4gle@openbsd29]#
运行: [e4gle@openbsd29]# ./chardevtest 13 hello world! 42 cows [e4gle@openbsd29]#
再用dd命令看看现在的内部字符应该是'cows'了.
★虚拟文件系统模块
增加一个虚拟文件系统是非常简单的.假如你要开发一个新的文件系统或者支持现存的文件系统,就需要写一个模块作为接口.同样的,假如需
要调试已经存在的文件系统,也需要那样 一个接口.必须确定你的内核不支持目标文件系统.
一个虚拟文件系统的模块的结构应该象如下定义:
struct lkm_vfs { MODTYPE lkm_type; int lkm_ver; char *lkm_name; u_long lkm_offset; struct vfsconf *lkm_vfsconf; };
和前面的例子差不多,我们也有个模块类型(LM_VFS),一个版本号,一个模块名和一个偏移值.在这个vfs模块的例子中,offset值是用不到的.
最后我们需要一个指向vfsconf结构 的指针,它包括了虚拟文件系统的操作向量以及一些其他信息(vfsconf结构在头文件/usr/include/sys/mount.h中定义). 此结构通过MOD_VFS宏来初始化:
MOD_VFS("nullfs", -1, &nullfs_vfsconf)
|