ubuntu下编译内核及烧录问题

本文分享了作者在嵌入式Linux环境下编译内核时遇到的问题及解决方案,包括编译环境搭建、解决编译错误、生成uImage文件、配置内核选项、去除不需要的驱动以及内核烧录流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

都是我自己遇到的,肯定不全,还望见谅。。。问题比较小白,怕以后会忘记,写在这里方便查找。

编译环境:linux2.6.36.2 

文件系统:nfs 

交叉编译器:gnu 4.4.1

开发板:ok6410

1、在编译内核的过程中,可能会出现"mkimage" command not found - U-Boot images will not be built"的语句,这时,去uboot目录下,有个tools目录,里面有个mkimage。将其放入/usr/bin目录下,设置权限全开。

编译内核的时候老出现这样的错误:
    usr/local/arm/3.4.1/bin/arm-linux-ld: no machine record defined
    make: *** [.tmp_vmlinux1] 错误 1

在 google 查到的都是说arch/arm/kernel/vmlinux.lds的最后两行(如下),给注释起来,但是没说为什么

    ASSERT((__proc_info_end - __proc_info_begin), "missing CPU support")
    ASSERT((__arch_info_end - __arch_info_begin), "no machine record defined"
后来自己到 arch/arm/kernel/vmlinux.lds 看注释才知道

These must never be empty
If you have to comment these two assert statements out, your
binutils is too old (for other reasons as well)
在编译通过。

2、编译内核的时候,如果要产生uImage文件,前提是编译的系统要有mkimage。这个工具在uboot主目录下的tools目录下。但是很多都是针对windows的。比较烦。我自己试着在linux下手动编译了半天都没成功。

但是在ubuntu下,可以用 sudo apt-get install mkimage解决问题。ubuntu好方便。。。

3、如果已经有了一个配置好的内核文件.config。现在你不想完全重头配置内核,只是做修改的话。可以用make menuconfig ARCH=arm进入后,选择最下面的Load an Alternate Configuration File选项,然后选择那个已经配置好的.config。

4、我编译内核的目的在于,飞凌给的那个linux内核编译进去了按键的驱动。卸载不掉。在编译内核里的device driver--->input driver--->keyboard driver--->gpio 路径大约是这个样子的。打开一看就知道了。把那个keyboard driver直接去掉。我是这么做的。编好后,cat /proc/interrupts就不再有键盘的中断显示出来了。

我用的make uImage ARCH=arm CROSS_COMPILE=arm-linux-命令编译的内核,编译完成后,在arch/arm/boot下不但有uImage 还有zImage。以前都没有人提到过,看网上都说的编译时候用make uImage,编译出来就只uImage,要zImage的话要通过转换得到。没想到自己实践一下还得到个小意外。

5、我全程在linux下烧录内核。用的网上的那个linux版本的dnw,针对2440的,自己按说明改动了一下,能给6410用了。挺好用的。烧录的时候要检查串口是否链接,USB是否链接。然后进入那个编译好的dnw的目录。sudo insmod secbulk.ko就是将那个编译好的module文件加载上。我在这里遇到的问题是:加载该文件后,一直无法在/proc/devices下看到secbulk。用dmesg可以看到secbulk loaded字样。但没有/dev/secbulk文件。当然无法使用./dnw传送文件。后来才发现,依然是自己问题。在传输文件前,首先将module加载上,然后把USB线插好,这时候是不会有设备文件的。要在uboot下输入dnw 50008000让uboot去连接主机,他会显示有字样。此时正常的话uboot会显示说什么已经链接上主机,等待下载东西。现在再去看设备文件,就有/dev/secbulk了。操作顺序一定要注意。

6、让uboot就绪后,在minicom下,输入./dnw filename 就是你想拷贝的那个文件名字,等待传输。

传输完成后,擦nandflash:nand erase 100000 500000把内核装载的地址位置那块擦出来。然后写刚才下好的那个内核映像文件(补充,我用的zImage,本来想试试uImage看看有什么不同的……以后再看)nand write.e 50008000 100000 500000。这俩500000都是size。100000是offset。

等待完成后就重启uboot下reset。就可以直接进入linux。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值