编译busybox需要用arm-linux-gcc3.XX 编译器,用 arm-unknown-linx-gnueabi-gcc会出问题。
1.从http://busybox.net/下载busybox-1.17.2源码包解压后打上最新版本补丁。进入目录,修改Makefile
164行左右修改CROSS_COMPILE := arm-linux-
189行左右改成ARCH := arm
2.修改源代码
修改networking/interface.c文件,其中添加:
#defineARPHRD_INFINIBAND 32
修改networking/libiproute/ipaddress.c
166行附近加入#ifdef IFLA_OPERSTATE
printf("master%s ", ll_idx_n2a(*(int*)RTA_DATA(tb[IFLA_MASTER]), b1));
}
#endif
#ifdefIFLA_OPERSTATE
if(tb[IFLA_OPERSTATE]) {
staticconst char operstate_labels[] ALIGN1 =
"UNKNOWN\0""NOTPRESENT\0""DOWN\0""LOWERLAYERDOWN\0"
175行附件加入#endif
*(uint8_t*)RTA_DATA(tb[IFLA_OPERSTATE])));
}
#endif
if(G_filter.showqueue)
print_queuelen((char*)RTA_DATA(tb[IFLA_IFNAME]));
修改networking/libiproute/iplink.c(最左边是行数 )
274 274 return ipaddr_list_or_flush(argv, 0);
275 275 }
276 276
277 #ifdef IFLA_LINKINFO
277 278 #ifndef NLMSG_TAIL
278 279 #define NLMSG_TAIL(nmsg) \
279 280 ((struct rtattr *) (((void *) (nmsg)) +NLMSG_ALIGN((nmsg)->nlmsg_len)))
… …
360 361 return 2;
361 362 return 0;
362 363 }
364#endif
363 365
364 366 /* Return value becomes exitcode. It's okay to not return at all*/
365 367 int do_iplink(char **argv)
366 368 {
367 369 static const char keywords[] ALIGN1 =
370#ifdef IFLA_LINKINFO
368 371 "add\0""delete\0""set\0""show\0""lst\0""list\0";
372#else
373 "set\0""show\0""lst\0""list\0";
374#endif
369 375 if (*argv) {
370 376 smalluint key = index_in_substrings(keywords,*argv);
371 377 if (key > 5) /* invalid argument */
372 378 bb_error_msg_and_die(bb_msg_invalid_arg,*argv, applet_name);
373 379 argv++;
380#ifdef IFLA_LINKINFO
374 381 if (key <= 1) /* add/delete */
375 382 return do_change(argv, key ? RTM_DELLINK: RTM_NEWLINK);
376 383 else if (key == 2) /* set */
384#else
385 if (key == 0) /* set */
386 #endif
377 387 return do_set(argv);
378 388 }
379 389 /* show, lst, list */
3.目录下执行makemenuconfig 进入配置单
BusyboxSettings --->
BuildOptions --->
[*]Build BusyBox as a static binary (no shared libs) //这里编译为静态库
[] Build with Large File Support //这里要去掉这一项
()Cross Compiler perfix //设置交叉编译器路径
InstallationOptions --->
[*]Don't use /usr //不安装到系统的usr目录下,以解压目录下的_install来代替
LinuxSystem Utilities --->
[] mkfs_ext2
[] mkfs_vfat //这两项不选,否则编译会报错
别的选项工具自己需要进行选择
MiscellaneousUtilities --->
[] ionice //去掉,否则编译报错
其他选项根据个人需要
NetworkingUtilities --->
可以去除一些不必要的选项
保存配置文件为.config
4.完成后编译
make
makeinstall
最终在_install文件夹下生存了工具包
5.制作文件系统
新建一个目录root
把_install目录下的文件都复制过来,并建立相关目录
mkdirroot
cp-arf busybox-1.17.2/_install/* root/
cdroot
mkdirdev etc home lib mnt opt proc tmp var
向各目录中添加文件系统所需的目录或文件,
这里要注意各种文件的权限,一般都设为 777, 命令是
“chmod777 文件名”
dev目录,创建两个设备文件:
#mknodconsole c 5 1
#mknodnull c 1 3
etc目录,创建以下文件:
group:
root:*:0:
daemon:*:1:
bin:*:2:
sys:*:3:
adm:*:4:
tty:*:5:
disk:*:6:
lp:*:7:lp
mail:*:8:
news:*:9:
uucp:*:10:
proxy:*:13:
kmem:*:15:
dialout:*:20:
fax:*:21:
voice:*:22:
cdrom:*:24:
floppy:*:25:
tape:*:26:
sudo:*:27:
audio:*:29:
ppp:x:99:
500:x:500:plg
501:x:501:fa
inittab文件:
#/etc/inittab
::sysinit:/etc/init.d/rcS
console::askfirst:-/bin/sh
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount-a -r
mime.types暂时为空
passwd:系统密码文件,内容如下:
root::0:0:root:/:/bin/sh
ftp::14:50:FTPUser:/var/ftp:
bin:*:1:1:bin:/bin:
daemon:*:2:2:daemon:/sbin:
nobody:*:99:99:Nobody:/:
gcx::502:502:LinuxUser,,,:/home/gcx:/bin/sh
sysconfig/HOSTNAME:主机名称
EMA2440
fstab:系统挂载文件系统列表
#device mount-point type options dump fsck order
none /proc proc defaults 0 0
none /dev/pts devpts mode=0622 0 0
tmpfs /dev/shm tmpfs defaults 0 0
init.d/rcS:系统启动加载项
#!/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
runlevel=S
prevlevel=N
umask022
exportPATH runlevel prevlevel
#
# TrapCTRL-C &c only in this shell so we can interrupt subprocesses.
#
/bin/mount-t proc none /proc
/bin/mount-t tmpfs none /tmp
/bin/mount-t tmpfs none /var
/bin/mkdir-p /var/log
/bin/hostname-F /etc/sysconfig/HOSTNAME
mdev.conf:mdev 设备配置文件,暂时为空。
net.conf:网络配置文件,暂时为空。
profile:用户环境配置文件,内容如下:
# Ashprofile
# vim:syntax=sh
# Nocore files by default
#ulimit-S -c 0 > /dev/null 2>&1
USER="`id-un`"
LOGNAME=$USER
PS1='[\u@\h\W]\# '
PATH=$PATH:/usr/local/bin
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
HOSTNAME=`/bin/hostname`
exportUSER LOGNAME PS1 PATH LD_LIBRARY_PATH
resolv.conf:DNS 配置文件,内容如下:
nameserver61.144.56.100
至此dev目录内容结束
"home"目录:创建一个gcx 目录,与etc 目录 passwd文件中的 gcx 相对应
"lib"目录:这个里面放的都是库文件,直接从交叉编译器的库文件目录中拷贝过来:
cp-arf /usr/local/arm/3.4.1/arm-linux/arm-linux/lib/*so*/home/hu/development/root/lib/
为了适当缩减目录大小,可只拷贝常用的库文件
6使用yaffs制作工具制作文件系统镜像
下载工具mkyaffs2image.tgz
把mkyaffs2image解压缩到development目录
./mkyaffs2imageroot/ root.bin
镜像制作完成
7.用u-boot下载镜像到开发板
启动开发板,使其停在uboot 命令行下,并让其交叉网线连到开发主机,执行下面的命令:
tftp30008000 root.bin
//用tftp将yaffs2文件系统下载到内存的 0x30008000位置
nanderase 0x250000 0x3dac000
//擦除Nand的文件系统分区
nandwrite.yaffs2 0x30008000 0x250000 0x8f5c20 //将内存中的yaffs2文件系统写入Nand的文件系统分区,注意这里
的 0x8f5c20是yaffs2文件系统的实际大小(可以在tftp传送完后可以看到),要写正确,否则会形成假坏块
至此,文件系统移植成功,用root=/dev/mtdblock2init=/linuxrc console=ttySAC0 rootfstype=yaffs mem=64Mrw作为启动参数即可通过yaffs2文件系统启动内核。
本文部分参考了以下博客:
http://blog.csdn.net/huihui1988/article/details/5867067