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
浙公网安备 33010602011771号