大家好,又见面了,我是你们的朋友全栈君。
转自http://blog.csdn.net/denlee/archive/2008/04/06/2254192.aspx
这几天在使用Busybox制作FS2410开发板的CRAMFS文件系统,由于开始 下载的是Busybox1.10,每次下载到开发板中,然后启动总是出现”Failed to execute /linuxrc. Attempting defaults…“的错误。到网上查了大量的资料,并做了大量的实验,发现都不能成功。今天下午突然发现一个能够仿真arm的软件qemu,在Ubuntu中的安装方法:sudo apt-get install qemu,Busybox编译后,可以通过arm仿真来测试:qemu-arm ./busybox ls,如果成功,则会显示当前目录下的文件列表。我对Busybox1.10编译后的结果进行测试,发现出现错误:
qemu: unhandled CPU exception 0x8 – aborting R00=001c596c R01=00000000 R02=001c5960 R03=00000001 R04=000cbf94 R05=00000000 R06=00000000 R07=00000000 R08=000cbfdc R09=000cbf94 R10=00000000 R11=00000000 R12=ffff0fff R13=b7d6c470 R14=000d4588 R15=ffff0fa0 PSR=20000010 –C- A usr32 ffff0fa0 s00=00000000( 0) s01=00000000( 0) d00=0000000000000000( 0) s02=00000000( 0) s03=00000000( 0) d01=0000000000000000( 0) s04=00000000( 0) s05=00000000( 0) d02=0000000000000000( 0) s06=00000000( 0) s07=00000000( 0) d03=0000000000000000( 0) s08=00000000( 0) s09=00000000( 0) d04=0000000000000000( 0) s10=00000000( 0) s11=00000000( 0) d05=0000000000000000( 0) s12=00000000( 0) s13=00000000( 0) d06=0000000000000000( 0) s14=00000000( 0) s15=00000000( 0) d07=0000000000000000( 0) s16=00000000( 0) s17=00000000( 0) d08=0000000000000000( 0) s18=00000000( 0) s19=00000000( 0) d09=0000000000000000( 0) s20=00000000( 0) s21=00000000( 0) d10=0000000000000000( 0) s22=00000000( 0) s23=00000000( 0) d11=0000000000000000( 0) s24=00000000( 0) s25=00000000( 0) d12=0000000000000000( 0) s26=00000000( 0) s27=00000000( 0) d13=0000000000000000( 0) s28=00000000( 0) s29=00000000( 0) d14=0000000000000000( 0) s30=00000000( 0) s31=00000000( 0) d15=0000000000000000( 0) FPSCR: 00000000 qemu: uncaught target signal 6 (Aborted) – exiting |
说明,所编译得到的busybox不能使用在arm处理器,由于时间关系就放弃了使用Buxybox1.10版本。后又尝试了Busybox1.5.x,发现有同样的问题。(后来和1.00版本对照,发现去掉了对devfs的支持)
于是使用FS2410开发版自带的源码中的Busybox1.00版本,编译后仿真没有问题,生成cramfs文件系统后下载、启动也正常,只是会出现“/bin/sh: can’t access tty; job control turned off”的问题,查阅了一些资料,发现都不能很好的解决这个问题。于是下载了Busybox1.1.3版本,编译、生成文件系统、下载、启动,一切正常,讲一讲过程:
1.下载BusyBox 1.1.3
2. 执行make menuconfig,然后进行设置,我截了几张图,这几张图就是在进行配置时需要重点注意的地方:
(1)在General Configuration中,一定要选择“Support for devfs”选项,现在的Busybox新版本去掉了这个选项,不过应该可以通过修改配置文件加入。
(2)在Build Options选项中,选择使用“静态库”以及设置交叉编译工具的PREFIX。
(3)在Linux System Utilities选项中,“Support loopback mounts”和“Support for the old /etc/mtab file”2个选项应该选中。
(4)在Init Utilities选项中,“Support reading an inittab file”应该选中,这样可以根据自己编写的inittab文件初始化;“Support running commands with a controlling-tty”应该选中,否则会提示非常困扰的“/bin/sh: can’t access tty; job control turned off”的提示,尽管可以进入控制台命令行。
(4)在Shell选项中,应该选中默认shell:ash,否则不会生成sh,导致不能解释脚本文件。
(5)其他的选项根据自己的需要设置。
3. 配置完成后,退出保存(最好备份.config文件以供后用),然后开始生成,执行make TARGET_ARCH=arm;此处的TARGET_ARCH是必须的。生成完成后使用qemu-arm测试:qemu-arm ./busybox ls,如果没有错误的话,会显示出 当前目录下的文件列表。
说明:在生成的过程中,提示了“/mnt/extdisk/embedded/busybox-1.1.3/include/bbconfigopts.h:28 hmm, untermina”错误,分析相应的文件,发现应该是一个配置包含文件,在配置后保存在.config文件中,因此这个文件中的内容应该不是关键内容,因此我将此文件清空保存,然后重新执行上面的生成命令,成功。
4. 生成结束后,执行make install,生成一个_install文件夹,内有一个linuxrc文件和bin、sbin、usr三个文件夹,删除linuxrc,将三个文件夹打包。
5. 准备生成cramfs文件系统:
(1)创建一个文件夹,比如rootfs,转到rootfs,执行命令mkdir bin dev etc home lib mnt proc sbin sys tmp var usr,建立相应的文件夹,再建立etc下的init.d文件夹。
(2)准备启动所需的文件:linuxrc、rcS、inittab、fstab四个文件;
linuxrc文件:
----------------------------------------------
#!/bin/sh
echo “mount /etc as ramfs”
/bin/mount -f -t cramfs -o remount,ro /dev/bon/2 /
/bin/mount -t ramfs ramfs /var
/bin/mkdir -p /var/tmp
/bin/mkdir -p /var/run
/bin/mkdir -p /var/log
/bin/mkdir -p /var/lock
/bin/mkdir -p /var/empty
#/bin/mount -t usbdevfs none /proc/bus/usb
exec /sbin/init
------------------------------------------------
rcS文件:
———————————————————————————–
#!/bin/sh
/bin/mount -a
———————————————————————————–
这两个文件生成后,应该使其具有执行的权限,可使用chmod 775 linuxrc rcS来修改,linuxrc应该放在rootfs根目录,rcS应该放在rootfs/etc/init.d/目录。
inittab文件:
-------------------------------------------------
# This is run first except when booting
::sysinit:/etc/init.d/rcS
# Start an “askfirst” shell on the console
#::askfirst:-/bin/bash
::askfirst:-/bin/sh
# Stuff to do when restarting the init process
::restart:/sbin/init
# Stuff to do before rebooting
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r
-------------------------------------------------
fstab文件:
-------------------------------------------------
none /proc proc defaults 0 0
none /dev/pts devpts mode=0622 0 0
tmpfs /dev/shm tmpfs defaults 0 0
-------------------------------------------------
这两个文件应该放在rootfs/etc/目录,应该注意其权限问题。
(3)如果使用linux 2.6.xx内核,应该实现创建节点console、null。转到rootfs/dev/目录来创建:
sudo mknod console c 5 1
sudo mknod null c 1 3
否则就会提示“Warning: unable to open an initial console.
Kernel panic – not syncing: Attempted to kill init!”的类似错误。
(4)将刚才在busybox的_install下的三个文件夹的打包文件复制到rootfs目录,解压后删除打包文件。
(5)也可以将一些常用的lib文件复制到rootfs/lib/目录下,比如:ld-2.5.so libc-2.5.so libcrypt.so.1 libgcc_s.so.1 libm.so.6 ld-linux.so.3 libcrypt-2.5.so libc.so.6 libm-2.5.so等文件或符号连接,在复制时应该注意采用图形化的界面复制活打包后解包方式复制。
(6)转到rootfs的上一级目录,使用mkcramfs制作文件系统:./mkcramfs rootfs xxxxx.cramfs,然后下载、少录、启动,成功,如下图所示:
6. 后记
(1)qemu-arm仿真工具
花费了2天多的时间来使用Busybox制作文件系统,时间有点长,主要是开始走了弯路,使用Busybox1.10版本,当时不太清楚有qemu-arm仿真arm的工具,借助qemu-arm仿真工具可以很方便的验证自己的busybox编译结果是否正确,可以节省很多时间。就如刚开始我使用busybox1.10版本,没有借助qemu-arm仿真,下载后启动出现”Failed to execute /linuxrc. Attempting defaults…“的错误,这个错误很难排除,这几天一有时间就查资料看解决这个问题的方法,只可惜浪费了时间。
(2)交叉编译工具
看网上有资料说,linux内核以及busybox最好使用相同的交叉编译工具编译,否则可能会出现问题。我使用的是不同版本的交叉编译工具,没有出现问题。因为linux2.6.24内核是几天前编译的,采用的是4.2.1版本;今天编译busybox1.1.3用的是3.3.2版本。
(3)BusyBox
Linux2.6.xx内核取消了devfs的支持,Busybox也跟上了这个步伐,前面我也提到过,对于busybox的新版本应该可以通过修改配置文件十七支持devfs,具体方法:修改Config.in文件,找到menu “General Configuration”,然后在其后适当位置加入如下内容:
config CONFIG_FEATURE_DEVFS
bool “Support for devfs”
default n
help
Enable if you want BusyBox to work with devfs.
这样,在进行配置时就会出现“Support for devfs”选项。只是我加入后,在进行编译,所得到的busybox也没有在qemu-arm仿真中通过。
转自http://apps.hi.baidu.com/share/detail/1529790
转自http://blog.csdn.net/huihui1988
///
宿主机:Fedora13
目标 机:s3c2440
交叉 编译 器:arm-linux-gcc- 3.4.1
交叉编译器路径:/usr/local/arm/3.4.1
busybox版本:1.17.2
一、准备工作
1、配置交叉编译环境
从http://www.handhelds.org/download/projects/toolchain/ 下 载arm-linux-gcc-3.4.1.tar.bz2
解压:
将交叉编译工具装到/usr/local下
2、从http://www.busybox.net/downloads/下载最新的busybox1.17.2版本
二、配置
1、修改Makefile
进入busybox的解压目录,
vim Makefile,将
ARCH ?= $(SUBARCH) 改为
ARCH ?= arm
CROSS_COMPILE ?=改为
CROSS_COMPILE ?= /usr/local/arm/3.4.1/bin/arm-linux-(根据你自己的路径定义)
2、配置busybox的相关工具
执行 make menuconfig,进入配置菜
- Busybox Settings —>
- Build Options —>
- [*] Build BusyBox as a static binary (no shared libs) //这里编译为静态库
- [ ] Build with Large File Support //这里要去掉这一项
- () Cross Compiler perfix //设置交叉编译器路径
- Installation Options —>
- [*] Don’t use /usr //不安装到系统的usr目录下,以解压目录下的_install来代替
- Linux System Utilities —>
- [ ] mkfs_ext2
- [ ] mkfs_vfat //这两项不选,否则编译会报错
- 别的选项工具自己需要进行选择
- Miscellaneous Utilities —>
- [ ] ionice //去掉,否则编译报错
- 其他选项根据个人需要
- Networking Utilities —>
- 可以去除一些不必要的选项
3、编译
下面进行编译:make ARCH=arm CROSS_COMPILE=/usr/local/arm/3.4.1/bin/arm-linux-
这里,我们会发现出错了,错误信息如下:
networking/interface.c:807: error: `ARPHRD_INFINIBAND’ undeclared here (not in a function)
通过查看内核源代码目录中的“include/linux/ifarp.h”文件可得知“ARPHRDINFINIBAND”的值为“32”,然后 修改“networking/interface.c”文件,在其中添加:
#define ARPHRD_INFINIBAND 32 /* InfiniBand */
继续编译,发现还是有错误:
networking/libiproute/ipaddress.c:167: error: `IFLA_OPERSTATE’ undeclared (first use in this function)
这个错误其实是busybox的一个bug,一直未解决,我们对代码做如下修改:
networking/libiproute/ipaddress.c
- 164 164 printf(“master %s “, ll_idx_n2a(*(int*)RTA_DATA(tb[IFLA_MASTER]), b1));
- 165 165 }
- 166 166 #endif
- 167 #ifdef IFLA_OPERSTATE
- 167 168 if (tb[IFLA_OPERSTATE]) {
- 168 169 static const char operstate_labels[] ALIGN1 =
- 169 170 “UNKNOWN/0”“NOTPRESENT/0”“DOWN/0”“LOWERLAYERDOWN/0”
- … …
- 171 172 printf(“state %s “, nth_string(operstate_labels,
- 172 173 *(uint8_t *)RTA_DATA(tb[IFLA_OPERSTATE])));
- 173 174 }
- 175 #endif
- 174 176 if (G_filter.showqueue)
- 175 177 print_queuelen((char*)RTA_DATA(tb[IFLA_IFNAME]));
- 176 178
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 */
完成后继续编译
执行 make install,终于在_install文件夹下生成了工具包
4、制作文件系统
可以先创建一个工作目录,如myroot,在工作目录下 创建以下目录:bin sbin dev etc lib home root usr var proc mnt tmp sys
执行 mkdir bin sbin dev etc lib home root usr var proc mnt tmp sys
在etc 下面要写两个文件fstab inittab 和一个文件夹init.d
(a) fstab 的内容是:
- proc /proc proc defaults 0 0
- tmpfs /tmp tmpfs defaults 0 0
- sysfs /sys sysfs defaults 0 0
- tmpfs /dev tmpfs defaults 0 0
(b) fstab 文件的作用
文 件/etc/fstab 存放的是系统中的文件系统信息。当正确的设置了该文件,则可以通过”mount /directoryname” 命令来加载一个文 件系统,每种文件系统都对应一个独立的行,每行中的字段都有空格或tab 键分开。同时fsck 、mount 、umount 的等命令都利用该程序。
inittab 的内容是:
- #/etc/inittab
- ::sysinit:/etc/init.d/rcS
- ::askfirst:-/bin/sh
- ::ctrlaltdel:/sbin/reboot
- ::shutdown:/bin/umount -a -r
(c) init.d/rcS 文件的内容:
- #!/bin/sh
- ifconfig eth0 192.168.1.17
- mount -t tmpfs mdev /dev
- mkdir /dev/pts
- mount -t devpts devpts /dev/pts
- mount -t sysfs sysfs /sys
- mount -a
- echo /sbin/mdev > /proc/sys/kernel/hotplug
- mdev –s
- echo leohui1988_busybox
(d)在/dev 下建立设备节点:Console null
- mknod dev/console c 5 1
- mknod dev/null c 1 3
(e)将编译busybox生成的/bin和/sbin下的工具拷贝到myroot下的/bin和/sbin下
(f)使用mkyaffs2image制作yaffs文件系统镜像
./mkyaffs2image myroot rootfs.yaffs
将yaffs烧写至开发板,可在终端下看到leohui1988_busybox的输出,最基本的文件系统制作成功!
注意:
如果使用静态编译,那么后面我们移植到开发板的程序也必须静态编译,这样的话就比较占存储空间,为此可以将busybox进行动态编译,使用共享链接库来减小体积,同时也方便后面程序进行编译和移植。
动态编译步骤与以上类似,只是把 [ ] Build BusyBox as a static binary (no shared libs)这一项替换掉。其余步骤一样,完成后将bin和sbin拷贝到文件系统的bin,sbin下,然后将linuxrc这个链接文件也拷入文件系统根目录下,最初我没放linuxrc这个链接文件时,启动显示init错误。之后再将arm-linux交叉编译工具的lib(我的路径是/usr/local/arm/3.4.1/arm-linux/lib)库拷贝到文件系统lib下。制作成镜像烧写至flash,启动成功!
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/128628.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...