1)BootLoader(引导加载器)运行到一定阶段后,将加载并启动Linux内核。准备启动内核时,BootLoader需要传入内核使用的启动参数。查看启动参数可使用下面的命令:
cat /proc/cmdline
root=/dev/nfs nfsroot=192.168.6.158:/home/houshuaihui/nfs/bcm7241-rootfs rw, ip=192.168.6.159:192.168.6.158:192.168.88.1:255.255.0.0:ccdt-stb:eth0:on mtdparts=spi0.0:1M(cfe),64
K(macadr),64K(nvram),64K(stbid),64K(disp_format),64K(encryption),-(others);brcmnand.0:10M(kernel),20M(recovery),10M(splash),10M(misc),300M(ubi_fs),1200M(ubi_data),400M(ubi_cache),80M(ubi_dvb) init=/init bmem=128M@128M bmem=345M@512M
2)Linux内核运行和加载根文件系统。根文件系统可以有内核参数“root”来指定。如上一条红色标注(root=/dev/nfs),标示使用NFS网络文件系统。
3)Linux内核运行根文件系统中一个名称为init的可执行程序,作为用户空间的第一个进程。init程序运行后,程序将会在根目录中找到名称为init.rc的文件作为启动脚本。
4)挂载各个文件系统,当几个文件系统(system、data、cache等)被加载后,才可以使用system/lib中的动态库和system/bin中的可执行程序。
5)系统各个进程的运行,init可执行程序后,其执行的第一个子进程的名称为uevent的可执行程序。它在系统的初始化的最初阶段运行,在默认的init.rc中,on early-init定义了启动uevent的可执行程序。init运行完成初始化后,将会按照Init.rc脚本中的内容运行系统中的各个服务。
使用ps命令可以看到系统中的各个进程:
USER PID PPID VSIZE RSS WCHAN PC NAME
root 1 0 412 260 00000000 0008bd64 S /init
root 2 0 0 0 00000001 00000000 S kthreadd
root 3 2 0 0 00000000 00000000 S ksoftirqd/0
root 4 2 0 0 00000000 00000000 S kworker/0:0
system 2136 1 1100 308 00000000 7742db84 S /system/bin/servicemanager
root 2138 1 5112 860 ffffffff 77d65544 S /system/bin/vold
root 2273 1 416796 16920 ffffffff 7751ed34 S zygote
。。。
1号进程为用户空间进程init,2号进程为内核空间进程kthreadd。通常情况下用户空间的各个进程均以1号进程作为祖先,内核空间进程均以2号进程作为祖先。(PPID为父进程号)