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
dev/
cd dev
mknod console c 5 1
mknod null c 3 1
这里简要介绍一下原因。虽然这两个设备文件在内核挂载完文件系统后,系统会利用mdev自动创建,可是在此之前,即在内核挂载文件系统之前,
这样配置过后你启动文件系统后还是会出错的,还要继续创建两个设备节点
由于后面会显示不能打开
can't open /dev/s3c2410_serial0: No such file or directory
can't open /dev/ttyS0: No such file or directory
(所以这儿还要创建两个设备节点)
#mknod s3c2410_serial0 c 204 64
#mknod ttyS0 c 4 0
init进程会用到这两个设备 文件。如果没有这两个设备文件 ,会提示如下一些信息 Warning: unable to open an initial console
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
拷贝到
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),会出现“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!
网上查询了很多资料,问了很多问题,有说需要在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. 如果其他编译成功的情况下,还有问题,考虑版本问题,缺少动态库等问题。