Linux移植之驱动编译出现的问题


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

  解决办法:本来移植手册里的选项如下所示:

Linux移植之驱动编译出现的问题

我们仅需要添加这么多选项就够了,别的全部去除,但是里面有个默认选项不能去除,否则会出现编译内核镜像不成功的情况。

如果不选这个默认选项,编译内核镜像时出现以下问题:

 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文件,导致了致命的错误,模块和内核镜像不匹配,后来烧入我自己的内核和文件系统,虽然其中经历了多番波折,总算守得云开见月明了,终于可以加载和卸载模块了!

相关内容