最近加载驱动到开发板的时候一直不成功,以为是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中生成的这个目录,就可以卸载了。
出现的问题是,卸载以后还是不能重新加载。不知道怎么回事。