Chinaunix首页 | 论坛 | 博客
  • 博客访问: 229406
  • 博文数量: 29
  • 博客积分: 878
  • 博客等级: 上士
  • 技术积分: 1114
  • 用 户 组: 普通用户
  • 注册时间: 2012-03-12 14:49
文章分类

全部博文(29)

文章存档

2012年(29)

分类: LINUX

2012-03-26 17:14:02

最近加载驱动到开发板的时候一直不成功,以为是Makefile的问题,后面才发现是内核编译的问题。
环境ubuntu10.04  内核linux2.6.32  开发板arm linux2.6.36
开发板用的内核是我之前编译好的arm-linux2.6.36. 烧写的是make后的/arch/arm/boot/zImage
后来交叉编译的时候总是通不过,只到DEPMOD,并没有经过CC,LD,也就是没有编译链接。
原因是我编译内核的时候只编译到make,并没有执行make install

一般情况,编译内核完整的步骤以及各部分的意义是:
1.清除
make mrproper 或者make distclean
2.配置
make menuconfig
生成.config文件,保存当前的各种配置信息。
如果已有.config,make config
3.make dep
建立模块依赖关系。2.6中由make menuconfig完成,不在需要执行此命令。
4.make
make编译内核,只编译并链接内核core和内置(答Y的)模块,在内核空间产生vmlinux,这是一个ELF文件,非二进制文件,包含一些内核符号表。
真正被执行的程序在arch/i386/boot目录下的zImage
make zImage-->编译内核与库,小于512K,给软盘用
make bImage-->编译大内核。
make zImage只是生成kernel image,还需要make modules来生成所有的kernel module.生成的kernel image一般在arch/对应的平台/boot/目录中。module是在各自的source code的目录,可通过make modules_install  INSTALL_MOD_PATH=xxx来安装。
5.make modules
将M的模块编译为.o,然后再将多个目标链接为.ko,这些文件分散在各个模块源码目录中。
6.make modules_install
拷贝.ko模块文件到/lib/modules/ <新内核版本号>/下,并运行depmod生成modules.dep内核模块的依赖关系配置文件。insmod,modprobe需要用它去加载内核所需的驱动。
7.make install
以上是编译内核模块,并安装到boot目录下,重启即可得到自己的目录。
系统模块在/lib/modules/2.6.32/kernel中。
2.6内核下只需要make make modules_install就可以了。

需要注意的是编译驱动的Makefile中的KDIR指向的是对应的嵌入式系统的内核,不能指向PC下的linux内核。即不能使用KDIR=/lib/modules/$(shell uname -r)/build这句万能代码了。一般情况下是/home/xxxx/linux-xxxx
即可加载最简单的hello.ko模块。

模块卸载时需要依赖/lib/modules目录。所以需要创建或者拷贝一个这样的目录。原来使用的是cramfs文件系统,只读不可写。后来重新烧了个yaffs文件系统,拷贝了ubuntu中生成的这个目录,就可以卸载了。
出现的问题是,卸载以后还是不能重新加载。不知道怎么回事。
阅读(4633) | 评论(4) | 转发(1) |
0

上一篇:没有了

下一篇:s3c6410_leds.c驱动分析

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

zhongli_i2012-04-16 07:50:40

十七岁的回忆: 一般内核都应该是一个系统的最重要的部分吧,怎么能随便公开呢???.....
呵呵,我们要学习linux的开源精神。

十七岁的回忆2012-04-15 20:18:34

一般内核都应该是一个系统的最重要的部分吧,怎么能随便公开呢???

zhongli_i2012-03-28 11:04:38

新手来鸟: 内核到底是怎么变异的啊…….....
就我知道的一点点跟你说一下,不一定完全正确,你可以再网上找找其他资料比较一下。
编译内核其实就是为了得到一个内核映像文件,包括内核代码,库等等,依赖于顶层Makefile,顶层Makefile又依赖底层的Makefile,编译后在内核根目录下会生成一个vmlinux,只是一个ELF文件,不是二进制的,内含一些内核符号表之类的。真正执行的是内核映像zImage,这是一个二进制文件,在对应的体系结构目录下,比如arch/arm/boot下。这个zImage是可以运行的,但是要编译驱动还需要make modules_install。我觉得可以认为是对PC下交叉编译驱动的支持。

新手来鸟2012-03-27 22:29:47

内核到底是怎么变异的啊……