Chinaunix首页 | 论坛 | 博客
  • 博客访问: 34120
  • 博文数量: 11
  • 博客积分: 450
  • 博客等级: 下士
  • 技术积分: 130
  • 用 户 组: 普通用户
  • 注册时间: 2009-09-14 14:38
文章分类
文章存档

2009年(11)

我的朋友

分类: LINUX

2009-10-23 12:14:10

 

1 内核编译命令

 

编译非压缩内核: make Image  

编译压缩内核:   make zImage  

编译可被u-boot支持的内核: make uImage
最后生成的内核都在 $(src_tree)/arch/arm/boot目录下

 

2 make uImage

 

需要使用u-boot提供的mkimage工具,把这个文件拷贝到/usr/bin/bin目录下

,否则会有“mkimage找不到”的错误。

 

makeimage软件内部使用了mmap()函数,这个函数对NTFS文件系统中的文件操作时会失败(使用的是Fedora Core 7,不知道别的linux版本是否也一样),显示“不能映射文件”错误。所以最好不要在NTFS文件系统上构建内核,或者把内核编译过程中生成的zImage拷贝到非NTFS文件系统上,再调用mkimage处理。

 

一个比较好的解决方案是修改$(src_tree)/arch/arm/boot/Makefile中产生uImage的部分:

 

$(obj)/uImage: $(obj)/zImage FORCE

    $(call if_changed,uimage)

    @echo '  Image $@ is ready'

 

方法一:使用Image

# Method 1 : Image->gzip->add  u-boot header

$(obj)/uImage: /tftpboot/u9260.img

/tftpboot/u9260.img:    $(obj)/Image FORCE

    cat  $<  | gzip -9  > $(obj)/Image.gz

    mkimage  -A arm  -O linux  -T kernel  -C gzip -a $(LOADADDR) -e $(LOADADDR) \

             -n 'Linux-$(KERNELRELEASE)' -d $(obj)/Image.gz  $@

    rm -f  $(obj)/Image.gz

    @echo '  Image $@ is ready'

 

方法二:使用zImage  

# Method 2 : zImage->add u-boot header

$(obj)/uImage:  /tftpboot/u9260.img

/tftpboot/u9260.img:    $(obj)/zImage FORCE

    $(call if_changed,uimage)

    @echo '  Image $@ is ready'

 

3  EABI

使用AT91SAM9260EK的缺省配置编译内核,制作根文件系统,下载到AT9260单板,启动过程中出现“kernel panic: not syncing attempted to kill init”信息,然后死机。

经检查发现,ramdisk挂载正常,很可能是busybox执行失败。

 

怀疑是共享库的问题,将busybox静态编译链接,故障依旧。

换用一个老版本的根文件系统映象,可以正常启动。

 

后来上网搜索了一些相关信息,找到了解决问题的途径。 原因在于:编译内核和busybox使用的编译器是arm-linux-gcc 4.3.2,而这个编译器默认是打开“EABI选项”的,这样编译出来的busybox就是EABI的。但是内核编译的时候,默认是把“EABI选项”关掉的。所以busybox和内核无法正常配合。把“EABI选项”打开,重新编译内核后,一切正常。

 

阅读(2174) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~