|
OpenBSD可加载内核模块编程完全指南(5) modstat.name = "ourcall"; fd = open("/dev/lkm", O_RDONLY); if (fd == -1) err(1, "open");
error = ioctl(fd, LMSTAT, &modstat); if (error == -1) err(1, "ioctl");
printf("syscall no: %lun", modstat.offset);
error = syscall(modstat.offset, atoi(argv[1]), argv[2]); if (error == -1) err(1, "syscall"); exit(0); }
注意我们是怎么从module的modstat结构来利用ioctl调用获得syscall的偏移量的.一般的用户权限是不允许访问/dev/lkm设备的,同样,
我们也可以从modstat来获得象以上那 样的信息. 所以我们的程序需要一个整数和字符串参数提交给新系统调用,好,编译运行我们的程序:
# cc -o calltest calltest.c # ./calltest 4 beers syscall no: 210 # dmesg tail -1 4 beers #
我们用unloadmod来卸载内核模块: # modunload -n ourcall #
再用dmesg命令可以看出我们的模块被成功卸载了: # dmesg tail -1 bye! #
好,现在让我们来看看设备驱动的编写. ★设备驱动程序模块
设备驱动模块和系统调用的模块的编写方法有很大的相同之处.他们有一个外部入口点,且句柄关联着特殊的模块代码.在下面的这段特殊的模
块代码会直接操作我们的设备.在这个 例子中我们简单的演示了一个字符设备的例子,只能支持open,close,read和ioctl操作.在我们剖析它的内部机理之前,让我们先来看看lkm
是如何来解释设备的.
下面这段代码定义了一个可加载的设备驱动:
struct lkm_dev { MODTYPE lkm_type; int lkm_ver;
|