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程序可以在bootablebootloaderlegacyusbloader找到。
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系统启动顺序 一篇文章看明白 Android 系统启动时都干了什么