Linux移植,出现了很多不可预知的问题。后来在师父及其客服的帮助下,完美解决,没辜负我这几天的辛勤努力!我的内核是Linux-2.6.30.4,以EmbedSky_hello.c为例。
我是根据Linux移植手册一步步移植的,以下是我出现的问题:
问题1:在编译驱动模块时出现以下错误提示:
GZIP kernel/config_data.gz
IKCFG kernel/config_data.h
CC kernel/configs.o
make[3]: *** No rule to make target `net/ipv4/netfilter/ipt_ECN.c', needed by `net/ipv4/netfilter/ipt_ECN.o'. Stop.
make[2]: *** [net/ipv4/netfilter] Error 2
make[1]: *** [net/ipv4] Error 2
make: *** [net] Error 2
解决办法:本来移植手册里的选项如下所示:
我们仅需要添加这么多选项就够了,别的全部去除,但是里面有个默认选项不能去除,否则会出现编译内核镜像不成功的情况。
如果不选这个默认选项,编译内核镜像时出现以下问题:
drivers/net/dm9000.c: In function 'dm9000_probe':
drivers/net/dm9000.c:1356: error: 'struct net_device' has no member named 'open'
drivers/net/dm9000.c:1357: error: 'struct net_device' has no member named 'hard_start_xmit'
drivers/net/dm9000.c:1358: error: 'struct net_device' has no member named 'tx_timeout'
drivers/net/dm9000.c:1360: error: 'struct net_device' has no member named 'stop'
drivers/net/dm9000.c:1361: error: 'struct net_device' has no member named 'set_multicast_list'
drivers/net/dm9000.c:1363: error: 'struct net_device' has no member named 'do_ioctl'
make[2]: *** [drivers/net/dm9000.o] Error 1
make[1]: *** [drivers/net] Error 2
make: *** [drivers] Error 2
所以一定要加哦!
现在我用make modules编译驱动,出现以下问题:
make[1]: *** No rule to make target `|', needed by `firmware/dabusb/firmware.fw'. Stop.
make: *** [modules] Error 2
从网上搜了一下,用make M=drivers/char modules编译模块,成功生成.ko文件。那个开心。
问题2:我用insmod EmbedSky_hello.c来加载模块,出现以下问题:
EmbedSky_hello: version magic '2.6.30.4EmbedSky mod_unload ARMv4 ' should be '2.
6.30.4-EmbedSky mod_unload ARMv4 '
insmod: cannot insert 'EmbedSky_hello.ko': invalid module format
一看就知道是版本问题,然后make menuconfig进入内核配置,
General setup——>()Local version-append to kernel release,配置成(-EmbedSky)Local version-append to kernel release,就OK啦~
重新编译内核,驱动模块,将EmbedSky_hello.ko放到开发板中,重新加载insmod EmbedSky_hello.ko,又出现问题了:
EmbedSky_hello: Unknown symbol __aeabi_unwind_cpp_pr0
insmod: cannot insert 'EmbedSky_hello.ko': unknown symbol in module, or unknown
parameter
我相当郁闷了,通过客服,刚开始以为是交叉编译器的问题,可是测试后交叉编译器是正常的,快崩溃了,最后才知道,是我的开发板里烧的是光盘提供给的镜像,而我自己移植的驱动是在我自己编写的内核里生成.ko文件,导致了致命的错误,模块和内核镜像不匹配,后来烧入我自己的内核和文件系统,虽然其中经历了多番波折,总算守得云开见月明了,终于可以加载和卸载模块了!