Android 启动流程-核心(MTK R)集锦

目录

kernel 到android核心启动过程

init 启动过程

Zygote 启动过程

开机动画播放过程

system_server 启动过程


内核空间创建线程

https://cloud.tencent.com/developer/article/1842304

用户空间创建线程

https://cloud.tencent.com/developer/article/1842307

kernel 到android核心启动过程

kernel镜像执行跳转到start_kernel开始执行,在rest_init会创建两个kernel 进程(线程),其分别是为kernel_init 与kthreadd,创建完后系统通过init_idle_bootup_task蜕化为idle进程(cpu_idle)。

kthreadd作用是管理调度其它的内核线程;idle 进程就是cpu 空闲会执行;kernel_init主要加载初始化设备驱动,之后在run_init_process通过execv执行init镜像变身(pid 不变,镜像变了)为用户态init 进程,执行init 解析.rc 启动native服务,创建zygote进程就进入到android。

static int __init hottemptature_watchdog_init(void)

arch_initcall_sync(hottemptature_watchdog_init)

这里的hottemptature_watchdog_init在do_initcalls函数中执行,其被调用的过程为start_kernel -> rest_init-> kernel_init -> do_basic_setup-> do_initcalls

init 启动过程

Android 10.0系统启动之init进程-[Android取经之路]_IngresGe的博客-CSDN博客_run_init_process

Android系统开机流程 - LB笨小孩 - 博客园

kernel-4.19-lc/init/main.c

调用kernel_thread()创建1号内核线程, 该线程随后转向用户空间, 演变为init进程

调用kernel_thread()创建kthreadd内核线程。

init_idle_bootup_task():当前0号进程init_task最终会退化成idle进程,所以这里调用init_idle_bootup_task()函数,让init_task进程隶属到idle调度类中。即选择idle的调度相关函数。

调用schedule()函数切换当前进程,在调用该函数之前,Linux系统中只有两个进程,即0号进程init_task和1号进程kernel_init,其中kernel_init进程也是刚刚被创建的。调用该函数后,1号进程kernel_init将会运行!

调用cpu_idle(),0号线程进入idle函数的循环,在该循环中会周期性地检查

kernel_init 中会执行/init(ramdisk_execute_command的值为"/init")

system/core/rootdir/init.rc

service ueventd /system/bin/ueventd

class core

critical

seclabel u:r:ueventd:s0    

shutdown critical

on early-init

   start ueventd

/init 启动后执行/system/core/init/main.cpp 中main 方法,这里执行FirstStageMain()

system/core/init/first_stage_init.cpp

FirstStageMain()中通过execv 执行/system/bin/init,参数为selinux_setup。这里init 跟/init 一样,因此再次执行init 镜像。这里如果是重启到bootloader,会执行InstallRebootSignalHandlers

SetupSelinux 中再次执行init,这里会注册信号处理函数

从而参数second_stage,执行SecondStageMain ,在这里解析.rc ,启动ueventd,并等待其启动完成。

init 镜像通过execv会执行两次,分别通过FirstStageMain和SecondStageMain执行。

FirstStageMain主要操作

  • 设置环境变量
  • 创建并挂载相关的文件系统
  • 重定向输入输出/内核Log系统
  • 初始化AVB版本
  • 初始化Selinux

SecondStageMain阶段主要操作

  • 设置会话密钥环
  • 初始化属性
  • 处理内核命令
  • 清除上一个阶段环境变量
  • Selinux策略加载
  • Selinux属性重置
  • 创建epoll句柄
  • 启动属性服务
  • 加载bootscript,解析*.rc文件
  • 触发执行early-init,启动ueventd
  • 执行Action
  • 触发执行init,启动servicemanager,启动binder
  • 触发执行late-init,触发early-fs,启动vold
  • 触发fs,解析fstab,挂载data分区,检查加密要求,执行触发nonencrypted
  • 触发post-fs、late-fs,启动keymaster服务
  • 触发post-fs-data,installkey对data分区做文件加密,init_user0进行CE加密,加载data分区下persist属性
  • 触发on boot ,class_start core 中启动surfaceflinger ,class_start main 中启动zygote

Zygote 启动过程

System_Server与Zygote共存亡_空白的泡的博客-CSDN博客

System_server 跟zygote 共亡

Android Zygote介绍 - 北落不吉 - 博客园

Zygote从frameworks/base/cmds/app_process/app_main.cpp的main()函数开始

Zygote 是init 通过解析.rc文件启动的。

service zygote /system/bin/app_process32 -Xzygote /system/bin --zygote --start-system-server --socket-name=zygote

class main

service zygote_secondary /system/bin/app_process64 -Xzygote /system/bin --zygote --socket-name=zygote_secondary

class main

这里分32 位和64位,以32为为主,64位为辅。

app_process32(64)可执行程序对应app_main文件中main 方法。

Zygote流程总结:

  • 创建AppRuntime对象,并调用它的start。此后的活动则由AppRuntime来控制。
  • 调用startVm创建Java虚拟机,然后调用startReg来注册JNI函数。
  • 通过JNI调用com.android.internal.os.ZygoteInit类的main函数,从此进入了Java世界。
  • 调用registerZygoteSocket响应应用创建请求,同时Zygote调用preload来加载framework 类、资源、库等来创建公共java 环境,后面应用共享。
  • Zygote通过startSystemServer创建子进程system_server来为Java世界服务。
  • Zygote完成了Java世界的初创工作,下一步该做的就是调用runSelectLoopMode后一直等待应用进程的请求

开机动画播放过程

开机动画是init 通过解析.rc文件启动的。

<Android10.0 开机广播BOOT_COMPLETED发送流程分析_skytoby的博客-CSDN博客_android boot complete发送时机>

service surfaceflinger /system/bin/surfaceflinger

     class core animation

开机动画启动,对应main_surfaceflinger文件中main方法,bootanimation_main文件中main方法。

开机动画播放过程:

  • init 解析.rc 启动surfaceflinger 播放动画,紧接着会启动zygote从而进入android;
  • 在android 启动过程,在用户手机解密后(FBE 加密方式data解密完成),AMS会收到ACTION_USER_UNLOCK广播,就会启动launcher,通过socket 向zygote 发送请求,创建launcher 进程后AMS启动加载TopActivity桌面;
  • launcher 进程加载完在空闲时会发送activityIdle 消失给到AMS,AMS 收到消息会通过WMS发起bootFnished 命令码binder 调用到surfaceflinger;
  • surfaceflinger 会设置service.bootanim.exit为1,bootanimation 检测到为1就会退出动画播放

system_server 启动过程

system_server启动就是执行com.android.server.SystemServer类中main方法。

Systemserver启动流程总结:

  • Zygote调用startSystemServer创建fork system_server进程;
  • system_server进程执行com.android.server.SystemServer的main函数,主要工作

1、加载libandroid_server.so并调用native_init方法;

2、创建SystemServerManagr,管理启动各个服务对应的Manager;

3、通过下面的方法启动一些系统服务

        startBootstrapServices()

        startCoreServices()

        startOtherServices()

4、进入消息循环,等待请求;

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值