总结一个图:kernel 到android核心启动过程
kernel镜像执行跳转到start_kernel开始执行,在rest_init会创建两个kernel 进程(线程),其分别是为kernel_init 与kthreadd,创建完后系统通过init_idle_bootup_task蜕化为idle进程(cpu_idle)。
调用kernel_thread()创建1号内核线程, 该线程随后转向用户空间, 演变为init进程
调用kernel_thread()创建kthreadd内核线程。
- init_idle_bootup_task():当前0号进程init_task最终会退化成idle进程,所以这里调用init_idle_bootup_task()函数,让init_task进程隶属到idle调度类中。即选择idle的调度相关函数。
- 调用cpu_idle(),0号线程进入idle函数的循环,在该循环中会周期性地检查
- kernel_init 中会执行/init(ramdisk_execute_command的值为"/init")
在这里插入图片描述
/init 启动后执行/system/core/init/main.cpp 中main 方法,这里执行FirstStageMain()
(看看这到了哪里?这到了咱们的的AVB那个地方啊)
FirstStageMain()中通过execv 执行/system/bin/init,参数为selinux_setup。这里init 跟/init 一样,因此再次执行init 镜像。
这里如果是重启到bootloader,会执行InstallRebootSignalHandlers
SetupSelinux 中再次执行init,这里会注册信号处理函数
从而参数second_stage,执行SecondStageMain ,在这里解析.rc ,启动ueventd,并等待其启动完成。
init 镜像通过execv会执行两次,分别通过FirstStageMain和SecondStageMain执行。
Zygote是Android系统创建新进程的核心进程 ,
- 负责启动Dalvik虚拟机,
- 加载一些必要的系统资源和系统类,
- 启动system_server进程,
- 随后进入等待处理app应用请求。
到这里我们就暂时停下,别走远了。
芯片上电到Android
总结一下整个流程
- 第一步:手机开机后,引导芯片启动,引导芯片开始从固化在ROM里的预设代码执行,加载引导程序到到RAM,bootloader检查RAM,初始化硬件参数等功能;
- 第二步:硬件等参数初始化完成后,进入到Kernel层,Kernel层主要加载一些硬件设备驱动,初始化进程管理等操作。在Kernel中首先启动swapper进程(pid=0),用于初始化进程管理、内管管理、加载Driver等操作,再启动kthread进程(pid=2),这些linux系统的内核进程,kthread是所有内核进程的鼻祖;
- 第三步:Kernel层加载完毕后,硬件设备驱动与HAL层进行交互。初始化进程管理等操作会启动INIT进程 ,这些在Native层中;
- 第四步:init进程(pid=1,init进程是所有进程的鼻祖,第一个启动)启动后,会启动adbd,logd等用户守护进程,并且会启动servicemanager(binder服务管家)等重要服务,同时孵化出zygote进程,这里属于C++ Framework,代码为C++程序;
- 第五步:zygote进程是由init进程解析init.rc文件后fork生成,它会加载虚拟机,启动System Server(zygote孵化的第一个进程);System Server负责启动和管理整个Java Framework,包含ActivityManager,WindowManager,PackageManager,PowerManager等服务;
- 第六步:zygote同时会启动相关的APP进程,它启动的第一个APP进程为Launcher,然后启动Email,SMS等进程,所有的APP进程都由zygote fork生成。
那么到这里我们就把整个系统的启动串联起来了从bootrom-bootloader-kernel。
当然真实的系统为了安全,比如说 基于TrustZone框架的启动流程 ,那肯定不止这些步骤,但是大体上也是穿插在这个流程之中的增删改。