chenyuren

导航

RHEL 5.1 模块编程

 

1. RHEL 5.1已经安装好了“内核树”:

<1>. 用" uname -r " 查看内核版本:

<2>. 内核树的位置:

<3>. “/lib/modules” 目录下有 2.6.18-53.el5 :

 

2. 模块源代码

    在 /home 目录下建立一个“david”目录,用于保存模块源代码。

3. “Hello World”模块实验:

     在 /home/david 目录下创建2个文本文件 hello.c Makefile

//hello.c


#include <linux/init.h>
#include <linux/module.h>
MODULE_LICENSE("Dual BSD/GPL");

static int hello_init(void)
{
printk(KERN_ALERT "Hello, world\n");
return 0;
}

static void hello_exit(void)
{
printk(KERN_ALERT "Goodbye, cruel world\n");
}

module_init(hello_init);
module_exit(hello_exit);


//Makefile 文件

obj-m := hello.o
KERNELDIR := /lib/modules/2.6.18-53.el5/build         #这里的“2.6.18-53.el5”,根据具体情况进行修改。
PWD := $(shell pwd)

modules:
  $(MAKE) -C $(KERNELDIR) M=$(PWD) modules

modules_install:
  $(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install

clean:

  rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions

# 注意 Tab 键的使用

 

用make 编译模块:

编译完成后就生成hello.ko等文件:

insmod hello.ko 命令加载hello模块,并用 “lsmod ”命令查看hello是否加载成功:

 rmmod hello 命令卸载模块,并用 “lsmod ”命令查看hello是否卸载成功:

注意:

1. 模块的加载和卸载必须使用超级用户

2. 模块的加载和卸载时控制台并没有显示“Hello, world”  “Goodbye, cruel world ” 打印信息,而是保存在“/var/log/messages ”日志文件中。

至此 全部工作都完成了。

补:

1. 再打开一个终端B(刚才make的那个不要关了,叫它A吧),像这样在B终端中[root@localhost ~]#tail -f /var/log/messages 

然后在A终端输入[root@localhost ~]#insmod ./hello.ko   哈哈在B终端是不是看到了localhost kernel:hello,world

然后在A终端输入[root@localhost ~]#rmmod hello          哈哈在B终端是不是看到了localhost kernel:Goodbye,Cruel world

 

posted on 2011-08-31 22:45  chenyuren  阅读(224)  评论(0)    收藏  举报