一. 启动架构
当前一些智能设备都是由硬件结合体加上操作系统组装而成,由操作系统控制相应的软件去操作硬件。常见的操作系统有Windows,Android,Linux,MacOS。
Android系统启动过程由图从下往上的可以分为5个过程,然后依次分为Boot Loader -> Kernel -> Native -> Framework -> App,如下图:
这个启动流程也可以简化成两个阶段:
1.BIOS 阶段:
BIOS 在主板的 ROM 中存储, 加电之后便会启动
2.bootloader 阶段, 读取磁盘上的操作系统:
0 号进程:所有进程的祖先, 这是 Linux 唯一一个没有通过 fork 或者 kernel_thread 产生的进程,初始化进程管理、内存管理, 初始化驱动程序 Display, Camera Driver, Binder Driver 等相关工作;
1 号进程(init 进程):为用户进程, 是所有用户态进程的祖先;
2 号进程:为内核进程, 负责内核态所有进程的管理和调度, 是所有 Linux 内核进程的祖先;
进程的分工可以用如下图总结:
进程主要分用户进程和内核进程,我们主要看用户进程。
二. init进程
从 Init 进程的启动主要的职责如下:
-
挂载文件系统, 创建驱动目录和驱动设备文件;
-
解析启动脚本(init.rc);
-
执行脚本指令;
a. 启动服务管理进程(ServiceManager);
b. 启动图像渲染进程(SurfaceFlinger);
c. 启动 Zygote 进程;
三. 服务管理进程ServiceManager
从名字上就可以看出来它是用来管理系统中的service,通过Binder去协助获取服务(AMS,PKMS);
-
打开 Binder 驱动;
-
注册为当前进程为 Binder 上下文的管理者;
-
将当前线程注册为 Binder Loop 线程;
在Android,Binder也是Andro