应用程序程序是一个多任务的程序,是一个死循环。
**********************************************************************************************************************************************
根文件系统制作
一、思路
完成rootfs时,主要是实现根文件系统下的各个文件。rootfs中的内容在开发过程中,是可以逐步根据应用添加的。
# ls /
bin home media proc sys usr
dev lib mnt root tmp var
etc opt sbin
======================================================================================================
二、制作过程
1、使用busybox工具可以完成shell命令的制作
busybox实现init进程调用的一个应用:
/bin
/sbin
/usr/bin
/usr/sbin
/linuxrc
1)下载busybox源码:
http://www.busybox.net/downloads/
2)配置交叉编译工具链
注意:
busybox源码包不能在window和linux共享的目录下做。
$ sudo tar -jxvf busybox-1.23.2.tar.bz2
$vi Makefile
CROSS_COMPILE = /usr/local/arm/arm-2009q3/bin/arm-none-linux-gnueabi-
ARCH = arm
3)配置-->选择一些shell命令和工具
#make menuconfig
4)编译
#make
5)安装工具
#make install
在busybox源码包的根目录下有个_install目录。
-----------------------------------------------------------------------------------------
2、向rootfs中添加动态库(so)
/lib
1)我们要从交叉编译工具链中把最基础的动态库拷贝到/lib下
2)我们也使用一些库(libjpeg)的源码包,编译生成动态库,该库也要放在lib目录下
方法如下:
# cp /usr/local/arm/arm-2009q3/arm-none-linux-gnueabi/libc/armv4t/lib/*so* lib -rdf
# arm-none-linux-gnueabi-strip lib/*so*
问题:
我们自己编译的一个应用程序,如何知道该程序需要哪些动态库??
静态编译:
#gcc -o hello hello.c -static
动态编译:
#gcc -o hello hello.c
$file hello
hello: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.16, not stripped
$ arm-none-linux-gnueabi-readelf -d hello
0x00000001 (NEEDED) Shared library: [libgcc_s.so.1]
0x00000001 (NEEDED) Shared library: [libc.so.6]
-----------------------------------------------------------------------------------------
3、/dev目录下内容--->设备文件:linux应用程序访问驱动程序的接口
/dev
在/dev下需要预先创建两个设备文件,该两个文件是内核在启动过程中使用的,所以要预先创建
#mknod console c 5 1
#chmod 777 console
mknod null c 1 3
chmod 777 null
/dev目录下的其他的设备文件是mdev工具根据/sys目录下的设备驱动信息自动创建
-----------------------------------------------------------------------------------------
4、/proc和/sys目录下内容
/proc
/sys
1)/proc
实时反映了linux系统的工作状态,/proc挂载proc文件系统。/proc目录在制作根文件系统的时候是空的。
2)/sys
实时反映了linux系统中设备驱动的信息,/sys挂载sysfs文件系统。/sys目录在制作根文件系统的时候是空的。
-----------------------------------------------------------------------------------------
5、/etc下的内容
# ls /etc/
Wireless inittab protocols
boa login.defs rc.d
fstab mdev.conf resolv.conf
ftpchroot mime.types services
ftpusers net.conf sysconfig
group nettype.conf ts.conf
host.conf passwd udisk
hosts pointercal wpa_supplicant.conf
inetd.conf ppp
init.d profile
/etc是linux系统运行的时候,一些配置文件,这些文件需要自己创建,或者从其他rootfs包中拷贝。
/etc下的关键文件:
1)/etc/inittab
2)etc/init.d/rcS
3)etc/fstab
4)etc/profile
5)etc/resolv.conf
6)etc/inetd.conf
7)etc/sysconfig/HOSTNAME
8)etc/passwd、etc/group、etc/shadow
9)etc/mdev.conf
10)etc/hotplug/usb/udisk_insert
etc/hotplug/usb/udisk_remove
etc/hotplug/sd/sd_insert
etc/hotplug/sd/sd_remove
-----------------------------------------------------------------------------------------
6、其他目录的创建
/home
/root
/var
/mnt
/media
/tmp
/opt
以上目录都是空的,可以根据实际的使用情况在添加。
======================================================================================================
三、rootfs如何挂载使用
1、通过nfs挂载rootfs文件(ubuntu中)
首要条件:
在ubuntu上安装nfs服务器。
1)查看nfs的挂载目录
$ showmount -e
Export list for ubuntu:
/opt/target *
2)将rootfs文件包拷贝到/opt/target目录下
$ pwd
/opt/target/mini_rootfs
3)修改uboot的启动参数
# setenv bootargs 'console=ttySAC0,115200 root=/dev/nfs rw nfsroot=192.168.1.6:/opt/target/mini_rootfs ip=192.168.1.4:192.168.1.1::255.255.255.0::eth0:off init=/linuxrc'
4)启动板子:
输出:
[ 5.723629] device=eth0, addr=192.168.1.4, mask=255.255.255.0, gw=255.255.255.255,
[ 5.723705] host=192.168.1.4, domain=, nis-domain=(none),
[ 5.723756] bootserver=192.168.1.1, rootserver=192.168.1.6, rootpath=
[ 5.725965] Looking up port of RPC 100003/2 on 192.168.1.6
[ 5.732285] Looking up port of RPC 100005/1 on 192.168.1.6
[ 5.741605] VFS: Mounted root (nfs filesystem) on device 0:12.
[ 5.741985] Freeing init memory: 536K
Please press Enter to activate this console.
5)测试:
ls /sys
ls /proc
ls /dev
./hello
2、挂在nand中的rootfs映像:
先将rootfs根文件系统文件进行打包生成rootfs.img, 再将该包烧写到nand中。)
1)使用一个打包的工具:将roofs的文件,打包成yaffs2文件系统格式的一个文件包
(1)编译源码包,生成工具
# tar xvf yaffs2-source.tar
# cd yaffs2/utils
# make
# cp mkyaffs2image /usr/local/bin/
(2)对rootfs进行打包
# mkyaffs2image mini_rootfs rootfs.img
2)将rootfs.img烧写到nand flash
3)修改启动参数
# setenv bootargs 'console=ttySAC0,115200 root=/dev/mtdblock4 rw rootfstype=yaffs2 init=/linuxrc'
======================================================================================================
四、问题分析
1、注意内核移植的时候,是否选择了nfs服务
没有找到/dev/nfs
见《内核的移植文档》
2、确认启动参数是否正确
服务IP
本地IP
nfs的挂在目录是否正确
3、将rootfs中/etc/init.d/rcS文件中:
ifconfig eth0 192.168.1.4 #本地IP
4、确认ubuntu nfs服务器的挂载目录
#showmount -e
5、修改 /opt/target/mini_rootfs文件的权限
#sudo chmod 777 /opt/target/mini_rootfs -R
6、Please press Enter to activate this console.
将:
::askfirst:-/bin/sh
改成:
::respawn:-/bin/sh