FL2440之yaffs2根文件系统移植

一、移植过程(成功)

busybox-1.19.4

cross3.4.1(FL2440关盘里的交叉编译器)或者4.3.2都可以的

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

    下载busybox-1.19.4-udhcp.patchcdbusybox-1.19.4

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

2. 修改Makefile

CROSS_COMPILE ?=

 ARCH ?=

改后的值为

CROSS_COMPILE?=arm-linux-

ARCH ?=arm

 在环境变量中添加bin的路径,如:PATH=$PATH:'/home/xxx/usr/local/arm/3.4.1/bin'


3. makemenuconfig

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

BuildBusyboxasastaticbinary(nosharedlibs)

Buildwith Large File Support (for accessing files > 2GB

InstallationOptions--->(./_install)Busyboxinstallationprefix<进入这个选项,输入busybox的安装路径,如:../rootf

BusyboxLibraryTuning--->

vi-style lineediting commands

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

4.Coreutils--->下找到ls相关的Allowuse of color to identify file types Produce colored ls output bydefault

BusyboxSettings--------------àBusyboxLibraryTuning------àTabcompletion



5. sudo make

出现问题了:

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

解决方法:

busybox应用里关闭ionice 选项

$makemeunconfig

选择下面的菜单:

MiscellaneousUtilities --->

[ ] 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(firstuseinthisfunction)

解决办法:

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:initializerelementisnotconstant

networking/interface.c:806:error: (near initialization for `ib_hwtype.type')

在文件interface.c中加入如下语句

#defineARPHRD_INFINIBAND 32            /*InfiniBand                  */

这个是从文件include/linux/if_arp.h中得到

 

4).

......parseerrorbefore'_u16'

......parseerror before 'jk'

......parseerror 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类型的定义改成了

structsock_filter /*Filterblock*/
{
       
unsignedshort code;  /*Actualfiltercode*/   
原来为__u16
       
unsignedchar jt; /*Jumptrue*/                      
       
unsignedchar jf; /*Jumpfalse*/
       
unsignedint k;     /*Genericmultiusefield*/
};

或者直接添加头文件#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(firstuseinthisfunction)

/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 includedfrom/opt/arm/3.4.1/bin/../lib/gcc/arm-linux/3.4.1/../../../../arm-linux/sys-include/linux/ext2_fs.h:20,

 

网上建议的解决方法是:

去掉

Linux SystemUtilities  --->

[ ] mkfs_ext2   

[ ] mkfs_vfat

 

我没有采纳,在percpu.h中定义了#defineGFP_KERNEL 0     (改值参考内核代码)

后面又出现了类似4中的问题,估计是u16,u32等类型未定义无法识别造成的parseerror before..错误,用类似方法得以解决,不必采用极端的注释掉的方法。

当然,最为理想的是包含头文件#include<linux/types.h>

6).

出错:linux/ext2_fs_sb.h342行出现的void__usr *data无法识别,添加头文件#include<linux/compiler.h>

 

6. make install

busybox-1.19.4目录下的_install中有我们需要的文件。

mkdir rootfs

cd rootfs

mkdir bin etcdev home lib mnt opt proc root sbin sys tmp usr var

cp -r _install/*.

rmlinuxrc  删掉linuxrc

 

7. 制作各种文件

linuxrc:

        rmlinuxrc

       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

FL2440根文件系统中的linuxrc也是修改过的脚本文件来的

 dev/

       cddev

       mknodconsole c 5 1

       mknodnull c 3 1

           这里简要介绍一下原因。虽然这两个设备文件在内核挂载完文件系统后,系统会利用mdev自动创建,可是在此之前,即在内核挂载文件系统之前,

           init进程会用到这两个设备  文件。如果没有这两个设备文件,会提示如下一些信息Warning: unable to open aninitial console

etc/

        cd../etc

       cp-r /arm/busybox-1.19.4/examples/bootfloppy/etc/* ./ 

       几个必要的文件inittab fstab init.dprofile网上的教程说要initab,但是要了initab之后,根文件系统是没有办法启动的,解决办法是去了initab文件。

  


 

      修改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脚本

      ifconfigeth0 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),会出现cannotrun /bin/bash: No such fileor directory”的错误

 

     新建sysconfig文件夹,在里面新建HOSTNAME文件,内容为:FL2440这里之所以创建该文件和相关内容,是为了在开机启动后,在控制台中可以看到类似的信息

8. 拷贝库文件:

     cdlib

    cp -f  -a  /usr/local/arm/3.4.1/arm-inux-/lib/.so*  ./

    rm–f libwv*  libuniconf*  这两个库文件一般很少用到,并且占用的大约8M的空间,为了节省内存,所以删掉。

9.  cd../..    到达busybox-1.19.4目录下

     chmod777 rootfs/*

     ./mkyaff2image rootfs rootfs.bin

生成跟文件系统

 

以上根文件系统没有包括触摸屏和Qt,移植后可以进入串口虚拟终端控制设备。

 

在这个过程中,开始我使用的是4.3.2版本的交叉编译器,

结果出现:

VFS: Mountedroot (yaffs filesystem).
Freeing init memory: 116K
Kernel panic- not syncing: Attempted to kill init!

 

        网上查询了很多资料,问了很多问题,有说需要在kernel中添加EABI选项的,也有说在busybox编译的时候加上gcc-march=armv4t的,也怀疑过是不是交叉编译器4.3.2版本过低改为了4.5.1,以及kernel传递的参数init=/linuxrc问题(上面的打印结果可以排除这个问题,因为VFS应该是已经找到了的),基本上能用到的办法都尝试完了,结果还是没有结果,折腾得不轻啊!!!!

      最后尝试了交叉编译器3.4.1,居然通了(尽管花了较长时间解决busybox的编译问题),有点惊喜,好曲折啊,差点放弃,直接用开发板自带的,不像搞了的。。。。。。

      版本为什么会影响这个,按道理说4.5.14.3.2应该向前兼容的啊,太奇怪了,等到后面再研究吧!!!!!

      总算一步一步自己搞了可以跑的根文件系统了,有点佩服自己的毅力!

总结:1.网上的资料很多,但是真正解决自己问题的有时候还是得自己寻找,在这过程中也可以随便熟悉各种错误类型,有利于总结经验。

           2. 如果其他编译成功的情况下,还有问题,考虑版本问题,缺少动态库等问题。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值