Chinaunix首页 | 论坛 | 博客
  • 博客访问: 32798
  • 博文数量: 5
  • 博客积分: 85
  • 博客等级: 民兵
  • 技术积分: 95
  • 用 户 组: 普通用户
  • 注册时间: 2012-08-01 20:14
文章分类

全部博文(5)

文章存档

2012年(5)

我的朋友

分类: LINUX

2012-08-01 21:02:50

1: 
  虚拟机:virtualbox + ubuntu10.04   
  宿主机:windows 7 + x86
  kernel version:2.6.32-37

2 : 在编译内核模块时,需要内核源代码树,当然这里的源代码树不一定是完整的代码,只是包含内核的头文件的树和makefile文件。如果系统里面没有,那么就先安装 kernel-headers 和kernel-devel。
    安装方法: 
     # apt-cache search kernel-headers 
     
     出现如下结果:
     comedi-source - Comedi kernel module source
     kernel-package - A utility for building Linux kernel related Debian packages.
     linux-libc-dev - Linux Kernel Headers for development
     
     安装:
     # apt-get install linux-libc-dev

     OK了,这样就可以去编译模块了。

3:hello world 
   这个“臭名昭著”的例子,不论在C,C++,java......,甚至是shell,android......的书上,第一个见到的就是她了。当然这里我们也没有理由拒绝她的疑惑,那么就以hello world 开启我们linux driver 学习的大门吧。  

点击(此处)折叠或打开

  1. #include <linux/init.h>        
  2. #include <linux/module.h>    
  3. #include <linux/kernel.h>    

  4. MODULE_LICENSE("Dual BSD/GPL");
  5. MODULE_AUTHOR("Keter");

  6. static int __init hello_init(void)
  7. {    
  8.     printk(KERN_ALERT "Hello World\n");
  9.     return 0 ;
  10. }

  11. static void __exit hello_cleanup(void)
  12. {
  13.     printk(KERN_ALERT "Goodbye world\n");
  14. }

  15. module_init(hello_init);
  16. module_exit(hello_cleanup);
  说明:
  #include
  #include
  #include
  头文件实际包含代码需要的函数和宏,实际上指向:
  /usr/src/linux-headers-2.6.32-37-generic/

  尽管不是严格要求,但模块应该指定代码所使用的许可证。内核能够识别的许可证有:“GPL”、“GPL v2”、“GPL and additional rights"、“Dual BSD/GPL"、“GPL MPL/GPL”、“Proprietary”。在这里我们用“Dual BSD/GPL”
   MODULE_LICENSE("Dual BSD/GPL");  
   #define MODULE_LICENSE(_license) MODULE_INFO(license, _license)
   MODULE_LICENSE 宏告诉内核模块采用许可证类型。
   模块定义了两个函数:static int hello_init(void)  static void hello_cleanup(void)。模块被装载时调用hello_init,模块被移除时调用 hello_cleanup 。
   这里用到了一个内核函数:prinfk,和C库差不多的用法,打印内核调试信息,分为8个等级。
   在linux/kernel.h中,有如下定义:

点击(此处)折叠或打开

  1. #define    KERN_EMERG    "<0>"    /* system is unusable            */
  2. #define    KERN_ALERT    "<1>"    /* action must be taken immediately    */
  3. #define    KERN_CRIT    "<2>"    /* critical conditions            */
  4. #define    KERN_ERR    "<3>"    /* error conditions            */
  5. #define    KERN_WARNING    "<4>"    /* warning conditions            */
  6. #define    KERN_NOTICE    "<5>"    /* normal but significant condition    */
  7. #define    KERN_INFO    "<6>"    /* informational            */
  8. #define    KERN_DEBUG    "<7>"    /* debug-level messages            */
   数字越小,优先级越大,如果小于控制台默认优先级,就不会输出log信息。
   调整优先级: 
   #cat /proc/sys/kernel/printk:
    4 4 1 7
    可以修改这个文件控制输出情况。

    __init ,__exit :告诉内存子啊装载和卸载模块后释放代码在内存中的空间。

 4:Makefile 和 装载
  

点击(此处)折叠或打开

  1. hello-objs := hello.o
  2. obj-m := hello.o
  3. #KERNELDIR ?= /lib/modules/$(shell uname -r)/build
  4. KERNELDIR := /lib/modules/$(shell uname -r)/build
  5. PWD := $(shell pwd)
  6. all:
  7. $(MAKE) -C $(KERNELDIR) M=$(PWD)

    .PHONY: clean       
  1. clean:
  2. rm -rf *.o  .*.cmd *.ko *.mod.c .tmp_versions
   $(MAKE) -C $(KERNELDIR) M=$(PWD) -C
   首选改变目录到-C选项指定的位置:$KERNELDIR ,其中包含了内核顶层的makefile文件。 M=$(PWD)让
改makefile在构造模块前返回到当前模块的源代码目录。然后modules指向obj-m指定的模块。
   hello-objs := hello.o:生成模块需要的.o文件。
   
执行make 输出如下: 
   

点击(此处)折叠或打开

  1. make -C /lib/modules/2.6.32-37-generic/build M=/home/share/samba/driver
  2. make[1]: Entering directory `/usr/src/linux-headers-2.6.32-37-generic'
  3. CC [M] /home/share/samba/driver/hello.o
  4. Building modules, stage 2.
  5. MODPOST 1 modules
  6. LD [M] /home/share/samba/driver/hello.ko
  7. make[1]: Leaving directory `/usr/src/linux-headers-2.6.32-37-generic'

   可以清晰看出源代码树目录/usr/src/linux-headers-2.6.32-37-generic
   /lib/modules/$(shell uname -r)/build 目录只是指向/usr/src/linux-headers-2.6.32-37-generic目录的一个软链接。

5:至此,可以装载模块了
   # insmode hello.ko
   # rmmode hello
   # cat syslog 
   //dmesg | tail -2 也可以查看LOG
   syslog中就看到如下2行log
   Aug  1 22:06:10 keter kernel: [10574.941883] Goodbye world
   Aug  1 22:06:20 keter kernel: [10584.619073] Hello World

   至此hello world也完成。

阅读(1876) | 评论(0) | 转发(0) |
0

上一篇:没有了

下一篇:Linux下高并发socket最大连接数

给主人留下些什么吧!~~