Chinaunix首页 | 论坛 | 博客
  • 博客访问: 187405
  • 博文数量: 39
  • 博客积分: 1007
  • 博客等级: 准尉
  • 技术积分: 513
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-15 09:15
文章分类

全部博文(39)

文章存档

2012年(2)

2011年(37)

分类: LINUX

2011-04-13 10:48:43

/***************************************************************************************************************************
参考:《LINUX设备驱动程序》第三版
编译平台:Scientific Linux 版本6.0(Carbon) 内核Linux 2.6.32-71.el6.i686
编译器:4.3.3
****************************************************************************************************************************/
 
创建完整的Hello World模块:在Linux下用vi创建hello.c,填入以下代码保存
  1. #include <linux/init.h>                            /*两个专门用于模块的头文件*/
  2. #include <linux/module.h>
  3. MODULE_LICENSE("Dual BSD/GPL");                    /*特殊宏,告诉内核该模块采用自由许可认证*/

  4. static int hello_init(void){                       /*定义Hello World的初始化函数*/
  5.         printk(KERN_ALERT "Hello , world\n");      /*printk为内核的私有打印函数*/
  6.                                                    /*KERN_ALERT定义消息优先级为最高级*/
  7.         return 0;
  8. }
  9. static void hello_exit(void){                       /*定义Hello World的退出函数*/
  10.         printk(KERN_ALERT "Goodbye,cruel world\n");
  11.       
  12. }
  13. module_init(hello_init);                           /*加载模块,调用函数名即可*/
  14. module_exit(hello_exit);                           /*卸载模块*/
 
创建Makefile
     #如果已定义KERNELRELEASE说明是从内核构造系统调用,可用其内建构造语句
  1. ifneq ($(KERNELRELEASE),)
  2.         obj-m := hello.o

  3. #否则直接从命令行调用,这时要调用内核构造系统

  4. else

  5. #找到内核源码树之后,Makefile会调用“default:目标”;此时“#make”命令会被参数化成“$(MAKE)”
  6. #“-C”选项指定内核源码目录;
  7. #“M=”项让Makefile在构造modules目标前返回模块源码目录,指向obj-m变量设定的模块,这里指向hello.o

  8. default:
  9.         $(MAKE) -C /usr/src/kernels/2.6.32-71.el6.i686 M=$(shell pwd) modules
  10. endif

  11. clean:
  12.         rm *.o *.mod.c *.symvers *.ko *.ko.unsigned *.order
注1:Makefile 文件名的"M"要大写;在Makefile中行首缩进需要用Tab键;编译时先看环境变量KERNELRELEASE 是否定义,如没定义则调用Linux内核编译build脚本。
 
Linux中运行加载和卸载模块:
  1. [root@HLinuxH Kernel]# ls
  2. hello.c Makefile

  3. [root@HLinuxH Kernel]# make
  4. make -C /usr/src/kernels/2.6.32-71.el6.i686 M=/opt/EmbedSky/Kernel modules
  5. make[1]: Entering directory `/usr/src/kernels/2.6.32-71.el6.i686'
  6.   CC [M] /opt/EmbedSky/Kernel/hello.o
  7.   Building modules, stage 2.
  8.   MODPOST 1 modules
  9.   CC /opt/EmbedSky/Kernel/hello.mod.o
  10.   LD [M] /opt/EmbedSky/Kernel/hello.ko.unsigned
  11.   NO SIGN [M] /opt/EmbedSky/Kernel/hello.ko
  12. make[1]: Leaving directory `/usr/src/kernels/2.6.32-71.el6.i686'

  13. [root@HLinuxH Kernel]# ls
  14. hello.c hello.ko.unsigned hello.mod.o Makefile Module.symvers
  15. hello.ko hello.mod.c hello.o modules.order

  16. [root@HLinuxH Kernel]# insmod hello.ko

  17. [root@HLinuxH Kernel]# tail /var/log/messages
  18. Apr 13 11:54:28 HLinuxH kernel: Hello , world

  19. [root@HLinuxH Kernel]# rmmod hello

  20. [root@HLinuxH Kernel]# tail /var/log/messages
  21. Apr 13 11:54:28 HLinuxH kernel: Hello , world
  22. Apr 13 11:54:58 HLinuxH kernel: Goodbye,cruel world

  23. [root@HLinuxH Kernel]#
注2:我是以root用户登录系统进行操作的,若不是管理员的话,在加载前先#su命令一下。
     #insmod hello.ko 命令用于加载hello.ko模块
     #rmmod hello 命令用于卸载hello模块
     #tail /var/log/messages 命令用于查看输出。上图输出的部分无关信息被我删除。
 
 
 
阅读(1730) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

zhangthe92011-04-15 16:26:56

我顶你
最简单明了
Linux 2.6.32-71.el6.i686 也是很早以前VERYCD下的默认版本

兄台邮件地址多少啊
请教问题