Busybox编译及其yaffs2文件系统制作精.docx
《Busybox编译及其yaffs2文件系统制作精.docx》由会员分享,可在线阅读,更多相关《Busybox编译及其yaffs2文件系统制作精.docx(10页珍藏版)》请在冰豆网上搜索。
Busybox编译及其yaffs2文件系统制作精
一、Busybox编译(版本busybox-1.13.0
1、在环境变量中设置交叉编译器的路径(版本cross-4.3.3
2、[*]BuildBusyboxasastaticbinary(nosharedlibs
3、busyboxsettings->busyboxlibrarytuning->usernamecompletion、fancyshellprompts
4、makemenuconfig设置CROSSCOMPILE为arm-linux-
5、installoptin-->
[*]Don'tuse/usr防止编译后生成的文件安装到主机的/usr目录下,改变了主机的系统6、makeinstall即可在_install目录下生成binsbinusr(bin,sbin及其linuxrc文件(该文件链接
到/bin/busybox
二、yaffs2文件系统制作
将_install目录下的文件拷贝至~/myroot文件夹下,按如下结构创建目录,并在相应目录下添加如下内容:
目录结构
/
|--bin(busybox产生
|--dev(设备名由mknod创建
|--etc
||--init.d
|`--sysconfig
|--home(手工创建用户
||--san(空与passwd文件对应
|`--sky(空与passwd文件对应
|--lib(从交叉编译工具路径拷贝cp-r4.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/consoledev
cp-a/dev/nulldev
cp-a/dev/ttyS0dev
cp-a/dev/ttyS1dev
(mknod-m600consolec51,这一个没有试过
can'topen/dev/s3c2410_serial:
Nosuchfileordirector
/dev目录下的console没有弄好就会出现这个问题,最简单的办法就是直接复制过来,具体的机理有待进一步研究
etc目录分析
etc
|--fstab(指明需挂载的文件系统
|--group(用户组
|--init.d(启动文件目录
|`--rcS(存放系统启动时配置以及自启动加载的进程等
|--inittab(init进程的配置文件
|--passwd(密码文件
|--profile(用户环境配置文件
`--sysconfig
`--HOSTNAME(存放主机名
【fstab】
#devicemount-pointtypeoptionsdumpfsckorder
proc/procprocdefaults00
tmpfs/tmptmpfsdefaults00
sysfs/syssysfsdefaults00
tmpfs/devtmpfsdefaults00
var/devtmpfsdefaults00
【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:
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
umask022
exportPATHrunlevelprevlevel
#
#TrapCTRL-C&conlyinthisshellsowecaninterruptsubprocesse.
mount-a
mkdir/dev/pts
mount-tdevptsdevpts/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一致,或则,系统启动时无法找到串口!
!
/*注意s3c2410上串口的设备名称是/dev/s3c2410_serial[0..3]*/
$vimdrivers/serial/samsung.c
879staticstructuart_drivers3c24xx_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};
[root@Sanux/]#lsdev/s3c2410_serial*
dev/s3c2410_serial0dev/s3c2410_serial1dev/s3c2410_serial2【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:
/:
sky:
:
520:
502:
LinuxUser,,,,:
/home/sky:
/bin/sh
san:
:
530:
503:
sanuser,,,,:
/home/san:
/bin/sh
【profile】
#Ashprofile
#vim:
syntax=sh
#Nocorefilesbydefault
#ulimit-S-c0>/dev/null2>&1
USER="`id-un`"
LOGNAME=$USER
PS1='[\u@\h\W]#'(PS1='[$USER@$HOSTNAME$PWD]#'PATH=$PATH
HOSTNAME=`/bin/hostname`
exportUSERLOGNAMEPS1PATH
【sysconfig/HOSTNAME】
yourname
lib目录
lib(cp-r4.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执行时会依赖lib库文件
1、如果将busybox编译成动态链接的形式,没有lib动态库或者缺少相应的库文件,那么linux会提示无法执行或者找不到相应的库。
2、如果将busybox编译成静态链接的形式(实际就是调用编译器的静态链接库来编译可执行文件,没有lib动态库也是可以的。
[*]BuildBusyboxasastaticbinary(nosharedlibs
实际上,在linux平台上编译可执行文件,如果调用的是动态链接库,那么我们在执行的
时候,需要exportLD_LIBRARY_PATH指向动态链接库的路劲,如果调用的是静态链接库,那就不用设置库的路劲了。
道理都是一样的。
3、如果将busybox编译成静态链接的形式,且lib目录下没有相应的动态链接库(如libc.so,libm.so等,那么编译出来的可执行程序无法运行,会提示说"[程序名]:
Notfound",因此,一般不会将busybox编译成静态链接的形式。
这个问题是在编写watchdog测试程序时发现的。
三、使用mkyaffsimage_2制作yaffs2文件系统mkyaffsimage_2myrootmyroot.bin说明:
1、在实际的嵌入是系统中,产品发行后,一般都不会使用终端登录的功能(除非返厂维修,debug时要用到,所以在终端登录时没必要设置密码,也没必要要bash。
所以,etc目录可简化为:
fstabinit.d/rcSinittabsysconfig/HOSTNAME这样在终端登录后的提示符为“#”,而不会有用户名、主机名。
在移植Android系统时,也按这种方法制作系统就可以了。
2、编译好内核,制作好文件系统后,我们的Linux系统是可以正常跑起来了,终端也可以使用命令了,但是,如果要做产品研发,离成品的要求还很远很远!
除了做嵌入式学习,可以接受现在的情况,用户是绝对不会买这样的产品的。
我们好要做下面一些工作:
a、驱动移植(BSP:
没有驱动,LCD,USB,WIFI,声卡,显卡等许多外设都无法使用,AP也不可能跑在上面。
b、Framewor修改:
如sdcard挂载,屏幕旋转,屏幕校准,恢复出厂设置等。
c、BSP、Framework与AP整合测试,并修改其中的大象Bug:
在测试的过程中,肯定会发现大量的Bug,这是完全可以预料的。
其中有一些是AP的问题,有些是Framework或BSP的问题,但是在实际的开发中,Bug往往都会是相互关联的,可能是AP的一个程序,发现了Framework或BSP的问题,Framework或BSP却无法发现。
但所以,要真正让BSP,Framework达到完美,那就一定要与AP整合测试。
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++console输入reboot或powerdown后,GT2440挂载不了yaffs2(具体的原因及好的解决方案还没有找到,继续研究)uncorrectableerror:
<3>end_request:
I/Oerror,devmtdblock2,sector0BufferI/Oerrorondevicemtdblock2,logicalblock0Kernelpanic-notsyncing:
VFS:
Unabletomountrootfsonunknown-block(31,2后来无缘无故的好了(PS1='[\u@\h\W]#'(PS1='[$USER@$HOSTNAME$PWD]#',用后面的替换前面的,在制作文件系统,就没有出现这个问题了,但出来了新的问题,如下:
)block1912isbad
Partiallywrittenblock90detectedPartiallywrittenblock90detectedPartiallywrittenblock90detectedPartiallywrittenblock90detected.......yaffs2的一个bug,升级一下估计能解决(通过下面介绍的方法,修改了一下源码,解决了问题)yaffs文件系统的Partiallywrittenblockdetected信息对文件系统进行一系列的操作之后,直接断电,然后重新启动后,挂载文件系统时可能会出现如下提示信息:
yaffs:
devis32505863nameis"mtdblock7"yaffs:
passedflags""yaffs:
AttemptingMTDmounton31.7,"mtdblock7"Partiallywrittenblock13detectedPartiallywrittenblock13detectedPartiallywrittenblock13detectedPartiallywrittenblock13detectedyaffs_read_super:
isCheckpointed0PleasepressEntertoactivatethisconsole.ls[root@localhost/]#这种提示信息是正常的,Partiallywrittenblock在正常使用时,文件系统的垃圾收集程序将会处理。
可以屏蔽这个信息,或者仅在YAFFS_TRACE_SCAN的时候显示这个信息,修改yaffs_guts.c文件的6668行,将T(YAFFS_TRACE_ALWAYS,(TSTR("Partiallywrittenblock%ddetected"TENDSTR,blk;改为:
T(YAFFS_TRACE_SCAN,(TSTR("Partiallywrittenblock%ddetected"TENDSTR,blk;可以查看这个网址:
849f31.en.html