tar xvfj linux-2.6.30.4_20100531.tar.bz2 –C /-C是指定解压目录,后面的/代表在根目录解压归档文件。
cd /opt/EmbedSky/linux-2.6.30.4 cp config_EmbedSky_W35 .config make zImage在此,config_EmbdeSky_W35为天嵌公司提供的内核配置文件,开始时可暂时拿来用。
tar xvfj EABI-4.3.3_EmbedSky_20100610.tar.bz2 –C /之后交叉编译器会被解压到/opt/EmbedSky/4.3.3/,
export PATH=$PATH:/opt/EmbedSky/4.3.3/bin保存重启即生效,若不想重启可使用
source /etc/environment但是此命令只对该终端生效,所以若没其他问题,推荐重启
cd /home/shanks/modules mkdir hello cd hello驱动模块不一定要放在内核树里,只要你的Makefile指定了内核树的路径就没问题,所以我这里在/home/shanks/里建立了一个modules目录专门用来开发驱动模块
#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, cruel world\n"); return 0; } module_init(hello_init); module_exit(hello_exit);
KERNELDIR=/opt/EmbedSky/linux-2.6.30.4 PWD:=$(shell pwd) INSTALLDIR=$(PWD) CC=arm-linux-gcc obj-m := hello.o modules: $(MAKE) -C $(KERNELDIR) M=$(PWD) modules clean: rm -rf *.o *.ko *.mod.c *.markers *.order *.symvers .PHONY:modules clean这里有必要解释一下驱动模块的Makefile编写方法,需要注意的是:
obj-m := hello.o
扩展语法,说明有一个模块需要从目标文件hello.o中构造,模块名称为hello.ko
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules上述命令 首先改变目录到-C选项指定位置(即目录源代码目录),其中保存有内核的顶层文件。M=选项让内核顶层的Makefile在构造modules目标之前返回到模块源代码目录。然后,开始第二次读取PWD中的Makefile,modules目标指向obj-m变量中设定的模块,而内核的Makefile负责真正构造模块。
cp /mnt/home/shanks/modules/hello/hello.ko/tmp cd /tmp好了,加载模块!
Goodbye, cruel world
完成!
insmod时可能出现的错误:
解决方法:尽量用和你同时用来编译驱动而生成的内核镜像zImage,zImage烧到板子上。Ldd3上有句话:尽管并不是必需的,但最好运行和模块对应的内核。