内核编译成功,现在分享一下成功的喜悦以及坎坷的经历。
需要写一个驱动,由于开发板上烧录的是买时带着的镜像,无法在PC上搭建编译内核模块的环境,因为没有开发板的内核信息。于是我开始想自己编译内核。首先迅速搭建arm-linux-环境,我开始用的是crosstools_3.4.5_softfloat。
接下来配置环境变量,
$sudo gedit /etc/profile
在最后添加一行,
export PATH=$PATH:/usr/local/arm-linux/4.3.3/bin/:保存退出
输入$arm-(tab) 出现arm-linux链
环境搭建成功
再次解压内核我的内核版本是linux-2.6.30.4
开始内核编译,首先$make menuconfig
出错:很失败,之前的错误原因忘了记录。只能凭着回忆了。解决方法是安装
libncurses5-dev
接着make bzlmage
出错:
kernel/built-in.o(.text+0x7340): In function `sched_create_group':
kernel/sched.c:9406: undefined reference to `.L3576'
make: *** [.tmp_vmlinux1] 错误 1
找了大量资料没有找出个所以然来,把编译器换成4.4.3后解决问题。
在make modules中出现一下错误:
CC [M] drivers/media/video/em28xx/em28xx-audio.o
drivers/media/video/em28xx/em28xx-audio.c: In function 'em28xx_audio_init':
drivers/media/video/em28xx/em28xx-audio.c:466: error: implicit declaration of function 'snd_card_create'
make[4]: *** [drivers/media/video/em28xx/em28xx-audio.o] 错误 1
make[3]: *** [drivers/media/video/em28xx] 错误 2
make[2]: *** [drivers/media/video] 错误 2
make[1]: *** [drivers/media] 错误 2
make: *** [drivers] 错误 2
解决方法:在make menuconfig时去掉em28xx
net/ipv4/netfilter/ipt_ecn.c:99: error: 'IPT_ECN_OP_MATCH_CWR' undeclared (first use in this function)
net/ipv4/netfilter/ipt_ecn.c: At top level:
net/ipv4/netfilter/ipt_ecn.c:113: error: invalid application of 'sizeof' to incomplete type 'struct ipt_ecn_info'
make[3]: *** [net/ipv4/netfilter/ipt_ecn.o] 错误 1
make[2]: *** [net/ipv4/netfilter] 错误 2
make[1]: *** [net/ipv4] 错误 2
make: *** [net] 错误 2
解决方法:在make menuconfig中精简network support
ERROR: "ioport_map" [drivers/net/wireless/orinoco/spectrum_cs.ko] undefined!
ERROR: "ioport_unmap" [drivers/net/wireless/orinoco/spectrum_cs.ko] undefined!
ERROR: "ioport_map" [drivers/net/wireless/orinoco/orinoco_cs.ko] undefined!
ERROR: "ioport_unmap" [drivers/net/wireless/orinoco/orinoco_cs.ko] undefined!
ERROR: "ioport_unmap" [drivers/net/wireless/libertas/libertas_cs.ko] undefined!
ERROR: "ioport_map" [drivers/net/wireless/libertas/libertas_cs.ko] undefined!
ERROR: "__bad_udelay" [drivers/isdn/hisax/hisax.ko] undefined!
ERROR: "ioport_map" [drivers/char/tpm/tpm_atmel.ko] undefined!
make[1]: *** [__modpost] 错误 1
make: *** [modules] 错误 2
解决方法:1修改wireless配置2去掉tmp支持
在make modules install中权限出现问题,开始还以为,/lib/modules/2.6.30.4是相对路径在源码文件夹下,狂汗,犯这种低级错误,结果chmod 777后 怎么也找不到出错原因。后来在makefile中找到_modinst_
添加一句@echo "ln -s $(srctree) $(MODLIB)/build"才了解,驱动真正的去向。
末了说一句编译内核是一个体力活。