导航:首页 > 源码编译 > busybox编译镜像大小

busybox编译镜像大小

发布时间:2022-09-04 12:35:02

① 如何在android模拟器下添加busybox

【具体步骤】:
1) 下载 busybox 源代码,并解包
$ wget -c http://www点busybox点net/downloads/busybox-1.7.0.tar.bz2
$ tar jxvf busybox-1.7.0.tar.bz2

2) 下载交叉编译工具,并安装
我下载的是: arm-2009q1-161-arm-none-eabi.bin
说明:要正确设置好 PATH 变量。
例如将 “ 你的目录 ”/CodeSourcery/Sourcery_G++_Lite/bin 加到 PATH 路径中。

3 )进入到 busybox 解压后的源文件目录中,修改 Makefile
将第 176 行改为:
CROSS_COMPILE ?=arm-none-linux-gnueabi-

4 )进行编译选项配置
a 、
$ make menuconfig
Busybox Settings --->
Build Options --->
[*] Build BusyBox as a static binary(no shared libs)


说明:这个选项一定要选,这样才能把 busybox 编译成静态链接的可执行文件,运行时可以独立于其他库。

b 、
Installation Options --->
[*] Don't use /usr

说明:这个也一定要选,否则 make install 后, busybox 将安装在原来系统的 /usr 下,将你原有的命令都覆盖了!

5 )配置好后可以编译了,执行如下命令:
$ make
发现没过多久,就报错了,晕,错误内容如下:
applets/applets.c:20:2: warning: #warning Static linking against glibc proces buggy executables
applets/applets.c:21:2: warning: #warning (glibc does not cope well with ld --gc-sections).
applets/applets.c:22:2: warning: #warning See sources.redhat.com/bugzilla/show_bug.cgi?id=3400
applets/applets.c:23:2: warning: #warning Note that glibc is unsuitable for static linking anyway.
applets/applets.c:24:2: warning: #warning If you still want to do it, remove -Wl,--gc-sections
applets/applets.c:25:2: warning: #warning from top-level Makefile and remove this warning.
applets/applets.c:26:2: error: #error Aborting compilation.
make[1]: *** [applets/applets.o] 错误 1
make: *** [applets] 错误 2
看到它给出了提示,说 glibc 库不适和用来静态编译,最后给出解决方案就是将 applets/applets.c 中这部分内容给去掉,也就是 19-27 行。

然后再 make 进行编译。
不多久又报错了,看看具体错误:
.../compal/CodeSourcery/Sourcery_G++_Lite/bin/../arm-none-linux-gnueabi/libc/usr/include/linux/netfilter.h:56:17: error: field 'in' has incomplete type
.../CodeSourcery/Sourcery_G++_Lite/bin/../arm-none-linux-gnueabi/libc/usr/include/linux/netfilter.h:57:18: error: field 'in6' has incomplete type
ipsvd/tcpudp.c: In function 'tcpudpsvd_main':
ipsvd/tcpudp.c:314:10: warning: ignoring return value of 'write', declared with attribute warn_unused_result
make[1]: *** [ipsvd/tcpudp.o] 错误 1
make: *** [ipsvd] 错误 2
看到说在我们下载的交叉编译库中有个头文件中的 in 及 in6 类型不对,解决的办法就是:
在 .../arm-none-linux-gnueabi/libc/usr/include/linux/netfilter.h 的开头
添加缺少的头文件:
#include <netinet/in.h>

然后再进行编译。(这次可以安全到最后了,呵呵)
结束后会在当前目录下看到 busybox 这个可执行文件。

6 )编译步骤已完成,下面就将 busybox 这个可执行文件放到 Android 模拟器下去
$ adb push busybox /system/xbin
说明:若是出现什么 read-only file system 等等之类,执行如下命令即可:
$ adb remount
要是老是不行,那就重新启动 adb
$ adb kill-server
$ adb start-server

要是碰到什么内存不足等等,那原因就是你的那个 Android 模拟器是用 Eclipse 打开的。解决办法就是,手动启动你的 Android emulator 模拟器,具体如下:
$ android list avd # 注释:列出你所有的模拟器
$ emulator -avd your_emulator_name -partition-size 256

注意:最好放在 /system/xbin 下面,这样当你在模拟器里使用 busybox 时不需要指定绝对路径了,否则的话谁都会疯掉嘛,呵呵。

7 )输入 adb shell 进入终端,执行看看
# busybox --help
BusyBox v1.7.0 (2011-04-22 20:53:21 CST) multi-call binary
Copyright (C) 1998-2006 Erik Andersen, Rob Landley, and others.
Licensed under GPLv2. See source distribution for full notice.



说明:表明我们的 busybox 已经可以执行了。但同时又有一个问题,每次输入一个命令都要加上 busybox ,那么人又要疯掉了, -_-! 。解决办法就是,我想到可以使用 alias 命令嘛,给我们所有输入的东西都自动加上 busybox ,具体如下:
【方法 1 】:
将你所感兴趣的命令集中在一个脚本中打包,例如建立内容如下的脚本:
#!/bin/sh
# set_alias1.sh (当然你名字可以随便改,越短越好,但不要和命令重名)

alias ls='busybox ls'
alias find='busybox find'


保存好后,将其 push 到模拟器中的 /system/xbin 下面,然后用 adb shell 进入到模拟器终端后执行如下命令:
# . set_alias1.sh # 注释:在当前进行中执行该脚本(一定要有 " 点 " )


【方法 2 】:
以上方法虽然能解决问题,但总觉得添加这么多东西也怪烦人的,写个智能点的脚本:
xxx:~/code/shellcode$ cat set_alias.sh
#!/bin/bash
# set_alias.sh

pre_handle_result=$(busybox echo -n $(busybox --help) | busybox grep -v '^/t')
pre_cmds=${pre_handle_result##*[[, }
sec_cmds=$(busybox echo -n $pre_cmds | busybox sed 's/,//g')

for cmd in $sec_cmds
do
# alias cmds
alias $cmd="busybox $cmd"
done
然后将其 push 到模拟器中的 /system/xbin 下,执行过程如上。

② 安卓busybox怎么使用busybox可以干什么

BusyBox 将许多具有共性的小版本的UNIX工具结合到一个单一的可执行文件。这样的集合可以替代大部分常用工具比如的GNU fileutils , shellutils等工具,BusyBox提供了一个比较完善的环境,可以适用于任何小的嵌入式系统。
2、发源
BusyBox 最初是由 Bruce Perens 在 1996 年为Debian GNU/Linux安装盘编写的。其目标是在一张软盘上创建一个可引导的 GNU/Linux 系统,这可以用作安装盘和急救盘。
3、编译安装
#make
#make install
编译好后在busybox目录下生成子目录_install,里面的内容:
drwxr-xr-x 2 root root 4096 11月 24 15:28 bin
rwxrwxrwx 1 root root 11 11月 24 15:28linuxrc -> bin/busybox
drwxr-xr-x 2 root root 4096 11月 24 15:28 sbin
其中可执行文件busybox在需要制作文件系统映像烧入板子的情况下,busybox应放在根文件系统目录下的bin中,其他的都是指向他的符号链接.
4、、配置
busybox的配置程序和linux内核菜单配置方式简直一模一样.熟悉用make menuconfig方式配置linux内核的朋友很容易上手.
#cp busybox-1.00.tar.gz /babylinux
#cd /babylinux
#tar xvfz busybox-1.00.tar.gz
#cd busybox-1.00
#make menuconfig
下面是需要编译进busybox的功能选项。
General Configuration应该选的选项
Show verbose applet usage messages
Runtime SUID/SGID configuration via /etc/busybox.conf
Build Options
Build BusyBox as a static binary (no shared libs)
这个选项是一定要选择的,这样才能把busybox编译成静态链接的可执行文件,运行时才独立于其他函数库.否则必需要其他库文件才能运行,在单一个linux内核不能使它正常工作.
Installation Options
Don't use /usr
这个选项也一定要选,否则make install 后busybox将安装在原系统的/usr下,这将覆盖掉系统原有的命令.选择这个选项后,make install后会在busybox目录下生成一个叫_install的目录,里面有busybox和指向它的链接.

③ 构建一个Linux最小系统,能从U盘启动Linux,把Linux原码编译后放入U盘,并可从U盘启

你下载一个linux的发行版的iso文件,如ubuntu.
再在你的windows电脑上安装utlraiso,版本必须9.12及以上。
1、 运行UltraISO

2、 在主菜单选“文件”-〉“打开”,出现“打开ISO文件对话框”

3、 选择镜像文件(ubuntu-8.04-desktop-i386.iso)点击“打开”按钮

4、 在主菜单选“启动光盘”-〉“写入硬盘映像”,出现“写入硬盘映像”对话框

5、 出现上面界面的时候,在“硬盘驱动器”选项里,要选择U盘的盘符,在“写入方式”里,选择USB-HDD+或USB-ZIP+模式,并点击“便捷启动”按钮——写入新的硬盘主引导记录——USB-HDD+或USB-ZIP+。

6、 再点击写入,开始ISO文件写入到U盘。

7、 制作完成后拔出U盘

8、 设置电脑启动为usb-hdd或usb-zip启动即可。
另外,站长团上有产品团购,便宜有保证

④ 如何将一个自己的linux系统制作成cubieboard1的自启动镜像制作

参考了http://mer.jolladev.net/wiki.php?id=%E5%90%AF%E5%8A%A8cubieboard2%E5%88%B0linux_kernel和tll大神的How to make a cubieboard system文档
第一步:下载kernel代码并编译
git clone git://github.com/linux-sunxi/linux-sunxi
配置并编译:
Gerneral setup ->Cross Compilter too prefix 这里填arm-linux-gnueabihf-
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- cubieboard2_defconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j4 uImage moles
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf--j4 INSTALL_MOD_PATH=output moles_install
如果成功,在/arch/arm/boot/目录下会有uImage,在output下会有lib目录
第二步:下载uboot代码并编译
git clone git://github.com/linux-sunxi/u-boot-sunxi.git
make distclean CROSS_COMPILE=arm-linux-gnueabihf-
make Cubieboard2 CROSS_COMPILE=arm-linux-gnueabihf-
如果成功,会在主目录下有u-boot.bin,在spl目录有u-boot-spl.bin
第三步:生成boot.scr
boot.scr是什么?
根据资料描述(https://github.com/linux-sunxi/u-boot-sunxi/wiki#bootscr-support),u-boot在启动的时候会在第一个分区(FAT/extX格式)寻找/boot.scr或者/boot/boot.scr文件,boot.scr中可以包含用于载入script.bin,kernel,initrd(可选)以及设置内核启动参数的uboot命令。
boot.cmd如何生成?
在$WORK_DIR目录新建 boot.cmd 文件,添加以下内容:
setenv bootargs console=ttyS0,115200 noinitrd disp.screen0_output_mode=EDID:1280x1024p60 init=/init root=/dev/mmcblk0p2 rootfstype=ext4 rootwait panic=10 ${extra}
fatload mmc 0 0x43000000 boot/script.bin
fatload mmc 0 0x48000000 boot/uImage
bootm 0x48000000
生成boot.scr:
kimage -C none -A arm -T script -d boot.cmd boot.scr
第四步:生成script.bin
git clone git://github.com/linux-sunxi/sunxi-tools.git,这个下载的是生成上次script所需要的工具
git clone git://github.com/linux-sunxi/sunxi-boards.git这个是板子对应的资源列表
编译工具:
cd $WORK_DIR/sunxi-toolsmake
产生script.bin
cd $WORK_DIR/sunxi-boards/sys_config/a20
$WORK_DIR/sunxi-tools/fex2bin cubieboard2.fex script.bin

这样就把制作需要的东西都准备好了,接下来就是把刚才这些拷贝到tf卡中
A20 芯片上电启动的时候,会读取SD卡最前面的 1M 内容,从而得到 bootloader,所以我们需要把 u-boot 写到SD卡的前1M区间。
其中详细的SD卡布局如下:

起始
大小
用途

0 8KB 存放分区表等内容
8 24KB SPL loader
32 512KB u-boot
544 128KB environment
672 352KB 保留
1024 - 用于剩余分区
可以看到,应该把刚uboot编译产生的u-boot-spl.bin 这个文件拷贝到8k这个位置,把u-boot.bin 放到32k这个位置
话说要先给tf卡分区
具体分区步骤如下:
建立第一个分区
root@kubuntu:~/src/u-boot-sunxi# fdisk ${card}
Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
Building a new DOS disklabel with disk identifier 0x911332e8.
Changes will remain in memory only, until you decide to write them.
After that, of course, the previous content won't be recoverable.

Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)

Command (m for help): n #键入n然后回车
Partition type:
p primary (0 primary, 0 extended, 4 free)
e extended
Select (default p): #直接回车
Using default response p
Partition number (1-4, default 1): #直接回车
Using default value 1
First sector (2048-15278079, default 2048): #直接回车
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-15278079, default 15278079): +64M #键入+64M后回车,即分区大小为64M

建立第二个分区
Command (m for help): n #键入n然后回车
Partition type:
p primary (1 primary, 0 extended, 3 free)
e extended
Select (default p): #直接回车
Using default response p
Partition number (1-4, default 2): #直接回车
Using default value 2
First sector (133120-15278079, default 133120): #直接回车
Using default value 133120
Last sector, +sectors or +size{K,M,G} (133120-15278079, default 15278079): #直接回车,即第二个分区使用全部剩余空间
Using default value 15278079

接下来指定分区类型:
Command (m for help): t #键入t然后回车
Partition number (1-4): 1 #键入1然后回车,即指定第一个分区
Hex code (type L to list codes): c #键入c然后回车,即指定第一个分区为vfat
Changed system type of partition 1 to c (W95 FAT32 (LBA))

Command (m for help): w #键入w然后回车,保存分区表
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.

格式化分区:
mkfs.vfat ${card}1
mkfs.ext4 ${card}2

然后写入bootloader:
cd $WORK_DIR/u-boot-sunxi
dd if=u-boot-sunxi-with-spl.bin of=$card bs=1024 seek=8

最后安装内核 uImage,设置启动参数:
mount ${card}1 /mnt
mkdir /mnt/boot
cp $WORK_DIR/linux-sunxi/arch/arm/boot/uImage /mnt/boot
cp $WORK_DIR/sunxi-boards/sys_config/a20/script.bin /mnt/boot
cp $WORK_DIR/boot.scr /mnt/
sync && umount /mnt

制作文件系统
wget http://busybox.net/downloads/busybox-1.21.1.tar.bz2
tar -jxvf busybox-1.21.1.tar.bz2
cd busybox-1.21.1
make menuconfig ARCH=arm
这边设置一下:busybox settings->build option->Cross Compiler prefix arm-linux-gnueabihf-
make
make install

将文件系统拷贝到tf第二分区
mount /dev/sdb2 /mnt
cp -r _instll/* /mnt
cp -r examples/bootfloppy/etc /mnt
cd /mnt
mkdir dev proc sys var home tmp mnt run boot boot2 dev/pts
删除fstab,并重新编辑
rm etc/fstab;
nano etc/fstab;
chmod 777 etc/fstab;
编辑
proc /proc proc nosuid,nosuid,noexec,nodev 0 0
sysfs /sys sysfs nosuid,noexec,nodev 0 0
devpts /dev/pts devpts gid=4,mode=620 0 0
tmpfs /tmp tmpfs defaults 0 0
devtmpfs /dev devtmpfs mode=0755,nosuid 0 0
/dev/mmcblk0p1 /boot2/ vfat defaults 0 2
/dev/mmcblk0p2 / ext4 defaults,notime 0 2

⑤ 编译移植busybox出错,arm-linux-gcc版本4.3.3 busybox版本1.16.0 错误代码如下:

找不到链接库,不这些都是数学库,加参数 -lm 应该就能解决。
但编译过程这个东西应该是自己加。

busybox 一般都是静态的,编译静态程序,很多时候需要他以来的函数库也是静态的。你这个问题应该是编译环境不匹配。你编译了 uclibc 并且正确安装了没?

不过话说,不过是个编译,人家本来就支持 arm ,“移植”这两个字应该是不需要用了。

⑥ 如何在linux上使用qemu执行镜像文件

1. 编译kernel
mkdir -p ~/misc/qemu
cd ~/misc/qemu
wget http://www.kernel.org/pub/linux/kernel/v3.0/linux-3.3.7.tar.bz2
tar xvfj linux-3.3.7.tar.bz2
cd linux-3.3.7
make defconfig
make
cp arch/x86/boot/bzImage ..
2. 制作根文件系统
cd ~/misc/qemu
dd if=/dev/zero of=rootfs.img bs=1M count=10
mkfs.ext3 rootfs.img
mkdir rootfs
sudo mount -t ext3 -o loop rootfs.img rootfs
cd rootfs
mkdir dev proc sys
3. 编译busybox
cd ~/misc/qemu
wget http://busybox.net/downloads/busybox-1.20.1.tar.bz2
tar xvfj busybox-1.20.1.tar.bz2
cd busybox-1.20.1
make defconfig
make menuconfig
(将busybox编译为静态连接方式)
- Busybox Settings
- Build options
- Build Busybox as a static binary
make
make install CONFIG_PREFIX=~/misc/qemu/rootfs
cd ~/misc/qemu
sudo umount rootfs
4. 运行
图形界面下:
qemu -kernel bzImage -hda rootfs.img -append "root=/dev/sda init=/bin/ash"
命令行界面:
qemu -kernel bzImage -hda rootfs.img -append "root=/dev/sda init=/bin/ash" -curses
通过vnc运行:
qemu -kernel bzImage -hda rootfs.img -append "root=/dev/sda init=/linuxrc" -curses -vnc 192.168.1.237:1
上面192.168.1.237为本机的一个IP地址。在另外一台机器上运行vnc client,填入192.168.1.237:1,即可通过vnc连接到linux系统
改进1:mount /proc和/sys,以及创建/dev/下的设备节点

启动后,/dev下无设备文件,而且/proc, /sys都没有mount上,导致有些命令无法运行(如top)。为了解决这个问题,可以修改启动脚本/linuxrc为:
#!/bin/ash

/bin/mount -t proc proc /proc
/bin/mount -t sysfs sysfs /sys
/bin/echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s

/bin/ash

然后chmod a+x /linuxrc,umount后再执行
qemu -kernel bzImage -hda rootfs.img -append "root=/dev/sda init=/linuxrc"

有关mdev的介绍和使用可以参考:
http://hi..com/kebey2004/blog/item/3692f6079b8e9dda7a894721.html

改进2:编一个最小kernel
make allnoconfig
make menuconfig
选择:
- Executable file formats / Emulations
- 选择Kernel support for ELF binaries
- Device Drivers
- 选择ATA/ATAPI/MFM/RLL support
- 选择generic/default IDE chipset support
- File systems
- 选择Ext3 journalling file system support
make
qemu -kernel linux-3.3.7/arch/x86/boot/bzImage -hda rootfs.img -append "root=/dev/hda init=/linuxrc" -curses

⑦ 如何使用busybox编译和生成最简lin

在ubuntu系统下创建一个rootfs目录,用于存放busybox生成的根文件系统,也可设置为nfs的挂载目录,直接通过网络文件系统进行挂载,便于开发。我自己就将该目录创建在/opt/FriendlyARM/mini2440/rootfs处。并在该目录下创建一些必备的子目录:

leon@Ubuntu:/opt/FriendlyARM/mini2440/rootfs$ mkdir bin dev etc proc sbin sys tmp usr leon@Ubuntu:/opt/FriendlyARM/mini2440/rootfs$ ls bin dev etc proc sbin sys tmp usr

1、修改Makefile配置

进入busybox目录,修改Makefile文件,在文件头处加入内容如下:

ARCH ?= arm CROSS_COMPILE ?= arm-linux-

2、修改配置文件

make menuconfig

选择Busybox Settings—>

1、Build Options—>,选择[*] Build Busybox as a static binary(no shared libs); 2、Installtion Options,在busybox instantlltionprefix一栏中,输入你想要创建rootfs的目录。比如我的是/opt/FriendlyARM/mini2440/rootfs。

保存,退出。

3、编译源码

输入make,进行编译;这其中估计会遇到一些错误,可参见我的另外一篇博客(linux(ubuntu)编译busybox遇到的问题处理办法)。编译成功后,会给出以下提示:

LINK busybox_unstripped Static linking against glibc, can't use --gc-sections Trying libraries: crypt m Library crypt is not needed, excluding it Library m is needed, can't exclude it (yet) Final link with: m DOC busybox.pod DOC BusyBox.txt DOC busybox.1 DOC BusyBox.html

编译通过之后,输入make install命令进行安装,busybox会自动将rootfs根文件系统安装到之前设置的目录下。

⑧ 如何编译hi3520d sdk

第一章 Hi3520D_SDK_Vx.x.x.x版本升级操作说明
如果您是首次安装本SDK,请直接参看第2章。

第二章 首次安装SDK
1、hi3520D SDK包位置
在"hi3520D_V100R001***/01.software/board"目录下,您可以看到一个 hi3520D_SDK_Vx.x.x.x.tgz 的文件,
该文件就是hi3520D的软件开发包。
2、解压缩SDK包
在linux服务器上(或者一台装有linux的PC上,主流的linux发行版本均可以),使用命令:tar -zxf hi3520D_SDK_Vx.x.x.x.tgz ,
解压缩该文件,可以得到一个hi3520D_SDK_Vx.x.x.x目录。
3、展开SDK包内容
返回hi3520D_SDK_Vx.x.x.x目录,运行./sdk.unpack(请用root或sudo权限执行)将会展开SDK包打包压缩存放的内容,请按照提示完成操作。
如果您需要通过WINDOWS操作系统中转拷贝SDK包,请先运行./sdk.cleanup,收起SDK包的内容,拷贝到新的目录后再展开。
4、在linux服务器上安装交叉编译器
1)安装uclibc交叉编译器(注意,需要有sudo权限或者root权限):
进入hi3520D_SDK_Vx.x.x.x/osdrv/toolchain/arm-hisiv100nptl-linux目录,运行chmod +x cross.install,然后运行./cross.install即可。
2) 安装glibc交叉编译器(注意,需要有sudo权限或者root权限,暂时不支持glibc版本):
进入hi3520D_SDK_Vx.x.x.x/osdrv/toolchain/arm-hisiv200-linux目录,运行chmod +x cross.install,然后运行./cross.install即可。
3) 执行source /etc/profile, 安装交叉编译器的脚本配置的环境变量就可以生效了,或者请重新登陆也可。
5、编译osdrv
参见osdrv目录下readme
6、SDK目录介绍
hi3520D_SDK_Vx.x.x.x 目录结构如下:
|-- sdk.cleanup # SDK清理脚本
|-- sdk.unpack # SDK展开脚本
|-- osdrv # 存放操作系统及相关驱动的目录
| |-- busybox # busybox源代码
| |-- drv # drv源代码
| |-- kernel # linux内核源代码
| |-- pub # 编译好的镜像、工具、drv驱动等
| |-- rootfs_scripts # rootfs源代码
| |-- toolchain # 交叉编译器
| |-- tools # linux工具源代码
| |-- uboot # uboot源代码
| `-- Makefile # osdrv Makefile
|-- package # 存放SDK各种压缩包的目录
| |-- osdrv.tgz # linux内核/uboot/rootfs/tools源码压缩包
| |-- mpp.tgz # 媒体处理平台软件压缩包
| `-- image # 可供FLASH烧写的映像文件,如内核、根文件系统
|-- scripts # 存放shell脚本的目录
|-- mpp # 存放媒体处理平台的目录
|-- component # 组件源代码
|-- extdrv # 板级外围驱动源代码
|-- include # 对外头文件
|-- ko # 内核模块
|-- lib # release版本库以及音频库
|-- tools # 媒体处理相关工具
`-- sample # 样例源代码

第三章、安装、升级hi3520DDEMO板开发开发环境
# 如果您使用的hi3520D的DEMO板,可以按照以下步骤烧写u-boot,内核以及文件系统,以下步骤均使用网络来更新。
# 通常,您拿到的单板中已经有u-boot,如果没有的话,就需要使用仿真器进行烧写。
# 更详细的操作步骤及说明,请参见01.software\board\documents目录下的《Linux开发环境用户指南》。
# 以下操作假设您的单板上已经有u-boot,使用网口烧写uboot、kernel及rootfs到Flash中。
# Demo单板默认为从SPI Flahs启动。
1、配置tftp服务器
# 可以使用任意的tftp服务器,将package/image_uclibc(或image_glibc)下的相关文件拷贝到tftp服务器目录下。

2、参数配置
# 单板上电后,敲任意键进入u-boot。设置serverip(即tftp服务器的ip)、ipaddr(单板ip)和ethaddr(单板的MAC地址)。
setenv serverip xx.xx.xx.xx
setenv ipaddr xx.xx.xx.xx
setenv ethaddr xx:xx:xx:xx:xx:xx
setenv netmask xx.xx.xx.xx
setenv gatewayip xx.xx.xx.xx
ping serverip,确保网络畅通。
3、烧写映像文件到SPI Flash
以16M SPI Flash为例。
1)地址空间说明
| 1M | 4M | 11M |
|---------------|---------------|---------------|
| boot | kernel | rootfs |
以下的操作均基于图示的地址空间分配,您也可以根据实际情况进行调整。
2)烧写u-boot
sf probe 0
mw.b 82000000 ff 100000
tftp 0x82000000 u-boot-hi3520D.bin
sf probe 0
sf erase 0 100000
sf write 82000000 0 100000
reset
3)烧写内核
mw.b 82000000 ff 400000
tftp 82000000 uImage_3520d
sf probe 0
sf erase 100000 400000
sf write 82000000 100000 400000
4)烧写文件系统
mw.b 82000000 ff b00000
tftp 0x82000000 rootfs_3520d_64k.jffs2
sf erase 500000 b00000
sf write 82000000 500000 b00000
5)设置启动参数
setenv bootargs 'mem=64M console=ttyAMA0,115200 root=/dev/mtdblock2 rootfstype=jffs2 mtdparts=hi_sfc:1M(boot),4M(kernel),11M(rootfs)'
setenv bootcmd 'sf probe 0;sf read 0x82000000 0x100000 0x400000;bootm 0x82000000'

sa

4、启动新系统
reset # 重启进入新系统。
第四章、开发前环境准备
1、管脚复用
与媒体业务相关的管脚复用都在mpp/ko_hi3520D目录下的sh脚本中配置,如果与实际情况不符请直接修改,此脚本被load3520D调用,在加载mpp内核模块之前被执行;
mpp之外的其他管脚复用统一在uboot中配置,详细说明请参见《U-boot移植应用开发指南》。

第五章、使用SDK和DEMO板进行开发
1、开启Linux下的网络
# 设置网络
ifconfig eth0 hw ether xx:xx:xx:xx:xx:xx;
ifconfig eth0 xx.xx.xx.xx netmask xx.xx.xx.xx;
route add default gw xx.xx.xx.xx
# 然后ping一下其他机器,如无意外,网络将能正常工作。
2、使用NFS文件系统进行开发
# 在开发阶段,推荐使用NFS作为开发环境,可以省去重新制作和烧写根文件系统的工作。
# 挂载NFS文件系统的操作命令:
mount -t nfs -o nolock -o tcp xx.xx.xx.xx:/your-nfs-path /mnt
# 然后就可以在/mnt目录下访问服务器上的文件,并进行开发工作。
3、开启telnet服务
# 网络正常后,运行命令 telnetd& 就可以启动单板telnet服务,然后才能使用telnet登录到单板。
4、运行MPP业务
# 在单板linux系统下,进入mpp/ko目录,加载KO
cd mpp/ko
./load3520D -i

# 进入各sample目录下执行相应样例程序(sample需要先在服务器上成功编译过)
cd mpp/sample/vio
./sample_vio 0

第六章 地址空间分配与使用
1、DDR内存管理说明
1)所有DDR内存中,一部分由操作系统管理,称为OS内存;另一部分由MMZ模块管理,供媒体业务单独使用,称为MMZ内存。
2)OS内存起始地址为0x80000000,内存大小可通过bootargs进行配置,例如第三章中的setenv bootargs 'mem=64M ... ',表示分配给操作系统内存为64M,您可以根据实际情况进行调整。
3)MMZ内存由MMZ内核模块管理(mpp/ko_hi35xx目录下的mmz.ko),加载mmz模块时,通过模块参数指定其起始地址及大小,例如:
insmod mmz.ko mmz=anonymous,0,0x84000000,186M:jpeg,0,0x8fa00000,5M anony=1 || report_error
表示mmz两块区域,区域一的名称为anonymous,起始地址为0x84000000,大小为186M;区域二的名称为jpeg,起始地址为0x8fa00000,大小为5M。
您可以通过修改mpp/ko_hi35XX目录下load3520D脚本中的mmz模块参数,来修改其起始地址和总大小。
4)请注意MMZ内存地址范围不能与OS内存重叠。
2、DEMO板DDR内存管理示意
1) 以容量为256MBytes的DDR内存为例,以下为根据本文档和SDK默认配置得到的内存管理示意图:

DDR:

-----|-------| 0x80000000 # Memory managed by OS.
64M | OS |
| |
-----|-------| 0x84000000 # Memory managed by MMZ block anonymous.
187M | MMZ |
| |
-----|-------| 0x8fa00000 # Memory managed by MMZ block jpeg.
5M | |
| |
-----|-------| 0x8ff00000 # Not used.
1M | |
| |
-----|-------| 0x90000000 # End of DDR.

注意:
(1)用户在配置启动参数时需要设置OS的管理内存为64M,“setenv bootargs 'mem=64M ...”。
(2)系统启动后,配置load3520D的脚本中mmz的管理内存为191M,“insmod mmz.ko mmz=anonymous,0,0x84000000,186M:jpeg,0,0x8fa00000,5M anony=1 || report_error”。

⑨ 安卓手机安装完busybox.apk,出来个busybox installer图标,点击还是让安装,并提示安装成功,怎么运行命令

为Android加入busybox工具我们可以通过两种方式进入Android的console:

1. 直接执行命令emulator -shell;

2. 在启动emulator后,通过命令adb shell进入。

之后我们就可以使用一些linux下常用的命令了,如ls,cat等。然而Android自带的toolbox(位于/system/bin中)也太简略了点,有些命令如find,Android并不支持或者支持得不好。下面将介绍如何为Android加入busybox工具,通过编译得到一个可以在Android里面运行的busybox工具,我们就可以使用众多常见的linux命令了,如find,touch等。

步骤如下:

1. 首先去busybox主页 下载最新版本的busybox源代码.

2. 下载交叉编译工具: GNU Toolchain for ARM Processors

下载地址:http://www.codesourcery.com/gnu_toolchains/arm/download.html

其中第一项选择ARM EABI或ARM GNU/Linux,第二项选择IA32 GNU/Linux TAR即可。

最后得到一个arm-2007q3-51-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2文件

将压缩包解压到linux下某个目录, 并设置好环境变量, 使之能找到前缀为"arm-none-linux-gnueabi-"的交叉编译工具.

3. 进入busybox源码目录.

先执行make menuconfig命令对编译过程进行配置. 过程如下:

Busybox Settings -> Build Options ->

[*] Build BusyBox as a static binary (no shared libs) 这个要选上,因上这样子编译出来的busyBox才是可以独立运行的。
(/home/jo/tool/arm-2008q3/bin/arm-none-linux-gnueabi-) Cross Compiler prefex 这是交叉编译器的"路径+前缀",要根据具体的情况来设置。
Busybox Settings -> Installation Options->
[*] Don’t use /usr 这样子编译出来的busybox才不会安装到你主机的/usr目录下。一定要选上。

4 执行make编译源码. 如果编译过程中产生无法找到头文件的错误, 可指定交叉编译器用到的头文件所在路径. 如

$make -I./home/jo/tool/arm-2008q3/arm-none-linux-gnueabi/libc/usr/include/

5 编译成功后将得到一个名为busybox的可执行文件.

6 在Android的console下建立目录/data/busybox, 并使用下面的命令将文件busybox复制该目录中:

adb push busybox /data/busybox

7 从Android的console进入/data/busybox目录, 为可执行文件busybox加上可执行属性: chmod +x busybox

8 这时我们就可以使用busybox工具了, 如果希望在任何目录下都可以直接使用bosybox,则需要将路径/data/busybox export到path环境变量中:

export PATH=$PATH:/data/busybox

9 设置环境变量之后, 在命令行输入busybox, 即可看到其用法, 如:

在当前目录及其子目录中查找名为init.rc的文件可使用以下命令:

$busybox find . -name init.rc

10 安装busybox。

通过执行./busybox --install -s 我们会看到出现一些错误, 原因是因为Android系统的根目录和/sbin目录是只读的. 因此我们无法把一些常用命令安装到/bin目录下, 也不能修改/init.rc文件来设置PATH环境变量.

对于如何执行命令busybox --install -s 的默认安装路径, 这里我还不太清楚, 或许跟Makefile和编译busybox的相关设置有关.

尽管我们不可以在Android里面通过执行busybox --install -s 命令来安装常用命令, 我们却可以通过另外一个方法来把常用命令安装到Android里面.

方法很简单, 可以先在外面的linux系统中执行make install命令把相关的命令提取出来. 然后再通过命令adb push ./_install/bin /data/busybox/bin 把这些常用命令复制进Android系统中. 注意: make install安装命令的所在路径可通过执行make menuconfig进行设置, 默认为./_install目录下面.

这样,我们就不用每次使用busybox提供的一个命令时, 都要在前面加上busybox了.

11 修改/init.rc文件设置环境变量.

请参考帖子: 对Android启动过程的进一步研究

要提醒的是, 修改PATH环境变量的时候, 应该把busybox常用命令的路径"/data/busybox/bin"放在Android的常用命令路径"/system/bin"的前面, 否则, 先查找得到的将不是busybox的命令, 可以这样设置:

export PATH /data/busybox/bin:/sbin:/system/sbin:/system/bin:/system/xbin
希望可以帮到你!

⑩ 怎样使busybox编译出ldconfig命令

BusyBox 命令中支持的选项
BusyBox 中的命令并不支持所有可用选项,不过这些命令都包含了常用的选项。如果我们需要知道一个命令可以支持哪些选项,可以使用 --help 选项来调用这个命令,如清单 12 所示。

清单 12. 使用 --help 选项调用命令
$ ./busybox wc --help
BusyBox v1.1.1 (2006.04.09-15:27+0000) multi-call binary
Usage: wc [OPTION]... [FILE]...
Print line, word, and byte counts for each FILE, and a total line if
more than one FILE is specified. With no FILE, read standard input.
Options:
-c print the byte counts
-l print the newline counts
-L print the length of the longest line
-w print the word counts
$
这些特定的数据只有在启用了 CONFIG_FEATURE_VERBOSE_USAGE 选项时才可以使用。如果没有这个选项,我们就无法获得这些详细数据,但是这样可以节省大约 13 KB 的空间。

向 BusyBox 中添加新命令
向 BusyBox 添加一个新命令非常简单,这是因为它具有良好定义的体系结构。第一个步骤是为新命令的源代码选择一个位置。我们要根据命令的类型(网络,shell 等)来选择位置,并与其他命令保持一致。这一点非常重要,因为这个新命令最终会在 menuconfig 的配置菜单中出现(在下面的例子中,是 Miscellaneous Utilities 菜单)。
对于这个例子来说,我将这个新命令称为 newcmd,并将它放到了 ./miscutils 目录中。这个新命令的源代码如清单 13 所示。
清单 13. 集成到 BusyBox 中的新命令的源代码
#include "busybox.h"
int newcmd_main( int argc, char *argv[] )
{
int i;
printf("newcmd called:\n");
for (i = 0 ; i < argc ; i++) {
printf("arg[%d] = %s\n", i, argv[i]);
}
return 0;
}
接下来,我们要将这个新命令的源代码添加到所选子目录中的 Makefile.in 中。在本例中,我更新了 ./miscutils/Makefile.in 文件。请按照字母顺序来添加新命令,以便维持与现有命令的一致性:

清单 14. 将命令添加到 Makefile.in 中
MISCUTILS-$(CONFIG_MT) += mt.o
MISCUTILS-$(CONFIG_NEWCMD) += newcmd.o
MISCUTILS-$(CONFIG_RUNLEVEL) += runlevel.o

接下来再次更新 ./miscutils 目录中的配置文件,以便让新命令在配置过程中是可见的。这个文件名为 Config.in,新命令是按照字母顺序添加的:

清单 15. 将命令添加到 Config.in 中
config CONFIG_NEWCMD
bool "newcmd"
default n
help
newcmd is a new test command.

这个结构定义了一个新配置项(通过 config 关键字)以及一个配置选项(CONFIG_NEWCMD)。新命令可以启用,也可以禁用,因此我们对配置的菜单属性使用了 bool (Boolean)值。这个命令默认是禁用的(n 表示 No),我们可以最后放上一个简短的 Help 描述。在源代码树的 ./scripts/config/Kconfig-language.txt 文件中,我们可以看到配置语法的完整文法。
接下来需要更新 ./include/applets.h 文件,使其包含这个新命令。将下面这行内容添加到这个文件中,记住要按照字母顺序。维护这个次序非常重要,否则我们的命令就会找不到。

清单 16. 将命令添加到 applets.h 中
USE_NEWCMD(APPLET(newcmd, newcmd_main, _BB_DIR_USER_BIN, _BB_SUID_NEVER))

这定义了命令名(newcmd),它在 Busybox 源代码中的函数名(newcmd_main),应该在哪里会为这个新命令创建链接(在这种情况中,它在 /usr/bin 目录中),最后这个命令是否有权设置用户 id(在本例中是 no)。

倒数第二个步骤是向 ./include/usage.h 文件中添加详细的帮助信息。正如您可以从这个文件的例子中看到的一样,使用信息可能非常详细。在本例中,我只添加了一点信息,这样就可以编译这个新命令了:

清单 17. 向 usage.h 添加帮助信息
#define newcmd_trivial_usage "None"
#define newcmd_full_usage "None"

最后一个步骤是启用新命令(通过 make menuconfig,然后在 Miscellaneous Utilities 菜单中启用这个选项)然后使用 make 来编译 BusyBox。

使用新的 BusyBox,我们可以对这个新命令进行测试,如清单 18 所示。
清单 18. 测试新命令
$ ./busybox newcmd arg1
newcmd called:
arg[0] = newcmd
arg[1] = arg1
$ ./busybox newcmd --help
BusyBox v1.1.1 (2006.04.12-13:47+0000) multi-call binary
Usage: newcmd None
None

就是这样!BusyBox 开发人员开发了一个优秀但非常容易扩展的工具。
结束语
BusyBox 是为构建内存有限的嵌入式系统和基于软盘系统的一个优秀工具。BusyBox 通过将很多必需的工具放入一个可执行程序,并让它们可以共享代码中相同的部分,从而对它们的大小进行了很大程度的缩减,BusyBox 对于嵌入式系统来说是一个非常有用的工具,因此值得我们花一些时间进行探索。

上文网上转载!
1.USE_NEWCMD(APPLET(newcmd, newcmd_main, _BB_DIR_USER_BIN, _BB_SUID_NEVER))
此语句,在编译的时候会报出 USE_NEWCMD 未定义!
故使用源码中的类似语句 APPLET(newcmd, newcmd_main, _BB_DIR_USER_BIN, _BB_SUID_NEVER) 替代之,编译通过
2.但是 在此时测试命令的时候并没有得到上文给出的结果,而是提示:
"#./busybox newcmd
newcmd: applet not found "


# ./newcmd 11
11: applet not found

阅读全文

与busybox编译镜像大小相关的资料

热点内容
encoder转码新建文件夹 浏览:721
android版本市场占有率 浏览:363
凭订单号抽奖源码 浏览:201
惠省钱app如何下载 浏览:39
春宵秘戏图pdf 浏览:395
android照片墙实现 浏览:430
怎么用一块钱抹布解压球 浏览:717
百度下没密码文件怎么解压 浏览:81
拷贝容器外的文件夹 浏览:145
执行命令后如何取消 浏览:593
java二进制对象 浏览:598
图纸一般都在哪个文件夹 浏览:958
移动网加密视频 浏览:58
如何pdf填充颜色 浏览:474
怎么查看c盘有多少文件夹 浏览:682
程序员那么可爱里面的男主角 浏览:731
编程老师的照片墙 浏览:300
函数未定义但是能编译运行 浏览:974
湖南省常德通用压缩机有限公司 浏览:109
服务器的双电是什么意思 浏览:614