Busybox編譯及其yaffs2文件系制作
一、Busybox編譯(版本busybox-1.13.0)
1、在環(huán)境變量中設置交叉編譯器 的路徑(版本cross-4.3.3)
本文引用地址:http://butianyuan.cn/article/201611/319973.htm2、[*] BuildBusybox as a static binary (no shared libs)
3、busybox settings->busybox librarytuning->username completion、fancyshell prompts
4、makemenuconfig設置CROSSCOMPILE為arm-linux-
5、install optin-->
[*] Dont use /usr 防止編譯后生成的文件安裝到主機的/usr目錄下,改變了主機的系統(tǒng)
6、make install即可在_install目錄下生成bin sbin usr(bin,sbin)及其linuxrc文件(該文件鏈接到/bin/busybox)
二、yaffs2文件系統(tǒng)制作
將_install目錄下的文件拷貝至~/myroot文件夾下,按如下結構創(chuàng)建目錄,并在相應目錄下添加如下內容:
目錄結構
/
|--bin (busybox產生)
|-- dev (設備名由mknod創(chuàng)建)
|--etc
| |-- init.d
|`-- sysconfig
|-- home (手工創(chuàng)建用戶)
| |-- san (空)與passwd文件對應
| `-- sky (空)與passwd文件對應
|-- lib (從交叉編譯工具路徑拷貝cp -r 4.3.3/arm-none-linux-gnueabi/libc/armv4t/lib/*so*lib -a)
|-- mnt (空)
|-- proc (空)
|-- root (空)
|-- sbin (busybox產生)
|-- sys (空)
|-- tmp (空)
|-- usr (busybox產生)
||-- bin (busybox產生)
| |-- lib (busybox產生?)
| `-- sbin (busybox產生)
`-- var (空)
dev目錄分析
dev
|-- cp -a /dev/console dev
cp -a /dev/null dev
cp -a /dev/ttyS0 dev
cp -a /dev/ttyS1 dev
(mknod -m 600console c 5 1,這一個沒有試過)
cant open /dev/s3c2410_serial: No such file or director
/dev目錄下的console沒有弄好 就會出現(xiàn)這個問題,最簡單的辦法就是直接復制過來,具體的機理有待進一步研究
etc目錄分析
etc
|-- fstab (指明需掛載的文件系統(tǒng))
|-- group (用戶組)
|-- init.d (啟動文件目錄)
| `-- rcS (存放系統(tǒng)啟動時配置以及自啟動加載的進程等)
|-- inittab (init進程的配置文件)
|-- passwd (密碼文件)
|-- profile (用戶環(huán)境配置文件)
`--sysconfig
`-- HOSTNAME (存放主機名)
【fstab】
#device mount-point type options dump fsckorder
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
【group】
root:*:0:
daemon:*:1:
bin:*:2:
sys:*:3:
adm:*:4:
tty:*5:
disk:*:6:
lp:*:7:
mail:*:8:
news:*:9:
uucp:*:10:
proxy:*:13:
kmem:*:15:
dialout:*:20:
fax:*:21:
voice:*:22:
cdrom:*:24:
floopy:*:25:
tape:*:26:
sudo:*:27:
audio:*:29:
ppp:x:99:
500:x:500:sky
501:x:501:sky
【init.d/rcS】
#!/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
runlevel=S
prevlevel=N
umask 022
export PATH runlevel prevlevel
#
# Trap CTRL-C &c only in this shell sowe can interrupt subprocesse.
mount -a
mkdir /dev/pts
mount -t devpts devpts /dev/pts
echo /sbin/mdev >/proc/sys/kernel/hotplug
mdev -s
mkdir -p /var/lock
/bin/hostname -F /etc/sysconfig/HOSTNAME
【inittab】
#/etc/inittab
::sysinit:/etc/init.d/rcS
console ::askfirst:-/bin/sh(s3c2410_serial0 ::askfirst:-/bin/sh)
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r
s3c2410_serial為串口設備號,名稱必須與drivers/serial/samsung.c一致,或則,系統(tǒng)啟動時無法找到串口!!
/*注意s3c2410上串口的設備名稱是/dev/s3c2410_serial[0..3]*/
$vimdrivers/serial/samsung.c
879static struct uart_driver s3c24xx_uart_drv= {
880.owner = THIS_MODULE,
881.dev_name = "s3c2410_serial",
882.nr = CONFIG_SERIAL_SAMSUNG_UARTS,
883.cons = S3C24XX_SERIAL_CONSOLE,
884.driver_name = S3C24XX_SERIAL_NAME,
885.major = S3C24XX_SERIAL_MAJOR,
886.minor = S3C24XX_SERIAL_MINOR,
887};
系統(tǒng)啟動后
[root@Sanux /]#ls dev/s3c2410_serial*
dev/s3c2410_serial0 dev/s3c2410_serial1 dev/s3c2410_serial2
【passwd】
root::0:0:root:/:/bin/sh
ftp::14:50:FTP User:/var/ftp:
bin:*:1:1:bin:/bin
daemon:*:2:2:daemon:/sbin:
nobody:*:99:99:Nobody:/:
sky::520:502:LinuxUser,,,,:/home/sky:/bin/sh
san::530:503:san user,,,,:/home/san:/bin/sh
【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]#(PS1=[$USER@$HOSTNAME$PWD]#)
PATH=$PATH
HOSTNAME=`/bin/hostname`
export USER LOGNAME PS1 PATH
【sysconfig/HOSTNAME】
yourname
lib目錄
lib(cp -r 4.3.3/arm-none-linux-gnueabi/libc/armv4t/lib/*so*lib -a)
|--ld-2.8.so
|-- ld-linux.so.3 -> ld-2.8.so
|-- libBrokenLocale-2.8.so
|-- libBrokenLocale.so.1 ->libBrokenLocale-2.8.so
|-- libSDL-1.2.so.0 -> libSDL-1.2.so.0.11.0
|-- libSDL-1.2.so.0.11.0
|-- libSDL-1.2.so.0.11.2
|-- libSDL.so -> libSDL-1.2.so.0.11.0
|-- libSegFault.so
|-- libanl-2.8.so
|-- libanl.so.1 -> libanl-2.8.so
|-- libc-2.8.so
|-- libc.so.6 -> libc-2.8.so
|-- libcidn-2.8.so
|-- libcidn.so.1 -> libcidn-2.8.so
|--libcrypt-2.8.so
|-- libcrypt.so.1 -> libcrypt-2.8.so
|-- libdl-2.8.so
|-- libdl.so.2 -> libdl-2.8.so
|-- libgcc_s.so -> libgcc_s.so.1
|-- libgcc_s.so.1
|-- libm-2.8.so
|-- libm.so.6 -> libm-2.8.so
|-- libmemusage.so
|-- libnsl-2.8.so
|-- libnsl.so.1 -> libnsl-2.8.so
|-- libnss_compat-2.8.so
|-- libnss_compat.so.2 ->libnss_compat-2.8.so
|-- libnss_dns-2.8.so
|-- libnss_dns.so.2 -> libnss_dns-2.8.so
|-- libnss_files-2.8.so
|-- libnss_files.so.2 ->libnss_files-2.8.so
|-- libnss_hesiod-2.8.so
|-- libnss_hesiod.so.2 ->libnss_hesiod-2.8.so
|-- libnss_nis-2.8.so
|-- libnss_nis.so.2 -> libnss_nis-2.8.so
|-- libnss_nisplus-2.8.so
|-- libnss_nisplus.so.2 ->libnss_nisplus-2.8.so
|-- libpcprofile.so
|-- libpthread-2.8.so
|-- libpthread.so.0 -> libpthread-2.8.so
|-- libresolv-2.8.so
|-- libresolv.so.2 -> libresolv-2.8.so
|-- librt-2.8.so
|-- librt.so.1 -> librt-2.8.so
|-- libsqlite3.so -> libsqlite3.so.0.8.6
|-- libsqlite3.so.0 -> libsqlite3.so.0.8.6
|-- libsqlite3.so.0.8.6
|-- libthread_db-1.0.so
|-- libthread_db.so.1 ->libthread_db-1.0.so
|-- libutil-2.8.so
`-- libutil.so.1 -> libutil-2.8.so
說明:linuxrc執(zhí)行時會依賴lib庫文件
1)、如果將busybox編譯成動態(tài)鏈接的形式,沒有l(wèi)ib動態(tài)庫或者缺少相應的庫文件,那么linux會提示無法執(zhí)行或者找不到相應的庫。
2)、如果將busybox編譯成靜態(tài)鏈接的形式(實際就是調用編譯器的靜態(tài)鏈接庫來編譯可執(zhí)行文件),沒有l(wèi)ib動態(tài)庫也是可以的。
[*]Build Busybox as a static binary (no shared libs)
實際上,在linux平臺上編譯可執(zhí)行文件,如果調用的是動態(tài)鏈接庫,那么我們在執(zhí)行的時候,需要exportLD_LIBRARY_PATH指向動態(tài)鏈接庫的路勁,如果調用的是靜態(tài)鏈接庫,那就不用設置庫的路勁了。道理都是一樣的。
3)、如果將busybox編譯成靜態(tài)鏈接的形式,且lib目錄下沒有相應的動態(tài)鏈接庫(如libc.so,libm.so等),那么編譯出來的可執(zhí)行程序無法運行,會提示說"[程序名]:Not found",因此,一般不會將busybox編譯成靜態(tài)鏈接的形式。這個問題是在編寫watchdog測試程序時發(fā)現(xiàn)的。
三、使用mkyaffsimage_2制作yaffs2文件系統(tǒng)
mkyaffsimage_2 myroot myroot.bin
說明:
1)、在實際的嵌入是系統(tǒng)中,產品發(fā)行后,一般都不會使用終端登錄的功能(除非返廠維修,debug時要用到),所以在終端登錄時沒必要設置密碼,也沒必要要bash。
所以,etc目錄可簡化為:
fstab
init.d/rcS
inittab
sysconfig/HOSTNAME
這樣在終端登錄后的提示符為“#”,而不會有用戶名、主機名。
在移植Android系統(tǒng)時,也按這種方法制作系統(tǒng)就可以了。
2)、編譯好內核,制作好文件系統(tǒng)后,我們的Linux系統(tǒng)是可以正常跑起來了,終端也可以使用命令了,但是,如果要做產品研發(fā),離成品的要求還很遠很遠!除了做嵌入式學習,可以接受現(xiàn)在的情況,用戶是絕對不會買這樣的產品的。
我們好要做下面一些工作:
a)、驅動移植(BSP):沒有驅動,LCD,USB,WIFI,聲卡,顯卡等許多外設都無法使用,AP也不可能跑在上面。
b)、Framewor修改:如sdcard掛載,屏幕旋轉,屏幕校準,恢復出廠設置等。
c)、BSP、Framework與AP整合測試,并修改其中的大象Bug:在測試的過程中,肯定會發(fā)現(xiàn)大量的Bug,這是完全可以預料的。其中有一些是AP的問題,有些是Framework或BSP的問題,但是在實際的開發(fā)中,Bug往往都會是相互關聯(lián)的,可能是AP的一個程序,發(fā)現(xiàn)了Framework或BSP的問題,但Framework或BSP卻無法發(fā)現(xiàn)。所以,要真正讓BSP,F(xiàn)ramework達到完美,那就一定要與AP整合測試。
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
console輸入reboot或powerdown后,GT2440掛載不了yaffs2(具體的原因及好的解決方案還沒有找到,繼續(xù)研究)
uncorrectable error : <3>end_request:I/O error, dev mtdblock2, sector 0
Buffer I/O error on device mtdblock2,logical block 0
Kernel panic - not syncing: VFS: Unable tomount root fs on unknown-block(31,2)
后來無緣無故的好了(PS1=[u@h W]#(PS1=[$USER@$HOSTNAME $PWD]#)
,用后面的替換前面的,在制作文件系統(tǒng),就沒有出現(xiàn)這個問題了,但出來了新的問題,如下:)
block 1912 is bad
Partially written block 90 detected
Partially written block 90 detected
Partially written block 90 detected
Partially written block 90 detected
.
.
yaffs2的一個bug,升級一下估計能解決(通過下面介紹的方法,修改了一下源碼,解決了問題)
yaffs文件系統(tǒng)的Partially written block detected信息
對文件系統(tǒng)進行一系列的操作之后,直接斷電,然后重新啟動后,掛載文件系統(tǒng)時可能會出現(xiàn)如下提示信息:
yaffs: dev is 32505863 name is"mtdblock7"
yaffs: passed flags ""
yaffs: Attempting MTD mount on 31.7,"mtdblock7"
Partially written block 13 detected
Partially written block 13 detected
Partially written block 13 detected
Partially written block 13 detected
yaffs_read_super: isCheckpointed 0
Please press Enter to activate this console.ls
[root@localhost /]#
這種提示信息是正常的,Partially written block 在正常使用時,文件系統(tǒng)的垃圾收集程序將會處理。
可以屏蔽這個信息,或者僅在YAFFS_TRACE_SCAN的時候顯示這個信息,修改yaffs_guts.c文件的6668行,將
T(YAFFS_TRACE_ALWAYS,
(TSTR("Partially written block %ddetected" TENDSTR),
blk));
改為:
T(YAFFS_TRACE_SCAN,
(TSTR("Partially written block %ddetected" TENDSTR),
blk));
可以查看這個網址:http://www.yaffs.net/lurker/message/20100425.012952.08849f31.en.html
評論