- 论坛徽章:
- 0
|
本帖最后由 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.确定内核版本- brauce@debian:~$ uname -r
- 2.6.32-5-686
复制代码 b. 从www.kernel.org 上下载 2.6.32内核, 这个,应该都Ok的,这里的源码,根据uname -r下,2.6.32 版本就是我们要的。至于 后面的,一般变化不会太大,原因是模块化的编程,在一个次版本号里变化应该不会太大
B. 需要内核的头文件
a.搜索相关的内核头文件,aptitude 是apt-get 的一个前端,笔者有点习惯这个- root@debian:/home/brauce# aptitude search linux-headers-2.6.32*
- p linux-headers-2.6.32-5-486 - Header files for Linux 2.6.32-5-486
- i A linux-headers-2.6.32-5-686 - Header files for Linux 2.6.32-5-686
- p linux-headers-2.6.32-5-686-bigm - Header files for Linux 2.6.32-5-686-bigmem
- p linux-headers-2.6.32-5-all - All header files for Linux 2.6.32 (meta-pa
- p linux-headers-2.6.32-5-all-i386 - All header files for Linux 2.6.32 (meta-pa
- p linux-headers-2.6.32-5-amd64 - Header files for Linux 2.6.32-5-amd64
- i A linux-headers-2.6.32-5-common - Common header files for Linux 2.6.32-5
- p linux-headers-2.6.32-5-common-o - Common header files for Linux 2.6.32-5-ope
- p linux-headers-2.6.32-5-common-v - Common header files for Linux 2.6.32-5-vse
- p linux-headers-2.6.32-5-common-x - Common header files for Linux 2.6.32-5-xen
- p linux-headers-2.6.32-5-openvz-6 - Header files for Linux 2.6.32-5-openvz-686
- p linux-headers-2.6.32-5-vserver- - Header files for Linux 2.6.32-5-vserver-68
- p linux-headers-2.6.32-5-vserver- - Header files for Linux 2.6.32-5-vserver-68
- 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的结果来选择- root@debian:/home/brauce# aptitude install linux-headers-2.6.32-5-686
复制代码 C. 基本的工具链就不说了,相信来编译内核的都知道基本的工具链怎么用
3. 写个Hello模块测试
A. Makefile- obj-m := hello.o
- KERNELDIR := /home/brauce/linux-2.6-2.6.32 #我把内核放在了/home/brauce目录。内核源码在哪个目录就写哪个目录
- PWD :=$(shell pwd)
- all:
- $(MAKE) -C $(KERNELDIR) M=$(PWD) modules
- #/home/brauce/linux-2.6.32
复制代码 B. hello.c- /*
- * $Id: hello.c,v 1.5 2004/10/26 03:32:21 corbet Exp $
- */
- #include <linux/init.h>
- #include <linux/module.h>
- MODULE_LICENSE("GPL");
- static int hello_init(void)
- {
- printk(KERN_ALERT "Hello, world\n");
- return 0;
- }
- static void hello_exit(void)
- {
- printk(KERN_ALERT "Goodbye, cruel world\n");
- }
- module_init(hello_init);
- module_exit(hello_exit);
复制代码 C. 运行
插入模块- root@debian:/home/brauce/hello# insmod ./hello.ko
- insmod: error inserting './hello.ko': -1 Invalid module format
复制代码 很不幸的是,这个程序出了问题,不过前几天还运行的好好的,不管这些原因了,既然出问题了,就要解决掉它们,没得选
正在解决中。。
问题找到了是Makefile 写得不对,上面的Makefile 有问题,用下面的这个Makefile 替换掉就OK了,可以进行模块的插入和删除
- ifeq ($(KERNELRELEASE),)
- KERNELDIR ?= /lib/modules/$(shell uname -r)/build
- PWD := $(shell pwd)
- modules:
- $(MAKE) -C $(KERNELDIR) M=$(PWD) modules
- modules_install:
- $(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install
- clean:
- rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions
- .PHONY: modules modules_install clean
- else
- obj-m := hello.o
- endif
复制代码 这个时候的Makefile 写对了,运行 下试试- root@debian:/home/brauce/hello# dmesg | tail
- [ 50.424186] ADDRCONF(NETDEV_CHANGE): wlan0: link becomes ready
- [ 60.476039] wlan0: no IPv6 routers present
- [ 113.269053] res is in use!
- [ 181.494943] Hello, world
- [ 187.344542] Goodbye, cruel world
- [ 196.763165] lo: Disabled Privacy Extensions
- [ 196.852809] lo: Disabled Privacy Extensions
- [ 197.909771] lo: Disabled Privacy Extensions
- [ 224.600522] lo: Disabled Privacy Extensions
- [ 454.078709] Hello, world
- root@debian:/home/brauce/hello#
复制代码 PS: 最后一行是重点
这个时候我们再试试 删除模块- root@debian:/home/brauce/hello# rmmod hello
- root@debian:/home/brauce/hello# dmesg | tail
- [ 60.476039] wlan0: no IPv6 routers present
- [ 113.269053] res is in use!
- [ 181.494943] Hello, world
- [ 187.344542] Goodbye, cruel world
- [ 196.763165] lo: Disabled Privacy Extensions
- [ 196.852809] lo: Disabled Privacy Extensions
- [ 197.909771] lo: Disabled Privacy Extensions
- [ 224.600522] lo: Disabled Privacy Extensions
- [ 454.078709] Hello, world
- [ 522.206318] Goodbye, cruel world
- root@debian:/home/brauce/hello#
复制代码 到这个地方,环境算是搭建成功了! 驱动写来写去就是容易出问题,只要抱着一定解决的态度,问题终究会得到解决的,我以前 有时候就抱着得过且过的态度,过了那么长时间,也没看过去。。呵呵,自嘲一下,希望本文对你有所帮助
有哪儿写得不对的,或者不好的,欢迎指正 |
|