FL2440 Linux kernel + yaffs2根文件移植过程(二)

 

FL2440 Linux kernel + yaffs2根文件移植过程(二)

分类: 嵌入式   581人阅读  评论(1)  收藏  举报

上一篇文章中Kernel移植基本上没有什么大的问题,除了几处需要更改外(已经注明)

make zImage后,内核生成成功,下面是关于yaffs2根文件的移植,移植过程蜿蜒曲折,现现将成功移植过程讲解,后附过程与问题。

一、移植过程(成功)

busybox-1.19.4

cross3.4.1(FL2440关盘里的交叉编译器)

1. 下载busybox-1.19.4.tar.bz2,地址是 http://busybox.net/downloads

     下载busybox-1.19.4-udhcp.patch,cd busybox-1.19.4

     patch -p0<../busybox-1.19.4-udhcp.patch

2. 修改Makefile

CROSS_COMPILE ?=

 ARCH ?=

改后的值为

CROSS_COMPILE ?=/FL2440/usr/local/arm/3.4.1/bin/arm-linux-

ARCH ?=arm

 

3. make menuconfig

Busybox Settings --->  Build Options --->          

                                                                                •  Build Busybox as a static binary(no shared libs)        

                                                                                  •  Build with Large File Support (for accessing files > 2GB) 

                                    Installation Options --->       (./_install) Busybox installation prefix   <—进入这个选项,输入busybox的安装路径,如:../rootfs 

                                    Busybox Library Tuning --->  

                                                                    •  vi-style line editing commands 

                                                                   •  Fancy shell prompts  <—要选择这个选项:“Fancy shell prompts”,否则挂载文件系统后,无法正常显示命令提示符:“[\u@\h \W]#

4.  Coreutils --->下找到ls相关的          Allow use of color to identify file types 和     Produce colored ls output by default,

     Busybox Settings--------------à Busybox Library Tuning------à Tab completion

5. sudo make
出现问题了:

1).miscutils/ionice.c:16: error: 'SYS_ioprio_set' undeclared (first use in> this function)

解决方法:
在busybox应用里关闭 ionice 选项
$  make meunconfig 
选择下面的菜单:
Miscellaneous Utilities  --->    
 [ * ] ionice
按空格去掉这个选项
 
2).
miscutils/ubi_tools.c:63:26: mtd/ubi-user.h: No such file or directory
miscutils/ubi_tools.c: In function `ubi_tools_main':
miscutils/ubi_tools.c:133: error: `UBI_DEV_NUM_AUTO' undeclared (first use in this function)
解决办法:
在include下新建mtd目录,从linux-2.6.28.7/include/mtd拷贝文件ubi-user.h到该目录下
 
3).
networking/interface.c:806: error: `ARPHRD_INFINIBAND' undeclared here (not in a function)
networking/interface.c:806: error: initializer element is not constant
networking/interface.c:806: error: (near initialization for `ib_hwtype.type')
在文件interface.c中加入如下语句
#define ARPHRD_INFINIBAND 32            /* InfiniBand                   */
这个是从文件include/linux/if_arp.h中得到
 
4).
......parse error before '_u16'
......parse error before 'jk'
......parse error before k
networking/udhcp/dhcpc.c: In function `udhcp_raw_socket':
networking/udhcp/dhcpc.c:821: error: elements of array `filter_instr' have incomplete type
 
搜了一下百度,网上最多的解决方法是把networking都干掉,我根据提示,改了一下,将/FL2440/usr/local/arm/3.4.1/arm-linux/sys-include/llinux/filter.h中的sock_filter类型的定义改成了
struct sock_filter /* Filter block */
{
        unsigned short code;   /* Actual filter code */    原来为__u16
        unsigned char jt; /* Jump true */                      
        unsigned char jf; /* Jump false */
        unsigned int k;      /* Generic multiuse field */
};
或者直接添加头文件 #include <linux/types.h>
 
5).
/opt/arm/3.4.1/bin/../lib/gcc/arm-linux/3.4.1/../../../../arm-linux/sys-include/linux/percpu.h:45: error: `GFP_KERNEL' undeclared (first use in this function)
/opt/arm/3.4.1/bin/../lib/gcc/arm-linux/3.4.1/../../../../arm-linux/sys-include/linux/percpu.h:45: error: (Each undeclared identifier is reported only once
/opt/arm/3.4.1/bin/../lib/gcc/arm-linux/3.4.1/../../../../arm-linux/sys-include/linux/percpu.h:45: error: for each function it appears in.)
In file included from /opt/arm/3.4.1/bin/../lib/gcc/arm-linux/3.4.1/../../../../arm-linux/sys-include/linux/ext2_fs.h:20,
 
网上建议的解决方法是:
去掉
Linux System Utilities  --->
[ ] mkfs_ext2   
[ ] mkfs_vfat
 
我没有采纳,在percpu.h中定义了#define GFP_KERNEL 0     (改值参考内核代码)
后面又出现了类似4中的问题,估计是u16,u32等类型未定义无法识别造成的parse error before..错误,用类似方法得以解决,不必采用极端的注释掉的方法。
当然,最为理想的是包含头文件#include <linux/types.h>
6).
出错:linux/ext2_fs_sb.h中342行出现的void __usr *data无法识别,添加头文件#include <linux/compiler.h>
 
6. make install
busybox-1.19.4目录下的_install中有我们需要的文件。
mkdir rootfs
cd rootfs
mkdir bin etc dev home lib mnt opt proc root sbin sys tmp usr var
cp -r _install/* .
rm linuxrc   删掉linuxrc

7. 制作各种文件
linuxrc:
        rm linuxrc
        gedit linuxrc
*******************************************************      
   linux文件的内容为:
       #!/bin/sh
      echo "testing" #用于测试
       /bin/mount -t proc proc /proc
      /bin/mount -t sysfs sysfs /sys
      /sbin/mdev -s
      exec /sbin/init
********************************************************
以下是单独创建,并不是在Linuxrc文件中
  dev/ 
 在Dev 文件下通过mknod 命令创建 console, null 两个文件
       #cd dev
       #mknod console c 5 1
       #mknod null c 3 1
            这里简要介绍一下原因。虽然这两个设备文件在内核挂载完文件系统后,系统会利用mdev自动创建,可是在此之前,即在内核挂载文件系统之前,
            init进程会用到这两个设备   文件。如果没有这两个设备文件 ,会提示如下一些信息 Warning: unable to open an initial console

etc 下文件的增加
etc/
        cd ../etc
       cp -r /arm/busybox-1.19.4/examples/bootfloppy/etc/* ./ 
        几个必要的文件 inittab fstab   init.d profile
  
         inittab(Linux的init进程是根据/etc/inittab文件来创建其他子进程的。所以我们要修改inittab文件, 内容如下:)
        console::sysinit:/etc/init.d/rcS 
        ttyS0::respawn:-/bin/sh
        s3c2410_serial0::askfirst:-/bin/sh 
        :: once:/usr/sbin/telnetd  -l  /bin/login
 
       修改 fstab文件。改文件是用于控制所要挂载的文件系统。 内容如下: 
       #device  mount-point type  options  dump fsck order
          proc   /proc  proc     defaults    0     0 
         tmpfs  /tmp      tmpfs   defaults     0     0 
         sysfs   /sys      sysfs     defaults     0     0 
         tmpfs   /dev      tmpfs    defaults     0     0 
         var   /dev      tmpfs    defaults     0     0
 
     修改 init.d/rcS文件。这是一个脚本文件,在这里我们可以添加自动执行的命令,常用于配置ip地址,挂载文件系统
        #!/bin/sh 
         PATH=/bin:/sbin:/usr/bin:/usr/sbin 
         runlevel=S 
         prevlevel=N 
        umask  022        
       export  PATH  runlevel  prevlevel 
        mount  -a #挂载fstab文件指定的文件系统
         mkdir  /dev/pts  #
        mount  -t  devpts  devpts  /dev/pts #devpts用于支持外部网络连接(telnet)的虚拟终端
      echo  /sbin/mdev  >  /proc/sys/kernel/hotplug  #设置内核,当有设备插拔时调用/sbin/mdev程序
      mdev  -s  #在/dev目录下生成内核支持的所有设备的结点
     mkdir  -p  /var/lock 
     # qtopia & #启动qtopia脚本
      ifconfig eth0 192.168.0.15 up #配置ip地址 
       /bin/hostname  -F  /etc/sysconfig/HOSTNAME 
 
      profile 文件(环境变量):
        # Ash  profile 
       # vim:  syntax=sh 
       # No  core  files  by  default
       #ulimit  -S  -c  0  >  /dev/null  2>&1 
       USER="`id  -un`" 
        LOGNAME=$USER 
        PS1='[\u@\h  \W]# '    #用于显示[root@FL2440 /]# PATH=$PATH 
        HOSTNAME=`/bin/hostname` 
        echo  " Processing  /etc/profile... " 
        echo  "Done" 
        export  USER  LOGNAME  PS1  PATH
        echo  " Processing  /etc/profile... " 
        echo  "Done"  export  USER  LOGNAME  PS1  PATH
     拷贝到 passwdgroupshadow当前目录下。 
        # cp  /etc/passwd  ./ 
       # cp  /etc/group  ./ 
       # cp  /etc/shadow  ./ 
       把passwd文件中的第一行:root:x:0:0:root:/root:/bin/bash中的/bin/bash,改成/bin/ash,因为文件系统的bin目录下没有bash这个命令,而是用ash代替bash,所以在用用户名密码登录的时候(如telnet),会出现“cannot run /bin/bash: No such fileor directory”的错误
 
      新建 sysconfig文件夹,在里面新建 HOSTNAME文件,内容为:FL2440 这里之所以创建该文件和相关内容,是为了在开机启动后,在控制台中可以看到类似的信息
8. 拷贝库文件:
     cd lib
    cp  -f  -a  /usr/local/arm/3.4.1/arm-inux-/lib/.so*  ./
    rm –f libwv*  libuniconf*   这两个库文件一般很少用到,并且占用的大约8M的空间,为了节省内存,所以删掉。
9.  cd ../..    到达busybox-1.19.4目录下
     chmod 777 rootfs/*
     ./mkyaff2image  rootfs rootfs.bin
生成跟文件系统
 
以上根文件系统没有包括触摸屏和Qt,移植后可以进入串口虚拟终端控制设备。
 
在这个过程中,开始我使用的是4.3.2版本的交叉编译器,
结果出现:
VFS: Mounted root (yaffs filesystem).
Freeing init memory: 116K
Kernel panic - not syncing: Attempted to kill init!
 
********************* 我在移植2.6.32.61内核时, 也出现过此提示,但在 内核中使用*************
# make menuconfig
   ----->kernel feature
        ------>[*] Use the Arm EABI compile to the kernel 
选择此项就可以编译过去了。
我使用的交叉编译工具版本为:4..2.2
******************************************************************************************************************
*******************************************************************************************************************************************
在编译中也遇到 
Warining: unable to open an initial console ...
Failed to execute /linuxrc 
Kernel panic : not syscing:no init found Try passing init ...
网上多数是说增加 cosole, null 两个文件,但这个两个文件已经存在。反复查找多次发现,原来是在NandFlash分区的offset, size 的赋值弄反了。
所以:该问题查找点: 一个是console,null 是否存在。一个是nandflash分区是否正确。
*****************************************************************************************************************************************

         网上查询了很多资料,问了很多问题,有说需要在kernel中添加EABI选项的,也有说在busybox编译的时候加上gcc -march=armv4t的,也怀疑过是不是交叉编译器4.3.2版本过低改为了4.5.1,以及kernel传递的参数init=/linuxrc问题(上面的打印结果可以排除这个问题,因为VFS应该是已经找到了的),基本上能用到的办法都尝试完了,结果还是没有结果,折腾得不轻啊!!!!
       最后尝试了交叉编译器3.4.1,居然通了(尽管花了较长时间解决busybox的编译问题),有点惊喜,好曲折啊,差点放弃,直接用开发板自带的,不像搞了的。。。。。。
       版本为什么会影响这个,按道理说4.5.1和4.3.2应该向前兼容的啊,太奇怪了,等到后面再研究吧!!!!!
       总算一步一步自己搞了可以跑的根文件系统了,有点佩服自己的毅力!
总结:1. 网上的资料很多,但是真正解决自己问题的有时候还是得自己寻找,在这过程中也可以随便熟悉各种错误类型,有利于总结经验。
            2. 如果其他编译成功的情况下,还有问题,考虑版本问题,缺少动态库等问题。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值