最近的驱动搭建出现了N多奇葩的问题,不过也是自己基础薄弱哈,在此记录分享下。 1.开发平台: 虚拟机:VMware-9.0.2 build-1031769 gcc:gcc version 4.4.3 (Ubuntu 4.4.3-4ubuntu5.1) arm-linux-gcc:gcc-3.4.5-glibc-2.3.6 ubuntu系统版本:ubuntu-lucid-10.04 ubuntu自带内核版本:2.6.32.21(该版本和2.6.32-21-generic版本是不一样的哟) 在开始搭建前,尽量使用如下命令查看版本,其中需要关注的是ubuntu的内核版本,gcc版本。 a.查看ubuntu内核版本:uname -r (一定要使用uname -r 显示的内核版本下载编译) b.查看gcc版本:gcc -v 如果没有安装gcc请输入:apt-get install gcc c.查看交叉编译器:arm-linux-gcc -v 如果没有安装需下载,然后解压到/usr/local/arm/文件夹内,并在/etc/bash.bashrc文件末尾添加如下内容: fi if [ -d /usr/local/arm ]; then PATH=$PATH:/usr/local/arm/gcc-3.4.5-glibc-2.3.6/bin fi 如果安装成功,执行arm-linux-gcc -v会提示你安装的版本,否则请检查出错信息。 另外还需要安装build-essential:apt-get install build-essential 如果提示没有安装包请更新下载源,该源列表在/etc/apt/sources.list文件中,可到官方下载源选择。里面有详细的修改方法,一定要将文档看完,文档下面还有针对不同版本的修改,选择较近区域的源可大大提高下载速度。 除此之外,设置共享文件夹也可大大方便您的操作。 在虚拟机选项:VM/Settings../Options/Shared Folders/Folder Sharing中选择always enable,然后add你想要共享的文件即可,该共享文件夹可在虚拟机/mnt/hgfs/mnt中看到。 2.内核树构建 平台搭建完成后需要下载相应版本的内核。 在官网下载内核:https://www./pub/linux/kernel/v2.6/ 我选择的版本是linux-2.6.32.21.tar.bz2。 将该文件复制到/usr/src目录并解压。 cp /mnt/hgf/mnt/linux-2.6.32.21.tar.bz2 /usr/src/ cd /usr/src/ tar jxvf linux-2.6.32.21.tar.bz a.配置内核,执行:menu oldconfig 测试交叉编译器:make prepare (可不执行) 使能新的交叉编译器:make scripts (可不执行) b.配置完成后编译:make (此过程较长大概一个小时) c.制作映像文件:make bzImage (执行完会在目录下生成vmlinux文件) d.编译模块:make modules e.将模块嵌进内核:make modules_install (执行完会在/lib/moduls/2.6.32.21/目录下生成以内核版本命名的文件夹) 3.内核树测试 到此为止内核树就构建完成了。下面我们测试内核。建立lddr目录新建如下文件: 编写hello.c #include <linux/init.h> #include <linux/module.h> MODULE_LICENSE("Dual BSD/GPL"); static int hello_init(void) { printk(KERN_ALERT "cs say hello world."); return 0; } static void hello_exit(void) { printk(KERN_ALERT "cs say goodbye."); } module_init(hello_init); module_exit(hello_exit);编写Makefileobj-m:=hello.o KERNELDIR=/lib/modules/2.6.32.21/ PWD:=$(shell pwd) modules: $(MAKE) -C $(KERNELDIR) M=$(PWD) modules modules_install: $(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install 执行编译:make make -C /lib/modules/2.6.32.21/build M=/home/cs/lddr/hello modules make[1]: Entering directory `/usr/src/linux-2.6.32.21' Building modules, stage 2. MODPOST 1 modules make[1]: Leaving directory `/usr/src/linux-2.6.32.21' 若无问题将在该目录下生成hello.ko文件 加载模块:insmod hello.ko 查看结果:dmesg 卸载模块:rmmod hello.ko 查看结果:dmsg 环境搭建过程中的问题: 1.Invalid module format 这极有可能是版本不一致造成的。执行dmesg查看相关信息即可。 2更换linux内核,如果编译的linux内核和系统内核不一致则进行如下操作: 在上述的操作中执行完#make modules_install后进入如下(需根据你的实际编译路径选择,如果不知道在哪可查找find / -name "bzImage"): /usr/src/linux-2.6.32.21/arch/i386/boot/bzImage a、生成可执行的内核引导文件 #make bzImage #cp arch/x86/boot/bzImage /boot/vmlinuz-2.6.32.21 b、将System.map复制到/boot下: #cp System.map /boot/System.map-2.6.32.21 c、生成initrd.img文件 #cd /lib/modules/2.6.32.21 #update-initramfs –c –k 2.6.32.21 d、自动查找新内核,并添加至grub引导 #update-grub e、修改/boot/grub/grub.cfg文件,将几个timeout的值设为10 这样grub在引导的时候就会出现10秒的停留,如果有按键输入,则可以对内核镜像进行选择。 重启后执行uname -r可查看系统内核信息看是否更改。 |
|