Chinaunix首页 | 论坛 | 博客
  • 博客访问: 177465
  • 博文数量: 30
  • 博客积分: 2010
  • 博客等级: 大尉
  • 技术积分: 440
  • 用 户 组: 普通用户
  • 注册时间: 2008-07-23 19:45
文章分类

全部博文(30)

文章存档

2016年(2)

2010年(3)

2009年(8)

2008年(17)

我的朋友

分类: LINUX

2008-07-27 22:35:58

所谓内核模块是Linux内核向外部提供的一个接口,其全称为动态可加载内核模块(Loadable Kernel Module,LKM),简称模块。
   一个模块程序的结构:
       --模块加载函数(必须有)
       --模块卸载函数(必须有)
       --模块许可证声明(必须有)
       --模块参数(可选)
       --模块到处符号(可选)
       --模块作者,版本等信息声明(可选)
也就是说一个最简单的模块必须包含三部分,如何编写一个模块,让我们从一个简单的例子开始吧:Hello World(基本上每个资料都是从它开始)。

//开始
#include
#include

static int hello_init(void)  //static 可以不要,此函数为模块的入口点
{
    printk(KERN_ALERT "hello_world enter\n");
    return 0;
}
static void hello_exit(void)  //出口函数,当模块卸载时会调用它
{
   printk(KERN_ALERT "hello world exit\n");
}       //无需返回

module_init(hello_init);
       //宏调用,#define module_init(x) _initcall(x);
       //见内核源码:
module_exit(hello_exit);//同样为宏调用

MODULE_LICENSE("Dual BSD/GPL");//许可证声明
       //可选项,作者名字
MODULE_AUTHOR("YOUR NAME");
      //结束

一个简单的模块代码结束了。然后在为其编写一个Makefile,注意这里必须是Makefile!而不是makefile
Makefile 文件如下:

# Makefile 2.6
obj-m += hello.o
KDIR:=/usr/src/$(shell uname -r)
all:
        make -C $(KDIR) M=$(PWD)modules
#结束

obj-m := hello.o表示编译后生成hello.o模块。
$(KDIR) 指定了内核源码的路径,“M=”表示这是个外部模块,M=$(PWD)modules 指定了该模块文件所在的路径。
注: Makefile预定义了$(PWD)变量(
# PWD=$(shell pwd)),此处可以不必重复定义。
到此为至条件已经成熟,就差编译了,编译过程如下:
$make
$sudo insmod hello.ko                       //加载
  (注意这里是:hello.ko 虽然你写的是hello.o )
$sudo rmmod hello.ko                      //卸载






阅读(1561) | 评论(1) | 转发(0) |
0

上一篇:没有了

下一篇:cdev结构

给主人留下些什么吧!~~

chinaunix网友2008-07-30 12:36:13

用简明扼要的语言,解释了内核模块以及应用。