免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 6036 | 回复: 0

Debian 6.0 驱动开发环境搭建以及Hello模块测试 linux 2.6.32内核 [复制链接]

论坛徽章:
0
发表于 2011-07-23 21:47 |显示全部楼层
本帖最后由 brauceunix 于 2011-07-23 22:18 编辑

前几天看到论坛里有开发环境搭建的文章,不过是基于Redhat 版本的, 今天发个Deiban 6.0版本。就 这么点过程,自己可能走了有一两年之久,现在明白一点了,写下来,扫盲。
1。 安装需求
   A.  需要一个当前系统的内核源码树
   B.  需要内核的头文件
   C. 需要一些日常用到的gcc, make, gdb等应用程序开发工具链. (PS: 这个Debian 6.0默认已经支持)
   D. 写个Helloworld模块测试,环境是否正确
2. 确认这些需求
A. 需求一个当前系统的源码树
a.确定内核版本
  1. brauce@debian:~$ uname -r
  2. 2.6.32-5-686
复制代码
b. 从www.kernel.org 上下载 2.6.32内核, 这个,应该都Ok的,这里的源码,根据uname -r下,2.6.32 版本就是我们要的。至于 后面的,一般变化不会太大,原因是模块化的编程,在一个次版本号里变化应该不会太大
B. 需要内核的头文件
a.搜索相关的内核头文件,aptitude 是apt-get 的一个前端,笔者有点习惯这个
  1. root@debian:/home/brauce# aptitude search linux-headers-2.6.32*
  2. p   linux-headers-2.6.32-5-486      - Header files for Linux 2.6.32-5-486      
  3. i A linux-headers-2.6.32-5-686      - Header files for Linux 2.6.32-5-686      
  4. p   linux-headers-2.6.32-5-686-bigm - Header files for Linux 2.6.32-5-686-bigmem
  5. p   linux-headers-2.6.32-5-all      - All header files for Linux 2.6.32 (meta-pa
  6. p   linux-headers-2.6.32-5-all-i386 - All header files for Linux 2.6.32 (meta-pa
  7. p   linux-headers-2.6.32-5-amd64    - Header files for Linux 2.6.32-5-amd64     
  8. i A linux-headers-2.6.32-5-common   - Common header files for Linux 2.6.32-5   
  9. p   linux-headers-2.6.32-5-common-o - Common header files for Linux 2.6.32-5-ope
  10. p   linux-headers-2.6.32-5-common-v - Common header files for Linux 2.6.32-5-vse
  11. p   linux-headers-2.6.32-5-common-x - Common header files for Linux 2.6.32-5-xen
  12. p   linux-headers-2.6.32-5-openvz-6 - Header files for Linux 2.6.32-5-openvz-686
  13. p   linux-headers-2.6.32-5-vserver- - Header files for Linux 2.6.32-5-vserver-68
  14. p   linux-headers-2.6.32-5-vserver- - Header files for Linux 2.6.32-5-vserver-68
  15. p   linux-headers-2.6.32-5-xen-686  - Header files for Linux 2.6.32-5-xen-686   
复制代码
b. 安装 这些头文件,我的机器是Pentium M 是686系列,根据uname -r的结果来选择
  1. root@debian:/home/brauce# aptitude install linux-headers-2.6.32-5-686
复制代码
C. 基本的工具链就不说了,相信来编译内核的都知道基本的工具链怎么用

3. 写个Hello模块测试
A. Makefile
  1. obj-m := hello.o

  2. KERNELDIR := /home/brauce/linux-2.6-2.6.32      #我把内核放在了/home/brauce目录。内核源码在哪个目录就写哪个目录
  3. PWD :=$(shell pwd)

  4. all:
  5.         $(MAKE) -C $(KERNELDIR) M=$(PWD) modules

  6. #/home/brauce/linux-2.6.32
复制代码
B. hello.c
  1. /*
  2. * $Id: hello.c,v 1.5 2004/10/26 03:32:21 corbet Exp $
  3. */
  4. #include <linux/init.h>
  5. #include <linux/module.h>
  6. MODULE_LICENSE("GPL");

  7. static int hello_init(void)
  8. {
  9.         printk(KERN_ALERT "Hello, world\n");
  10.         return 0;
  11. }

  12. static void hello_exit(void)
  13. {
  14.         printk(KERN_ALERT "Goodbye, cruel world\n");
  15. }

  16. module_init(hello_init);
  17. module_exit(hello_exit);
复制代码
C. 运行
插入模块
  1. root@debian:/home/brauce/hello# insmod  ./hello.ko
  2. insmod: error inserting './hello.ko': -1 Invalid module format
复制代码
很不幸的是,这个程序出了问题,不过前几天还运行的好好的,不管这些原因了,既然出问题了,就要解决掉它们,没得选
正在解决中。。
问题找到了是Makefile 写得不对,上面的Makefile 有问题,用下面的这个Makefile 替换掉就OK了,可以进行模块的插入和删除

  1. ifeq ($(KERNELRELEASE),)

  2.     KERNELDIR ?= /lib/modules/$(shell uname -r)/build
  3.     PWD := $(shell pwd)

  4. modules:
  5.         $(MAKE) -C $(KERNELDIR) M=$(PWD) modules

  6. modules_install:
  7.         $(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install

  8. clean:
  9.         rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions

  10. .PHONY: modules modules_install clean

  11. else
  12.     obj-m := hello.o
  13. endif
复制代码
这个时候的Makefile 写对了,运行 下试试
  1. root@debian:/home/brauce/hello# dmesg | tail
  2. [   50.424186] ADDRCONF(NETDEV_CHANGE): wlan0: link becomes ready
  3. [   60.476039] wlan0: no IPv6 routers present
  4. [  113.269053] res is in use!
  5. [  181.494943] Hello, world
  6. [  187.344542] Goodbye, cruel world
  7. [  196.763165] lo: Disabled Privacy Extensions
  8. [  196.852809] lo: Disabled Privacy Extensions
  9. [  197.909771] lo: Disabled Privacy Extensions
  10. [  224.600522] lo: Disabled Privacy Extensions
  11. [  454.078709] Hello, world  
  12. root@debian:/home/brauce/hello#
复制代码
PS: 最后一行是重点
   这个时候我们再试试 删除模块
  1. root@debian:/home/brauce/hello# rmmod hello
  2. root@debian:/home/brauce/hello# dmesg | tail
  3. [   60.476039] wlan0: no IPv6 routers present
  4. [  113.269053] res is in use!
  5. [  181.494943] Hello, world
  6. [  187.344542] Goodbye, cruel world
  7. [  196.763165] lo: Disabled Privacy Extensions
  8. [  196.852809] lo: Disabled Privacy Extensions
  9. [  197.909771] lo: Disabled Privacy Extensions
  10. [  224.600522] lo: Disabled Privacy Extensions
  11. [  454.078709] Hello, world
  12. [  522.206318] Goodbye, cruel world
  13. root@debian:/home/brauce/hello#
复制代码
到这个地方,环境算是搭建成功了! 驱动写来写去就是容易出问题,只要抱着一定解决的态度,问题终究会得到解决的,我以前 有时候就抱着得过且过的态度,过了那么长时间,也没看过去。。呵呵,自嘲一下,希望本文对你有所帮助


有哪儿写得不对的,或者不好的,欢迎指正
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP