我靠,这个可真TM的折腾人啊(先咆哮两句)。没人告诉我驱动开发还得要搭建环境,拿着《linux设备驱动》这本书,一开始我就蒙了,真的!不知道还得构建一个内核树,心里想linux操作系统不是已经装了吗?我现在也没明白为什么还要自己去构建一内核树。两天半啊,啥事也没干就搭建它了。哎。
1. 我的机器上装的是LINUX 6.0(服务器),内核版本2.6.32.7.所以我下载的标准LINUX内核源码也是这个版本,在这里下载相应的内核源码然后页面搜索你需要的版本例如你linux-2.6.32.7则搜linux-2.6.32.7.tar.bz2这是源码包。版本不一致的话,真的会有问题的(哥郁闷过了)。
然后解压到/usr/src目录下:tar -zxvf xx.tar.gz 或者tar -jxvf xx.tar.bz2(xx就是如:linux-2.6.32.7啦)。
2.编译内核码:
step1:make oldconfig (or make menuconfig)
step2:make
这一step花时间很长,我大概是40分钟,还有就是注意系统时间设置下,我就是因为一开始没有设置系统时间所以make就一直报:时钟错误....。哎我的吗呀,这个东西搞死我了。
step3:make bzImage
step4: make modules
step5:make modules_install
step6:make install
3.修改boot镜像文件
进入/boot下,你会发现多了一个Vmlinuz-2.6.32.7文件,和initramfs-2.6.32.7.img文件,这个可都是刚刚编译内核出来的啊。
然后我们再进入/boot/grub,打开menu.list文档,你会发现里面会有root=,把原来系统自带的删掉,保留我们编译的内核。不然的话(uname -r)默认的是原来系统自带的版本。(我靠我已不知道为什么原来的版本后面还多一段字符串就是2.6.32-71.el6.i686).
4.现在可以开始我们的hello,world了。
例子是书上的:
// hello.c
#include <linux/init.h>
#include <linux/module.h>
MODULE_LICENSE("Dual BSD/GPL");
static int hello_init(void)
{
printk(KERN_ALERT "hello world!\n");
return 0;
}
static void hello_exit(void)
{
printk(KERN_ALERT "goodbye!\n");
}
module_init(hello_init);
module_exit(hello_exit);
然后写个Makefile文档:
obj -m:=hello.o
保存到同一个目录例如:/usr/drivermodules
cd到这个目录然后:
make -c /lib/modules/(uname -r)/build SUBDIRS=$PWD modules (ubame -r 其实就是你的内核版本号的目录)
看看是不是多了几个文件?yes!下一步:
ok!你加载一下insmod hello.ko
再执行dmesg,看到hello,world了吧
rmmod hello.ko,看到goodbye,cruel world
当然前面的那个命令有点长,我们可以直接卸载Makefile文档里面:
#mark start
obj-m:=hello.c
KERNELDIR=/lib/modules/$(shell uname -r)/build
PWD:=$(shell pwd)
default:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
clean:
$(RM) *.o *.ko *.mod.c Module.symvers
#make end
完了!
阅读全文类别:Linux 查看评论