image.PNG
目录
第一篇: Android 系统启动之 bootloader
第二篇: Android 系统启动之 Init 流程(上)
第三篇: Android 系统启动之 Init 流程(下)
第四篇: Android 系统启动之 init.rc 文件解析过程
Android 系统启动
image.PNG
PC 机是如何启动的?
引导阶段
读取 BIOS
BIOS: Basic Input/Output System(基本输入输出系统), 一般是主板芯片上的一个程序, 计算机通电后, 第一件事就是读取它.
BIOS 程序首先检查计算机硬件能否满足运行的基本条件, 这叫做 "硬件自检"(Power-On Self-Test), 缩写为 POST. 如果硬件出现问题, 主板会发出不同含义的蜂鸣, 启动中止. 如果没有问题, 屏幕就会显示出 CPU, 内存, 硬盘等信息.
硬件自检完成后, BIOS 把控制权转交给下一阶段的启动程序.
下一阶段的启动程序到底存放在哪一个设备当中. 也就是说 BIOS 需要有一个外部存储设备的排序, 排在前面的设备就是优先转交控制权的设备. 这种排序叫做启动排序, 也就是我们平时进入 BIOS 界面时能看到的 Boot Sequence.
启动程序
第一存储设备被激活后, 计算机读取该设备的第一个扇区, 也就是读取最前面的 512 个字节.
如果这 512 个字节的最后两个字节是 0x55 和 0xAA , 表明这个设备可以用于启动; 如果不是, 表明设备不能用于启动, 控制权于是被转交给 "启动顺序" 中的下一个设备.
这最前面的 512 个字节, 就叫做主引导记录(Master boot record, 缩写为 MBR).
主引导记录
主引导记录 MBR 是位于磁盘最前边的一段引导代码. 它负责磁盘操作系统对磁盘进行读写时分区合法性的判别, 分区引导信息的定位, 它由磁盘操作系统在对硬盘进行初始化时产生的. 硬
盘的主引导记录 MBR 是不属于任何一个操作系统的, 它先于所有的操作系统而被调入内存, 并发挥作用, 然后才将控制权交给主分区内的操作系统, 并用主分区信息表来管理硬盘.
MBR 只有 512 个字节, 放不了太多东西. 它的主要作用是, 告诉计算机到硬盘的哪一个位置去找操作系统. 我们找到可用的 MBR 后, 计算机从 MBR 中读取前面 446 字节的机器码之后, 不再把控制权转交给某一个分区, 而是运行事先安装的 "启动管理器"(boot loader), 由用户选择启动哪一个操作系统.
加载内核阶段
选择玩完操作系统后, 控制权转交给操作系统, 操作系统的内核首先被载入内存.
以 Linux 系统为例, 先载入 /boot 目录下面的 kernel. 内核加载成功后, 第一个运行的程序是 /sbin/init. 它根据配置文件 (Debian 系统是 /etc/initab ) 产生 init 进程. 这是 Linux 启动后的第一个进程, pid 进程编号为 1, 其他进程都是它的后代.
然后, init 线程加载系统的各个模块, 比如: 窗口程序和网络程序, 直至执行 /bin/login 程序, 跳出登录界面, 等待用户输入用户名和密码.
全部启动过程完成.
Android 启动流程
关于 Boot Loaeder
Android 系统虽然也是基于 Linux 系统的, 但是由于 Android 属于嵌入式设备, 并没有像 PC 那样的 BIOS 程序. 取而代之的是 Bootloader -- 系统启动加载器.
Bootloader 主要是在系统加载前, 初始化硬件设备, 建立内存空间的映像图, 为最终调用系统内核准备好环境.
在 Android 运行环境中里没有硬盘, 而是 ROM, 它类似于硬盘存放操作系统, 用户程序等.
ROM 跟硬盘一样也会划分为不同的区域, 用于放置不同的程序.
Android 系统分区:
系统分区 | 功能 |
---|---|
/boot | 存放引导程序,包括内核和内存操作程序 |
/system | 相当于电脑 c 盘,存放 Android 系统及系统应用 |
/recovery | 恢复分区,可以进入该分区进行系统恢复 |
/data | 用户数据区,包含了用户的数据:联系人、短信、设置、用户安装的程序 |
/cache | 安卓系统缓存区,保存系统最常访问的数据和应用程序 |
/misc | 包含一些杂项内容,如系统设置和系统功能启用禁用设置 |
/sdcard | 用户自己的存储区,可以存放照片,音乐,视频等文件 |
启动电源以及系统启动
电源按下开始, 引导芯片代码开始从预定义的地方 (固化在 ROM) 开始执行. 加载引导程序到 RAM, 然后执行.
bootloader
bootloader 程序分两个阶段执行. 第一个阶段, 检测外部的 RAM 以及加载对第二阶段有用的程序; 第二阶段, 设置网络, 内存等等. 这些对于运行内核是必要的, 为了达到特殊的目标, bootloader 可以根据配置参数或者输入数据设置内核.
bootloader 程序可以在 \ bootable\bootloader\legacy\usbloader 找到.
kernel
kernel 开始启动时, 设置缓存, 被保护存储器, 计划列表, 加载驱动.
当 kernel 完成系统设置, 它首先在系统文件中寻找 "init" 文件, 然后启动 root 进程或者系统的第一个进程.
init 进程
init 是第一个进程, 可以说它是 root 进程或者说有进程的父进程.
init 进程有两个责任:
挂载目录, 比如 / sys,/dev,/proc
运行 init.rc 脚本.
init 进程会启动 zygote 进程.
zygote
zygote 进程是系统服务, 可以说是 Android 系统的关键.
在初始化时会启动虚拟机, 并加载一些系统资源.
这样 zygote fork 出子进程后, 子进程也继承了能正常工作的虚拟机和各种系统资源, 接下来只需装载 apk 文件的字节码就可以运行应用程序了, 可以大大缩短应用的启动时间, 这就是 zygote 进程的主要作用.
系统服务或服务
创建完 java 虚拟机后, zygote 进程开始创建服务:
核心服务:
启动序号 | 服务名 |
---|---|
1 | 启动电源管理器; |
2 | 创建 Activity 管理器; |
3 | 启动电话注册; |
4 | 启动包管理器; |
5 | 设置 Activity 管理服务为系统进程; |
6 | 启动上下文管理器; |
7 | 启动系统 Context Providers; |
8 | 启动电池服务; |
9 | 启动定时管理器; |
10 | 启动传感服务; |
11 | 启动窗口管理器; |
12 | 启动蓝牙服务; |
13 | 启动挂载服务。 |
其他服务:
启动序号 | 服务名 |
---|---|
1 | 启动状态栏服务; |
2 | 启动硬件服务; |
3 | 启动网络状态服务; |
4 | 启动网络连接服务; |
5 | 启动通知管理器; |
6 | 启动设备存储监视服务; |
7 | 启动定位管理器; |
8 | 启动搜索服务; |
9 | 启动剪切板服务; |
10 | 启动登记服务; |
11 | 启动壁纸服务; |
12 | 启动音频服务; |
13 | 启动耳机监听; |
14 | 启动 AdbSettingsObserver(处理 adb 命令)。 |
至此, Android 系统就完全跑起来了.O(∩_∩)O哈哈~
参考
Android 系统启动顺序 https://www.cnblogs.com/xichao/p/5177208.html
一篇文章看明白 Android 系统启动时都干了什么
来源: http://www.jianshu.com/p/75039ea24937