Chinaunix首页 | 论坛 | 博客
  • 博客访问: 395134
  • 博文数量: 69
  • 博客积分: 1992
  • 博客等级: 上尉
  • 技术积分: 1162
  • 用 户 组: 普通用户
  • 注册时间: 2010-03-03 19:50
文章分类
文章存档

2015年(1)

2011年(55)

2010年(13)

分类: LINUX

2010-05-30 23:26:30

  在网上看了很多内核树的建立,按照他们的都没有成功。现在把成功的过程记录下来,做一个记录,记录自己学习的过程。
        首先
什么要建立内核 树呢?因为我们知道驱动可以编译进内核进行执行,也可以以模 块的方式加载到内核里进行执行。编写驱动程序在2.6版本的内核与2.4版本的内核有所不同,2.4版本的内核只需要有一套内核头文件就够了,而2.6的 内核的模块则要和内核源代码树中的目标文件相连接,这样,就需要一个建立一个内核树,来提供上面这些目标文件。所以首先我们要建立一个内核源代码树,而这 个内核源代码树的建立有两种方式:一,直接用发行版的内核源代码包建立(也就是你装的Linux系统);二,用上下的纯净版 内核构造,这里选择第二种方式。因为,发行版厂商提供的内核源代码包通常打了许多补丁,从而和你从上下的内核存在很大的差异。在某些情况下,有可能厂商的补 丁会修改设备驱动程序使用的内核API。而我们最终要一直Linux系统到开发板上去,我们不会去移植发行版提供的内核,我们只会移植从下的内核,所以不论是从学习的角度,还是从以后移植 Linux的角度,我们都选择第二种办法。好了,废话少说,下面开始叙述建立内核树的详细过程。
        首先,用uname -r 查看当前运行内核的版本:
[root@localhost ~]# uname -r
2.6.18-53.el5
[root@localhost ~]#
        然后,从
上下一个和你当前运行版本一样的内核,这里可以看到我当前运行的内核版本是2.6.18-53.el5,好,那我就下一个2.16.18.x的版本。
        下下来之后放在一个目录下,我存放的目录为:
[root@localhost linux]# pwd
/home/linux
         解压:
[root@localhost linux]# tar xvzf linux-2.6.18.tar.gz
解压完之后会生 成
linux-2.6.18目录。进入这个目 录:
[root@localhost linux]# cd linux-2.6.18
拷贝当前系统的.config文件到这个目录下:
[root@localhost linux-2.6.18]# cp /usr/src/kernels/2.6.18-53.el5-i686/.config ./
运行 makemenuconfig
[root@localhost linux-2.6.18]# make menuconfig

学习Linux驱动第一步:内核树的建立 - 笑寒 - pursuitxh 的博客
选择图上选项按回车进入
学习Linux驱动第一步:内核树的建立 - 笑寒 - pursuitxh 的博客
去掉上图中的*
保存退出。
执行make
[root@localhost linux-2.6.18]# make
时间一个多小时,可以去看电影去了。
[root@localhost linux-2.6.18]# make bzImage
[root@localhost linux-2.6.18]# make modules
[root@localhost linux-2.6.18]# make  modules_install

可以看到在
[root@localhost code]# cd /lib/modules/
生成了2.6.18目录
[root@localhost modules]# ls
2.6.18  2.6.18-53.el5  2.6.18.8
下面编写一个hello模块
[root@localhost code]# gedit hello.c
#include
#include
MODULE_LICENSE("Dual BSD/GPL");
static int hello_init(void)
{
printk(KERN_EMERG "Hello, li wei meng\n");
return 0;
}
static void hello_exit(void)
{
printk(KERN_EMERG"Goodbye, li wei meng\n");
}
module_init(hello_init);
module_exit(hello_exit);
同时编写Makefile,在同一目录下:
[root@localhost code]# gedit Makefile
ifneq ($(KERNELRELEASE),)

obj-m := hello.o

else
   
KDIR := /lib/modules/2.6.18/build
all:
    make -C $(KDIR) M=$(PWD) modules
clean:
    rm -f *.ko *.o *.mod.o *.mod.c *.symvers

endif

执 行make
[root@localhost code]# make
make -C /lib/modules/2.6.18/build M=/home/code modules
make[1]: Entering directory `/home/linux/linux-2.6.18'
  CC [M]  /home/code/hello.o
  Building modules, stage 2.
  MODPOST
  CC      /home/code/hello.mod.o
  LD [M]  /home/code/hello.ko
make[1]: Leaving directory `/home/linux/linux-2.6.18'

执行insmod
[root@localhost code]# insmod hello.ko
[root@localhost code]#
Message from syslogd@ at Sun May 23 21:02:30 2010 ...
localhost kernel: Hello, li wei meng
执行rmmod
[root@localhost code]# rmmod hello.ko
[root@localhost code]#
Message from syslogd@ at Sun May 23 21:02:46 2010 ...
localhost kernel: Goodbye, li wei meng

好了,全文到此结束。
阅读(1195) | 评论(0) | 转发(1) |
0

上一篇:没有了

下一篇:驱动第一站:hello world

给主人留下些什么吧!~~