NetBSD LKM简单分析

2009-05-13 07:14:39来源:未知 阅读 ()

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


http://bbs.chinaunix.net/viewthread.php?tid=826619&highlight=gvim


NetBSD LKM简单分析
gvim: chinaunix.net
由于需要内核模块的相关知识,打算在Linux和BSD之中选取一个系统作为分析之用。翻了翻,觉得代码有点混乱(当然,我也不知道这本书是用的哪个Linux内核版本作为例子)。于是昨天花了一下午把NetBSD的LKM结构梳理了一下,发现LKM这个东西其实很简单。下面我把我整理的东西开放出来,供大家参考。
我不清楚NetBSD的LKM机制和FreeBSD、Linux之间的实现差异,希望有熟悉FreeBSD、Linux的朋友可以做出比较。
首先以一个实例说明LKM怎样使用,接着讲述LKM的实现机理,最后结合代码看看具体实现。
1 lkm的简单示例
我们首先以一个简单示例说明LKM怎样使用,所以这个例子越简单越好。因此我用sys/lkm/syscall/example中的例子作为讲解之用。(为了方便起见,本文把这个路径简称为$exam)
为了生成可供操作的二进制代码,可以在$exam目录中直接执行make(需要管理员权限,下面除特殊说明外,都是以管理员权限操作)。该目录中有example_syscall.c 和lkminit_syscall.c 两个文件。Lkminit_syscall.c是LKM的入口,而example_syscall.c当然是我们期望的系统调用本身。先把lkminit_syscall的实现细节放在一边,看看example_syscall.c中的内容:
CODE:
[Copy to clipboard]
Int example_syscall(struct lwp *l, void *uap, register_t retval[])
{
         printf( "I am a loaded system call using the kernel printf!\n");
         printf( "I will print this message each time I am called!\n");
         return (0);     /* success (or error code from errno.h)*/
}
简单可以认为,只要执行了我们期望的该系统调用,它就会在控制台上打印出两行话。系统调用本身又可以另开一篇讲解,因此这里不打算深入系统调用的实质。
Ok,看看LKM是否如我们所预期的那样工作:
QUOTE:
gvim# cd $exam
gvim# make   # make之后会将连接出一个名为syscall_example.o的目标文件
gvim# modload syscall_example.o # 注意最后的.o要一起提供
Sample Loaded system call
Copyright (c) 1993 Terrence R. Lambert
All rights reserved
Module loaded as ID 0
这个时候,模块就已经被插入内核,并且告诉你模块号是0。以上输出很有意思,如果你的控制台有彩色的话,可以看见下面的颜色。可见,前三句是内核的输出(因此用彩色表示,该色彩可以在conf/GENERIC中调节),最后一句是输出在用户层,所以是常色显示。如果你现在不能猜到原因,我会在后面解释。

标签:

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

上一篇:freebsd下安装JDK

下一篇:制作嵌入式芯片s3c2410板卡的NetBSD启动镜像