① 如何在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