一、移植过程(成功)
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.patch,cdbusybox-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.h中342行出现的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
拷贝到passwd、group、shadow当前目录下。
#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.1和4.3.2应该向前兼容的啊,太奇怪了,等到后面再研究吧!!!!!
总算一步一步自己搞了可以跑的根文件系统了,有点佩服自己的毅力!
总结:1.网上的资料很多,但是真正解决自己问题的有时候还是得自己寻找,在这过程中也可以随便熟悉各种错误类型,有利于总结经验。
2. 如果其他编译成功的情况下,还有问题,考虑版本问题,缺少动态库等问题。