Chinaunix首页 | 论坛 | 博客
  • 博客访问: 388313
  • 博文数量: 80
  • 博客积分: 1750
  • 博客等级: 上尉
  • 技术积分: 1380
  • 用 户 组: 普通用户
  • 注册时间: 2011-11-13 11:35
文章分类
文章存档

2014年(3)

2013年(1)

2012年(54)

2011年(22)

分类: C/C++

2012-09-13 10:09:52


      在RHEL6.0 x86_64系统上实现完成内核模块的编译、插入、删除。

      以下是我的第一个模块的程序:
  1. #include <linux/module.h>
  2. #include <linux/kernel.h>
  3. #include <linux/init.h>

  4. char *name=NULL;
  5. module_param(name,charp,S_IRUGO);
  6. static int __init hello_init(void)
  7. {

  8.         printk("----%s\n", name);
  9.         printk("<1>Hello, I come!....\n");
  10.         return 0;
  11. }

  12. static void __exit hello_exit(void)
  13. {
  14.         printk("<1>GoodBye, I go!....\n");
  15. }

  16. module_init(hello_init);
  17. module_exit(hello_exit);
  18. MODULE_LICENSE("GPL");
该模块在插入的时候可以传递参数 ,不想传参数仅需注释
  1. char *name=NULL;
  2. module_param(name,charp,S_IRUGO);
  3. printk("----%s\n", name);
要注意添加MODULE_LICENSE("GPL")否则编译回报错

编写相应的Makefile文件,这个文件名是固定的。

  1. obj-m := hello.o
  2. CURRENT_PATH := $(shell pwd)
  3. LINUX_KERNEL := $(shell uname -r)
  4. LINUX_KERNEL_PATH := /usr/src/kernels/$(LINUX_KERNEL)

  5. all:
  6.     make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) modules
  7. clean:
  8.     make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) clean
要严格注意格式,否则很容易出错,make之前是一个空格
第一行指定内核模块的名称
第二行指出生成模块的位置
第三行找到内核所处的位置

接下来就可以通过make命令运行Makefile文件,若没有报错则会生成很多文件,其中hello.ko就是目标模块

插入模块必须有root权限,所以以root身份运行
#insmod hello.ko name=linux
没有任何显示,则插入成功,此模块要传参数,因此后面多了"name=linux",若无参,则省掉

可以在/var/log/message里查看模块插入模块的输出信息


也可已通过lsmod | grep hello查看刚插入的模块,可以在插入前,插入后,删除后分别执行,结果会更清楚

删除模块同样方便,以root身份运行
# rmmod hello

查看删除模块的输出信息




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