Chinaunix首页 | 论坛 | 博客
  • 博客访问: 49940
  • 博文数量: 11
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 10
  • 用 户 组: 普通用户
  • 注册时间: 2013-03-25 17:31
文章分类
文章存档

2013年(11)

分类: LINUX

2013-05-23 18:53:30

原文地址:编写驱动基本步骤 作者:add358

这里只是概要地描述编写驱动的基本步骤,且不会涉及到具体操作或复杂的编程。
要成功编译及安装内核模块,需做好以下几方面事情:

1 安装编译工具。(具体安装不是本文关心内容)

2 下载内核源码,并配置构造内核树;内核版本最好跟要加载模块的系统一致,如不一致,
  则可能导致在加载模块失败,这时需强制加载。(具体配置设置及加载不是本文关心内容)
  源码可到站上下载。

3 要加载模块的系统需支持模块加载功能,否则无法加载驱动模块。该功能可在配置系统内核时
  选中,如图所示:

该配置基于linux-3.2.1内核
4 编写驱动程序   demo.zip  
  当编译环境搭建好后,接下来就是编写程序。下面以一个简单的示例"demo.c"来演示如何编写一个
 最简单的驱动程序,当然这个驱动程序除了演示之外别无他用。
  1. #include <linux/init.h>
  2. #include <linux/module.h>

  3. MODULE_LICENSE("Dual BSD/GPL"); /* 申明模块使用的协议 */
  4. MODULE_AUTHOR("Kozo");          /* 申明模块作者 */
  5. MODULE_DESCRIPTION("It's a demo module"); /* 描述驱动模块 */

  6. static __init int demo_init(void)
  7. {
  8.     printk(KERN_INFO"demo init\n");
  9.     return 0;
  10. }
  11. static __exit void demo_exit(void)
  12. {
  13.     printk(KERN_INFO"demo exit\n");
  14. }

  15. module_init(demo_init); /* 声明加载函数 */
  16. module_exit(demo_exit); /* 声明卸载函数*/
5 编写Makefile文件
 Makefile代码如下:

点击(此处)折叠或打开

  1. # DEBUG = y

  2. ifeq ($(DEBUG),y)
  3.     DEBFLAGS = -O -g #-D"macro of your module"
  4. else
  5.     DEBFLAGS = -O2
  6. endif

  7. EXTRA_CFLAGS += $(DEBFLAGS)
  8. #EXTRA_CFLAGS += -I"the direction of header file"

  9. ifneq ($(KERNELRELEASE),)
  10.     obj-m = demo.o
  11. else
  12.     KERNELDIR ?= /usr/src/kernels/$(shell uname -r)/
  13.     PWD := $(shell pwd)
  14. default:
  15.     $(MAKE) -C $(KERNELDIR) M=$(PWD) modules
  16. endif

  17. clean:
  18.     rm -rf *.o *.depend .*.cmd *.ko *.mod.c .tmp_versions *.order *.symvers *.ko.unsigned

 6 编译模块
  注意:demo.c与Makefile应在同一目录下。
  使用"$make",便可生成demo.ko模块。

7 模块加载与卸载
  加载模块可使用"#insmod demo.ko"或"#modprobe demo.ko",加载成功后,
可通过"#lsmod | grep demo"查看.
  卸载模块可使用"#rmmod demo"。

8 输出模块打印信息
  使用"#dmesg"可输出模块打印信息,demo模块的输出信息如下


注:转载时请注明出自:add358.blog.chinaunix.net
阅读(1065) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~