Chinaunix首页 | 论坛 | 博客
  • 博客访问: 303603
  • 博文数量: 35
  • 博客积分: 836
  • 博客等级: 准尉
  • 技术积分: 678
  • 用 户 组: 普通用户
  • 注册时间: 2011-11-07 20:11
文章分类

全部博文(35)

文章存档

2013年(1)

2012年(24)

2011年(10)

分类: LINUX

2012-02-26 11:31:52

老早之前,大概两年以前,写了好多内核驱动代码。那个时候并没有深入学习内核内部。现在再重新学习内核代码,难免要做些实验。

做实验第一步就是要能够进入内核中,linux提供了module机制,能够动态的加载内核模块。昨天搞了一天,结果被一个小问题给绕住了,今天早上起来解决之。

参考的主要内容就是
The Linux Kernel Module Programming Guide

首先拿来书先搞个hello world吧,一步一步的搞。

可是make的时候怎么也不过,原来犯了一个低级错误,直接拷贝粘帖啊……“make -C”本应改是半角的,结果那个减号搞成全角的了,太坑爹了。

闲话少说直接上代码:
hello.c
  1. #include <linux/module.h>
  2. #include <linux/kernel.h>

  3. int hello_init(void)
  4. {
  5.     printk(KERN_INFO "Hello kernel module.\n");
  6.     return 0;
  7. }
  8. void hello_exit(void)
  9. {
  10.     printk(KERN_INFO "Goodbye kernel module.\n");
  11. }


  12. module_init(hello_init);
  13. module_exit(hello_exit);
Makefile:
  1. obj-m += hello.o
  2. KERNEL_VERSION = /lib/modules/$(shell uname -r)/build/

  3. all:
  4. make -C $(KERNEL_VERSION) M=$(PWD) modules
  5. clean:
  6. make -C $(KERNEL_VERSION) M=$(PWD) clean
执行make
  1. CC [M] /home/imay/blog/hello_module/hello.o
  2. Building modules, stage 2.
  3. MODPOST 1 modules
  4. CC /home/imay/blog/hello_module/hello.mod.o
  5. LD [M] /home/imay/blog/hello_module/hello.ko
  6. make[1]: Leaving directory `/usr/src/linux-headers-3.0.0-12-generic'
然后执行
  1. sudo insmod hello.ko
此时模块已经插入内核中,使用lsmod命令来找到自己的module
  1. lsmod | grep hello
结果如下所示:
  1. hello 12421 0
这样自己编写的模块就在内核中了。

然后之前在程序中打印的那条log,可以使用dmesg命令找到
  1. dmesg | tail -1
应该显示的结果如下
  1. [ 5531.946244] Hello kernel module
好了,是时候吧module从kernel中拿出来了,使用rmmod命令
  1. sudo rmmod hello
OK,再看看退出时的那条日志有没有好,同样执行
  1. dmesg | tail -1
看到了如下就说明模块按照自己的设计来走了
  1. [ 5874.821994] Goodbye kernel module.

到这里,一个简单的内核模块就这样在内核中走了一圈。

另外除了dmesg命令之外,也可以在/var/log/kern.log中观察kernel的日志。这个还是不错的,dmesg只能看这次启动的,这里能够找到历史运行的所有日志,有的历史日志已经被达成了压缩包节省空间资源。

不错不错

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