由于init=/linuxrc, 因此,在文件系统挂载后,运行的第一个程序就是根目录下的linuxrc,而这是一个指向/bin/busybox的链接,因此,系统起来后运行的第一个程序就是busybox本身。
Busybox首先将试图解析/etc/inittab来获取进一步的初始化配置信息(参考busybox源代码init/init.c中的parse_inittab()函数)。但,本质上root_qtopia中并没有/etc/inittab这个配置文件。根据busybox的逻辑,将生成默认的配置,其中的new_init_action(SYSINIT, INIT_SCRIPT, “”)决定了接下来初始化的脚本是INIT_SCRIPT所定义的值。这个宏的默认值是“etc/init.d/rcS”.
/etc/init.d/rcS:开机自解析文件,内容如下:
#!/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin:
runlevel=S
prevlevel=N
umask022
exportPATH runlevel prevlevel
##为启动环境设置必要的环境变量;
#
# Trap CTRL-C &c only in this shell so wecan interrupt subprocesses.
#
trap":" INT QUIT TSTP
/bin/hostnameFriendlyARM
##设置机器名字
/bin/mount-n -t proc none /proc
/bin/mount-n -t sysfs none /sys
/bin/mount-n -t usbfs none /proc/bus/usb
/bin/mount-t ramfs none /dev
##挂载“虚拟”文件系统“/proc”和“sys”, 并且在/dev目录下挂载一个ramfs,##相当于把原本nandflash上的只读的/dev目录“覆盖上一块可写的空的SDRAM。
##这里要注意的是,/sys和挂载了ramfs的/dev是正确创建设备节点的关键。
##对于2.6.29内核来说,已经没有devfs的支持,创建设备节点只有通过两
##种办法由文件系统来完成:
##1)制作文件系统镜像前用mknod手动创建好系统所有的(包括可能有的)设备节点,并把这些节点文件一起做进文件系统镜像中;
##2)在文件系统初始化过程中,通过/sys目录所输出的信息,在/dev目录下动态的创建系统中当前实际由的设备节点。
显然,方法1)有很大的局限性,仅限于没有设备动态增加或减少的情况,不适用于很多设备热插拔的情况,比如U盘,SD卡等。方法2)是目前大多数PC上的linux的做法(基于udev实现)。这种方法有2个前提:/sys目录挂载和一个可写的/dev目录。
注意:在文件系统初始化运行到这里之前,原来的/dev目录下必须有一个设备节点:/dev/console
echo/sbin/mdev > /proc/sys/kernel/hotplug
/sbin/mdev-s
/bin/hotplug
##这几个就是用来完成上面所说的俩个东西:
##1)通过mdev –s在/dev目录下创建必要的设备节点;
##2)设置内核的hotplug handler 为mdev,即当设备热插拔时,由mdev接受来
##自内核的消息并作出相应的回应,比如挂载U盘
注意:在文件系统里存在/etc/mdev.conf文件,它包含了medv的配置信息,通过这个文件,我们可以自定义一些设备节点的名称或链接来满足特定的需要。具体内容后面简述。
#mounting file system specified in /etc/fstab
mkdir-p /dev/pts
mkdir-p /dev/shm
/bin/mount-n -t devpts none /dev/pts -o mode=0622
/bin/mount-n -t tmpfs tmpfs /dev/shm
/bin/mount-n -t ramfs none /tmp
/bin/mount-n -t ramfs none /var
mkdir-p /var/empty
mkdir-p /var/log
mkdir-p /var/lock
mkdir-p /var/run
mkdir-p /var/tmp
##用来挂载其他一些常用的文件系统。并在/var目录下新建必要的目录
/sbin/hwclock–s
##用来设定系统时间的,从硬件RTC中获取,要获取正确的时间,必须先设置好正确的时间。
##下面的是启动系统服务,包括log记录,网络,http server, web服务和自定义的led服务等。
Syslogd
/etc/rc.d/init.d/netdstart
echo" " >/dev/tty1
echo"Starting networking..." > /dev/tty1
sleep1
/etc/rc.d/init.d/httpdstart
echo" " >/dev/tty1
echo"Starting web server..." > /dev/tty1
sleep1
/etc/rc.d/init.d/ledsstart
echo" " >/dev/tty1
echo"Starting leds service..." > /dev/tty1
echo" "
sleep1
/sbin/ifconfiglo 127.0.0.1 ##设置本地回环地址
/etc/init.d/ifconfig-eth0 ##运行网卡设置脚本
/bin/sydz_qt_4.6.3& ##自定义启动的应用程序
echo" " > /dev/tty1
echo"Starting Qtopia, please waiting..." > /dev/tty1
syslog- 用于记录内核和应用程序debug信息
netd– inetd, 一个挂载启动各种网络相关服务的看守进程
httpd– http server看守进程
leds– 跑马灯看守进程
自定义启动的应用程序脚本如下:
#!/bin/sh
./bin/ts-device ##启动ts,ts能够为触摸屏驱动获得的采样提供诸如滤波、去抖、校准等功能,通常作为触摸屏驱动的适配层,为上层的应用提供了一个统一的接口。
export TSLIB_PLUGINDIR=/usr/local/lib/ts
export TSLIB_CALIBFILE=/etc/pointercal
export LD_LIBRARY_PATH=/usr/local/lib
export PATH=/bin:/sbin:/usr/bin/:/usr/sbin:/usr/local/bin
##设置必要的环境变量。包括touchscreen设备文件,tslib配置文件,tslib plug-in位置和touchscreen校准数据文件。
##以下17行有待解析
export QWS_DISPLAY=:1
TS_INFO_FILE=/sys/devices/virtual/input/input0/uevent
if[ -e $TS_INFO_FILE -a "/bin/grep -q TouchScreen < $TS_INFO_FILE"]; then
exportQWS_MOUSE_PROTO="Tslib:$TSLIB_TSDEVICE MouseMan:/dev/input/mice"
if [ ! -s /etc/pointercal ] ; then
rm /etc/pointercal
/usr/local/bin/ts_calibrate
fi
else
exportQWS_MOUSE_PROTO="MouseMan:/dev/input/mice"
fi
unsetTS_INFO_FILE
export QWS_KEYBOARD=TTY:/dev/tty1
export HOME=/root
##运行我们自定义的应用程序
/udisk/user_define_app –qws
##用于支持热插拔,处理内核产生的hotplug事件。
hotplug