Chinaunix首页 | 论坛 | 博客
  • 博客访问: 48030
  • 博文数量: 13
  • 博客积分: 1415
  • 博客等级: 上尉
  • 技术积分: 220
  • 用 户 组: 普通用户
  • 注册时间: 2006-12-24 14:46
文章分类

全部博文(13)

文章存档

2009年(4)

2008年(9)

我的朋友
最近访客

分类: BSD

2008-05-18 11:15:41

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:
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是否如我们所预期的那样工作:

阅读(717) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~