Linux Device Drivers(一)hello world

1355阅读 1评论2012-04-10 kenvifire
分类:LINUX

1、简单的helloword代码如下所示:

点击(此处)折叠或打开

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

  4. static int hello_init(void){
  5.         printk(KERN_ALERT "Hello, world\n");
  6.         return 0;
  7. }

  8. static int hello_exit(void){
  9.         printk(KERN_ALERT "Goodbye,cruel world\n");
  10.         return 0;
  11. }

  12. module_init(hello_init);
  13. module_exit(hello_exit);
2、hello_init函数是用来初始化模块的,用module_init(hello_init)来设置,同理module_exit(hello_exit)是退出时做一些清理工作的
3、编译该内核模块
  1) 内核模块里用到的函数以及符号都是来自内核源码的,所以编译的时候需要有一份内核源码,在上下载,解压即可;
  2) 直接编译
    编写Makefile文件

点击(此处)折叠或打开

  1. obj-m :=hello.o
   3)make -C /usr/src/linux/ SUBDIRS=$PWD modules
         这时,当前目录下会生成hello.mod.c  hello.o   modules.order
hello.ko  hello.mod.o  Makefile  Module.symvers,多个文件,其中hello.ko就是生成的内核模块
如果这步出错,请参考http://blog.csdn.net/sabalol/article/details/2076610
   4)将模块加入到内核中
     sudo insmod hello.ko
这时候报错:insmod: error inserting 'hello.ko': -1 Invalid module format
运行dmesg,可以看到这样的一行: hello: disagrees about version of symbol module_layout
使用

点击(此处)折叠或打开

  1. make -C /lib/modules/`uname -r`/build M=`pwd` modules
重新make,再sudo insmod hello.ko,没有报错
    5)查看信息,运行dmesg可以看到这样的一条输出
    [11104.240469] Hello, world
    6)移除hello.ko
     sudo rmmod hello.ko
     再次运行dmesg,可以看到
  [11211.257349] Goodbye,cruel world










上一篇:内存管理(七)特定于PTE的信息
下一篇:MiKTex(一)安装

文章评论