一、Busybox编译(版别busybox-1.13.0)
1、在环境变量中设置穿插编译器 的途径(版别cross-4.3.3)
2、[*] 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目录下,改变了主机的体系
6、make install即可在_install目录下生成bin sbin usr(bin,sbin)及其linuxrc文件(该文件链接到/bin/busybox)
二、yaffs2文件体系制造
将_install目录下的文件仿制至~/myroot文件夹下,按如下结构创立目录,并在相应目录下增加如下内容:
目录结构
/
|–bin (busybox发生)
|– dev (设备名由mknod创立)
|–etc
| |– init.d
|`– sysconfig
|– home (手艺创立用户)
| |– 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没有弄好 就会呈现这个问题,最简略的办法便是直接仿制过来,详细的机理有待进一步研讨
etc目录剖析
etc
|– fstab (指明需挂载的文件体系)
|– group (用户组)
|– init.d (发动文件目录)
| `– rcS (寄存体系发动时装备以及自发动加载的进程等)
|– inittab (init进程的装备文件)
|– passwd (暗码文件)
|– profile (用户环境装备文件)
`–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共同,或则,体系发动时无法找到串口!!
/*留意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};
体系发动后
[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履行时会依靠lib库文件
1)、假如将busybox编译成动态链接的方式,没有lib动态库或许短少相应的库文件,那么linux会提示无法履行或许找不到相应的库。
2)、假如将busybox编译成静态链接的方式(实践便是调用编译器的静态链接库来编译可履行文件),没有lib动态库也是能够的。
[*]Build Busybox as a static binary (no shared libs)
实践上,在linux平台上编译可履行文件,假如调用的是动态链接库,那么咱们在履行的时分,需求exportLD_LIBRARY_PATH指向动态链接库的路劲,假如调用的是静态链接库,那就不必设置库的路劲了。道理都是相同的。
3)、假如将busybox编译成静态链接的方式,且lib目录下没有相应的动态链接库(如libc.so,libm.so等),那么编译出来的可履行程序无法运转,会提示说”[程序名]:Not found”,因而,一般不会将busybox编译成静态链接的方式。这个问题是在编写watchdog测验程序时发现的。
三、运用mkyaffsimage_2制造yaffs2文件体系
mkyaffsimage_2 myroot myroot.bin
阐明:
1)、在实践的嵌入是体系中,产品发行后,一般都不会运用终端登录的功用(除非返厂修理,debug时要用到),所以在终端登录时没必要设置暗码,也没必要要bash。
所以,etc目录可简化为:
fstab
init.d/rcS
inittab
sysconfig/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(详细的原因及好的处理方案还没有找到,持续研讨)
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]#)
,用后面的替换前面的,在制造文件体系,就没有呈现这个问题了,但出来了新的问题,如下:)
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文件体系的Partially written block detected信息
对文件体系进行一系列的操作之后,直接断电,然后重新发动后,挂载文件体系时可能会呈现如下提示信息:
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 在正常运用时,文件体系的废物搜集程序将会处理。
能够屏蔽这个信息,或许仅在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