一, 系统引导 bootloader
加电, cpu 执行 bootloader 程序,正常启动系统,加载 boot.img 【其中包含内
核。还有 ramdisk 】
二, 内核 kernel
bootloader 加载 kernel ,kernel 自解压,初始化,载入 built-in 驱动程序,完成
启动。
内核启动后会创建若干内核线程,在后装入并执行程序 /sbin/init/, 载入 init
process ,切换至用户空间( user-space )
内核 zImage 解压缩
head.S 【这是 ARM-Linux 运行的第一个文件,这些代码是一个比较独立的代码包
裹器。其作用就是解压 Linux 内核,并将 PC 指针跳到内核( vmlinux )的第一条指令 】首
先初始化自解压相关环境 (内存等),调用 decompress_kernel 进行解压,解压后调用
start_kernel 启动内核【 start_kernel 是任何版本 linux 内核的通用初始化函数,它会初始
化很多东西,输出 linux 版本信息,设置体系结构相关的环境,页表结构初始化,设置系
统自陷入口,初始化系统 IRQ ,初始化核心调度器等等 】,最后调用 rest_init 【rest_init
会调用 kernel_init 启动 init 进程(缺省是 /init )。然后执行 schedule 开始任务调度。这
个 init 是由 android 的./system/core/init 下的代码编译出来的,由此进入了 android 的
代码 】。
三, Init 进程启动
【init 是 kernel 启动的第一个进程, init 启动以后,整个 android 系统就起来了 】
init 进程启动后,根据 init.rc 和 init. <machine_name> .rc 脚本文件建立几个基本
服务( servicemanager zygote ),然后担当 property service 的功能
打开 .rc 文件,解析文件内容。【 system/core/init/init.c 】将 service 信息放置到
service.list 中【 system/core/init/init_parser.c 】。
建立 service 进程。【 service_start( …) execve( …)】
在 init.c 中,完成以下工作
1、 初始化 log 系统【 解析 /init.rc 和 init.%hardware%.rc 文件 ,在两个
文件解析步骤 2 时执行“ early-init ”行动 】
2、 初始化设备【 在/dev 下创建所有设备节点,下载 firmwares 】
3、 初始化属性服务器【 在两个文件解析 步骤 2 时执行“ init ”行动 】