我靠,这个可真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 查看评论
posted on 2011-03-10 19:49  sinbad_li  阅读(1668)  评论(0编辑  收藏  举报