一、通用操作系统的启动过程:
不同的处理器和硬件系统会采用不同的启动策略,从而具体的启动过程会有所差异。
但无论差异如何,从计算机系统的角度来看,启动过程一般分为三个步骤:
开机并执行bootloader程序 ----> 操作系统内核初始化 ----> 执行第一个应用程序
大致流程:
1、开机,系统供电,此时硬件电路会产生一个确定的复位时序,保证CPU是最后一个被复位的器件;
2、当正确完成复位后,CPU开始执行第一条指令,该指令所在的内存地址会因为CPU的不用而不同,但是一定是固定的。这个地址由CPU的制
造者指定。这个固定的地址所保存的程序往往被成为:“引导程序”(Boorloader),因为其作用是装载真正的用户程序;
3、如何加载这个程序,是个策略问题,装载方式多样。但是,无论硬件上使用何种接口装载,装载过程必须提供以下信息,具体包括:
· 从哪里读取用户程序?
· 用户程序的长度是多少?
· 装载完用户程序后,应该跳转到哪里,即用户程序的执行入口在哪里?
4、执行内核程序:初始化各种硬件,然后建立各种内部数据结构,这些数据将用语多线程调度及内存的管理等;
5、运行Home程序:如Windows下的桌面,Linux下的Terminal;
上面是从通用操作系统的角度分析了Linux的启动过程,下面,具体来看Android所使用的Linux内核的启动过程。
二、Android系统的Linux内核的启动过程:
因为目前的Android系统多运行在ARM处理器之上,因此,下面主要分析ARM处理器上的Linux的启动过程。
我们先来区分三个概念:ARM、处理器、CPU
(1)ARM:一种微处理器内核的架构,
(2)处理器:一种统称,可以指具体的CPU芯片,它包含CPU、片上内存、片上外设接口等不同的硬件逻辑,所以严格来说,处理器不等同于CPU;
(3)CPU:CPU是处理器内部的中央处理单元的缩写,CPU可以按照类型分为短指令集架构和长指令集架构两大类。ARM就属于短指令集架构。
流程:
ARM复位 --> 执行其片上ROM中的一小块程序(即Bootloader)--> 装载uboot或者fastboot程序(初始化硬件设备,提供一些调试功能) --> 装载Linux内核 --> 进行内核初始化
Linux内核的启动步骤
在Linux内核启动过程中,存在一个 init.rc 文件,此文件在Android手机中的系统根目录下,可以使用adb pull命令提取该文件。
. /adb pull /init.rc ~/Desktop
init.rc 的内容格式类似于一种脚本,但是它却不是标准的Linux脚本,而是仅用于启动的脚本。关于它的完整格式,可以参考Linux相关文档。