初识LKM

2009-05-13 03:53:12来源:未知 阅读 ()

新老客户大回馈,云服务器低至5折

LKM即loadable kernel module,在现代计算机操作系统中非常流行,如LINUX、FREEBSD等(甚至包括WINDOWS)[1]。它的最大好处是扩增KERNEL功能而不需要重新编译KERNEL,更不需要重启系统。LINUX和FREEBSD的大部分驱动都可以以LKM方式编译,但很奇怪的是,LKM在NETBSD上却非常不流行,目前几乎没有以LKM方式编译的驱动(在pkgsrc中我只发现4个,其中一个在wip中)。
NetBSD的LKM设计初衷是兼容SunOS的LKM。LKM的操作是通过对/dev/lkm进行ioctl,不过现在绝大部分操作都可以通过modload(8),modunload(8),modstat(8)进行,程序员应该不会遇到需要直接操作/dev/lkm的情景。
LKM需要在kernel编译时加入option LKM选项。编译LKM模块需要安装sys源代码。
模块类型:
System Call modules:
所有的系统调用都可被替换,但要小心ioctl,因为modload和modunload模块需要调用该函数。
当模块卸载后,被替换的系统调用会恢复到系统调用表中原有的值(该系统调用表由模块提供)。
Virtual File System modules:
虚拟文件系统也可以通过LKM加载。
Device Driver modules:
块设备和字符设备。注意对应的设备需要手动加入/dev中。
Emulation modules:
对其它操作系统的模拟支持。
Execution Interpreters:
提供新的二进制代码格式,通常与Emulation modules联合使用。
Miscellaneous modules:
自由发挥的模块。
每个模块都需要提供一个入口函数,该函数在模块需要链接的时候传递给modload调用的ld(1)。默认入口函数为xxxinit(...)。若找不到xxxinit,则寻找modulename_lkmentry(...)。modulename即指定的模块名(生成的模块文件名去掉.o)。
一般入口函数内会有一个DISPATCH宏调用,以指定模块在载入、卸载和查询状态时调用的函数。
下面我们实现一个简单的hello world LKM。
1、Makefile
MKMAN=          no
KMOD?=          helloworld
SRCS=           main.c
load:
        sudo modload $(KMOD).o
unload:
        sudo modunload $(KMOD)
.include
2、main.c
include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
/* init routine */
int xxxinit(struct lkm_table *, int, int);
static int hello_handle(struct lkm_table *lkmtp, int cmd);
MOD_MISC("helloworld");
int xxxinit(struct lkm_table *lkmtp, int cmd, int ver){
    DISPATCH(lkmtp, cmd, ver, hello_handle, hello_handle, hello_handle);
}
static int hello_handle(struct lkm_table *lkmtp, int cmd){
    switch (cmd) {
        case LKM_E_LOAD:
            if (lkmexists(lkmtp))
                return (EEXIST);
            log(LOG_KERN | LOG_DEBUG, "helloworld: driver loaded successfully\n");
            break;
        case LKM_E_UNLOAD:

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:关于Qmail对列(queue)故障的处理

下一篇:FreeBSD系统结构手册