X86架构的PC机的启动过程
按下电源按钮的直到欢迎页出来之后,linux总共做的事可以分为五步来完成。
1、 BIOS加电自检:
加电自检,检测硬件设备。然后按照cmos上面的顺序来搜索处在活动状态下的可以引导的设备。可以是光驱、软盘、USB等。
2、 加载主引导加载程序(MBR):
主引导程序是一个512字节的映像。包含一点机器码还有一个小的分区。
主引导程序的任务就是查找并且加载处在硬盘分区上的次引导程序。通过分区表查找活动分区,并将处在活动分区的次引导加载程序读取到内存里面运行。
3、 加载次引导记载程序(GRUB)
次引导加载程序只要就是加载linux内核。
上一阶段结束之后次引导加载程序就会在内存里面跑起来。就会出现GRUB图形界面,让用户选择加载什么样的内核。
4、 linux内核映像:
用户选择要加载的内核之后,次引导加载程序(GRUB)就会根据/boot/grub.conf配置文件中所设置的信息,从/boot/所在的分区上读取Linux内核映像,然后把内核映像加载到内存中并把控制权交给Linux内核。
linux内核获得控制权之后开始干自己的事
1、 检测硬件
2、 解压缩自己并安装必要驱动
3、 初始化与文件系统相关的虚拟设备,LVM或RAID
4、 装载根文件系统,挂在根目录下面
5、 完成之后,linux在进程空间里面加载init程序,下面轮到init干活
5、 init进程
init是所有进程的发起者和控制者,所有的进程都由此衍生。
init进程获得控制权之后,它会执行/etc/rc.d/rc.sysinit脚本,根据里面的代码设置环境变量、网络、启动swap、检查并挂载文件系统、执行其他初始化工作。
至此,linux启动完成。
ARM架构的Android启动过程
当按下开机键后,Android的启动过程可以大致分为以下四步。
1、引导ROM加载第一级引导加载程序:
位于引导ROM(read-only-memory)中的的特定代码会找到第一级的引导加载程序(即主引导加载程序),并将其加载到存储器中。引导ROM是一个ASIC芯片,其中含有固化在芯片中的代码。
2、第一级引导加载程序利用存储器初始化程序启动第二级引导加载程序:
引导加载程序会检查安全标记是否开启(S-ON)。如果已经开启,那么引导程序只会加载被标记(官方)内核。如果安全标记是关闭的(S-OFF),那么引导加载程序就不在检查标记了。将安全标记设置为S-OFF还好解开其他安全锁,从而使得整个文件系统成为可写状态。解开安全锁将会允许你将定制的Recovery程序安装到设备中。
3、引导加载程序将Linux内核和定制化内容加载到存储器
引导加载程序将对硬件的控制权转给了Linux内核。Linux内核以及定制的软件和固件通常都打包在一起。这就是我们刷机的时候说的ROM。但其实刷入的地方(NAND存储器)并非是只读的。
4、最后一步是初始化(INIT)进程。INIT进程是设备上运行的其他所有进程的前提。他会初始化基础硬件房屋i设备功能所需的所有进程。他还会启动用来执行大多数应用程序的Dalvik虚拟机。
总结:Linux和Android启动的区别
整个的来看Android的启动过程和Linux的启动过程大同小异,比毕竟他们大体上是一样的只是运行在不同架构的硬件上而已吧。
补充:Recovery程序
Recovery程序是一段独立代码,它存在于一个引导分区中(正常的启动过程并不会启动到Recovery程序,我的理解),用来更新Android和维护设备。几乎所有的Android设备都有一个用来引导的Recovery程序。Recovery程序可以做很多有用的事情,比如讲设备恢复为出厂、清楚数据缓存以及安装Android操作系统的官方更新。
参考:Linux启动过程分析
Android应用程序进程启动过程的源代码分析
Android超级用户工具箱(书)