主要观点总结
本文梳理了Android系统启动过程中内核初始化及init进程的前世今生,包括0号进程、1号进程以及epoll事件通知机制等细节。
关键观点总结
关键观点1: 0号进程:引导阶段和启动阶段,汇编语言最终跳转到C语言函数start_kernel,执行init二进制文件,创建init进程。
0号进程是内核初始化的关键,分为引导阶段和启动阶段。引导阶段以汇编语言为主,最终会跳转到C语言的start_kernel函数。该函数间接执行了init二进制文件,从而创建了init进程。
关键观点2: 1号进程:init进程负责的初始化工作。
init进程作为用户空间进程,负责很多初始化工作,包括创建目录、设置访问权限、挂载文件系统、执行安全策略、加载解析rc脚本等。
关键观点3: epoll事件通知机制:用于高并发场景,init进程使用其进行事件通知处理。
epoll是一种IO多路复用机制,用于处理高并发场景。init进程使用epoll进行事件通知处理,如检测子进程信号、属性服务唤醒信号等。
关键观点4: 其他进程:如zygote和kthreadd,分别作为应用进程和内核线程管理的父进程,不在本文讨论范围内。
本文重点介绍了init进程的相关内容,其他进程如zygote和kthreadd虽然也很重要,但不在本文的讨论范围内。
文章预览
前言 本篇内容会适度发散,浅浅涉及到Kernel的源码,这对于了解Android系统的开端是有帮助的。 Kernel代码位于Google仓库( https://android.googlesource.com/kernel )中,可以直接git下载。打开之后可以看到很多目录,其中:common(Android通用内核)、mediatek(MTK平台内核)、msm(高通平台内核)。如果对内核感兴趣的伙伴,可以参照官网文档( https://source.android.com/source/building-kernels )下载完整代码并编译。同时也可以在线浏览Kernel源码( https://cs.android.com/android/kernel/superproject )。 借用Gityuan( https://gityuan.com/android/ )的一张系统启动架构图: 1 一切的开端 从上图中可以看到,开机之后会首先加载Boot Loader。Boot Loader通过一系列指令将内核初始化代码拷贝到内存中并交给CPU执行。其中就包含静态初始化0号进程的代码。此时它还叫做 init_task ,等它完成各种init工作之后,就
………………………………