Android S启动过程init分析(一) —— First Stage

本文详细介绍了Android系统从BootLoader加载到Init进程启动,再到Zygote进程孵化的过程。Init作为Android的首个用户空间进程,负责孵化其他关键服务和守护进程,如ueventd、logd、ServiceManager、bootanim以及Zygote。Init的启动始于kernel/msm-5.4/init/main.c的run_init_process函数,执行root目录下的init进程。主要涉及的源码文件包括main.cpp、init.cpp、ueventd.cpp等。Init的主要任务包括启动服务、管理进程,并为Android系统的Java层奠定基础。

1 Overview

MTK/高通 BootLoader加载 --> LK(UEFI)加载  --> HLOS(Linus kernel) --> init

2 Init是什么?

Init 是Android OS中第一个user space process(pid = 1),守护进程(在后台运行的特殊进程,用于执行启动的系统任务),源码位于:system/core/init/ ,本文会分析它的完整启动流程。

pid = 0: 启动 Kernel 的 Swapper 进程, idle进程,用于初始化进程管理、内存管理、加载各种驱动等工作。

pid = 1:Init 进程是所有用户进程的鼻祖,Init 进程会孵化出 ueventd、logd、healthd、installd、adbd、lmkd 等用户守护进程;
Init 进程还启动 ServiceManager (binder服务管家)、bootanim (开机动画) 等重要服务;
Init 进程孵化出 Zygote 进程,Zygote 进程是 Android 系统的第一个 Java 进程 (即虚拟机进程),Zygote 是所有 Java 进程的父进程, Zygote 进程本身是由 Init 进程孵化而来的。

pid =2:  Linux 系统的内核进程,会创建内核工作线程 kworkder,软中断线程 ksoftirqd,thermal 等内核守护进程,kthreadd 进程是所有内核进程的鼻祖。

3. Init的起始是什么?

kernel/msm-5.4/init/main.c:  run_init_process(ramdisk_execute_command)

--> 开始执行根目录下的init进程:

Start :platform/system/core/init/main.cpp

platform/system/core/init/init.cpp
platform/system/core/init/ueventd.cpp
platform/system/core/init/selinux.cpp
platform/system/core/init/subcontext.cpp
platform/system/core/base/logging.cpp
platform/system/core/init/first_stage_init.cpp
platform/system/core/init/first_stage_main.cpp
platform/system/core/init/first_stage_mount.cpp
platform/system/core/init/keyutils.h
platform/system/core/init/property_service.cpp
platform/external/selinux/libselinux/src/label.c
platform/system/core/init/signal_handler.cpp
platform/system/core/init/service.cpp

4. Init/main.cpp做了什么谜之操作?

CMD查看init pid:ps -e | grep init

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值