由于 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 的内容,也是我们要分析的重点1.PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin:2.runlevel=S3.prevlevel=N4.umask 0225.export PATH runlevel prevlevel##为启动环境设置必要的环境变量;1./bin/hostname FriendlyARM##设置机器名字;1./bin/mount -n -t proc none /proc2./bin/mount -n -t sysfs none /sys3./bin/mount -n -t usbfs none /proc/bus/usb4./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 个前提:/sy s 目录挂载和一个可写的/dev 目录。这也就是为什么我们这里需要挂载/sys 和 ramfs 在/dev 目录上,事实上,这种方法最早就是为热插拔设计的,你可以理解为当系统启动时,所有设备一下子全部"插入"了进来。 这里有一点要说明的是,在文件系统初...