android系统启动流程之init启动分析

news2024/11/15 21:31:41

 先根据上图来描述下安卓整个系统的启动流程:

当上电时,系统先执行BootRom, 加载引导程序执行。

然后进入bootloader,在安卓系统中基本上这个bootloader是uboot, 通过uboot引导启动内核,此时运行在kernel空间,这时的idle属于内核中的进程,它的pid = 0,它负责初始化进程、内存、驱动等相关工作,随后由idle启动fork一个为init进程,这个属于用户空间的进程,pid = 1,然后再fork创建pid=2的kthreadd内核进程,这个是内核进程的鼻祖。init进程则是用户空间的鼻祖,应用空间的所有进程要么直接或间接都是由init进程创建的。

比如init会fork()创建zygote, 这个进程则是java进程的所有鼻祖,所有的java app均来自于zygote进程的fork操作,比如安卓非常重要的系统进程服务SystemServer也是由zygote孵化而来,SystemServer是zygote进程的大儿子,SystemServer进程被创建启动之后,将会创建系统所需要的各种Services, 如ActivityManagerService, WindowManagerService, PackageManagerServices等等,安卓系统中一共大约有90+种服务,均由SystemServer创建生成,因此所有的系统Service服务它们都属于SystemServer进程。

而app的启动过程,则是通过AMS通过发送socket消息给zygote进程,由zygote进程fork()创建这个app进程。

  •  init进程的启动

init进程的程序可执行源文件位于/system/bin/init中,前面的流程图可知init进程是由内核的idle进程启动的,先来看看内核中启动init进程的部分源码:

/kernel/common/init/main.c -->kernel_init():
    -->try_to_run_init_process("/bin/init"); //启动init进程。
        -->run_init_process("/bin/init");
            -->kernel_execve("/bin/init"); //还是熟悉的味道与配方

  init的入口函数是main.cpp文件的main函数,下面是真正的init的启动流程:

  main():
    //第一阶段重要工作:
    //1挂载文件系统,创建文件
    //2重定向输入输出,重定向内核日志
    //3启动selinux_setup
    -->第一阶段:FirstStageMain(argc, argv);
        -->mount("tmpfs","dev","tmpfs"); //挂载虚拟文件系统
           mount("devpts","/dev/pts", "devpts",0,NULL)
           mount("proc", "/proc",..);
           mount("sysfs","/sys","sysfs");
           mount("selinuxfs",...);
           mount("tmpfs","/mnt")
           //创建一些设备结点
           mknod("/dev/kmsg");
           mknod("/dev/null");

           SetStdioToDevNULL();
           InitKernelLogging(); //日志重定向
           DoFirstStageMount(); //挂载一些重要的分区设备
           //启动selinux_setup
           char* args[]={path, "selinux_setup"};
           execv(path, args);//参数传递进去继续执行。

    进入第二阶段:main()->SetupSelinux(argv):创建Selinux android强制访问机制
      -->SetStdioToDevNull(); //日志重定向
         InitKernelLogging();
         SelinuxSetupKernelLogging();
         SelinuxInitialize(); //linux安全策略初始化
         //Android --权限  用selinux最小权限原则来处理。
         char* args[]={path, "second_stage"};
         execv(path, args);//参数传递进去继续执行,进入第三阶段

    进入第三阶段:main()->SecondStageMain(argc, argv);
      -->SetStdioToDevNULL();
         InitKernelLogging(); //日志重定向
         PropertyInit(); //属性域初始化
           -->PropertyLoadBootDefaults();
         SelinuxSetupKernelLogging();
         SelabelInitialize();
         SelinuxRestoreContext();//恢复安全上下文
         //处理子进程的终止信号--防止僵尸进程
         Epoll epoll;
         InstallSignalFdHandler(&epoll);
         InstallInitNotifier(&epoll)
         StartPropertyService(&property_fd);//启动属性服务

         GetBuiltinFunctionMap();//命令与函数映射:如将mkdir命令-->mkdir函数匹配

         LoadBootScripts(am,sm); //解析init.rc文件
         while(1){ //进入while循环
            am.ExecuteOneCommand(); //执行解析出来的action里的指令
            auto pending_functions = epoll.Wait(epull_time);//等待
         }

下面看看LoadBootScripts它是如何进行init.rc文件的解析流程的:

LoadBootScripts(am,sm); //解析init.rc文件
  //创建解析器,action_manager结构可以保存所有的action列表
  //service_list:保存解析init.rc中的所有服务。
  -->Parser parser = CreateParser(action_manager, service_list);
      -->parser.AddSectionParser("service"); //service解析器
         parser.AddSectionParser("on"); //on解析器
         parser.AddSectionParser("import");//import解析器
     parser.ParseConfig("/system/etc/init/hw/init.rc");//解析init.rc
      -->ParseConfigFile(path); 
        -->ParseData(path, &config_contents.value());//具体的解析过程在里面,
  • 总结

init进程的重要处理事务:
1 挂载文件
2 设置selinux --安全策略
3 开启属性服务,注册到epoll中
4 解析init.rc文件
5 执行循环处理脚本 --启动ServiceManager zygote等
6 循环等待

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/934324.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

探索数据的维度:多元线性回归在实际应用中的威力

文章目录 🍀引言🍀什么是多元线性回归?🍀多元线性回归的应用🍀构建多元线性回归模型的步骤🍀R-squared(R平方)🍀多元线性回归案例---波士顿房价 🍀引言 当谈…

开源软件与知识产权:需要注意什么?

🌷🍁 博主猫头虎 带您 Go to New World.✨🍁 🦄 博客首页——猫头虎的博客🎐 🐳《面试题大全专栏》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 &a…

【Kaggle】使用Kaggle快速下载GitHub等国外网站的文件|GitHub下载加速

痛点 很多时候直接从GitHub或者其他国外网站下载文件速度会很慢 所以这里就提供一个利用Kaggle加速GitHub下载文件的方法 解决方法 Kaggle是什么? 感兴趣的可以看一下这个,不看也不影响 怎么做 首先登录kaggle,新建一个notebook 复制下…

软件工程(十三) 设计模式之结构型设计模式(一)

前面我们记录了创建型设计模式,知道了通过各种模式去创建和管理我们的对象。但是除了对象的创建,我们还有一些结构型的模式。 1、适配器模式(Adapter) 简要说明 将一个类的接口转换为用户希望得到的另一个接口。它使原本不相同的接口得以协同工作。 速记关键字 转换接…

【Go 基础篇】Go语言中的自定义错误处理

错误是程序开发过程中不可避免的一部分,而Go语言以其简洁和高效的特性闻名。在Go中,自定义错误(Custom Errors)是一种强大的方式,可以为特定应用场景创建清晰的错误类型,以便更好地处理和调试问题。本文将详…

ModaHub魔搭社区:WinPlan经营大脑管理中心

角色权限 展示设置的角色,及对应的成员及权限点。角色、成员、权限点可自由配置;管理员的角色不可删除、权限点默认全部不可更改。 WinPlan决策系统 算力 阿里云 腾讯云 AWS亚马逊 框架 业务数据基座 WinPlan垂直大模型 模型 分

必抓!程序员必备的关键算法:探索编程世界的珍宝

嗨,亲爱的编程同道们!在这个码农的世界里,算法就像我们的剑与盾,为我们打开问题的大门。不论你是新手刚踏入编程领域,还是老手早已颇有心得,总有那几种算法是我们绝对不能错过的,它们是你编程路…

华为手机实用功能介绍

一、内置app介绍 分四块介绍,包括出门款、规划款、工作款和生活款。 出门款:红色框框部分,照镜子化妆/看天气 规划款:黄色框框部分,日程表/计划表/番茄时间/计时 工作款:蓝色框框部分,便笺/录…

R语言响应面(RSM)、线性模型lm分析生产过程影响因素可视化

全文链接:https://tecdat.cn/?p33499 响应面(Response Surface Methodology,RSM)分析是一种常用的统计方法,用于研究和优化生产过程中的影响因素。通过建立数学模型来描述因素与响应之间的关系,RSM可以帮助…

实战项目 在线学院springcloud调用篇3(nacos,feging,hystrix,gateway)

一 springcloud与springboot的关系 1.1 关系 1.2 版本关系 1.3 list转json串 public class Test {public static void main(String[] args) {List<String> dataListnew ArrayList<String>();dataList.add("12");dataList.add("45");dataLi…

【CSS】CSS 特性 ( CSS 优先级 | 优先级引入 | 选择器基本权重 )

一、CSS 优先级 1、优先级引入 定义 CSS 样式时 , 可能出现 多个 类型相同的 规则 定义在 同一个元素上 , 如果 CSS 选择器 相同 , 执行 CSS 层叠性 , 根据 就近原则 选择执行的样式 , 如 : 出现两个 div 标签选择器 , 都设置 color 文本颜色 ; <style>div {color: re…

DQL语句的用法(MySQL)

文章目录 前言一、DQL语句间接和语法1、DQL简介2、DQL语法 二、DQL语句使用1、基础查询&#xff08;1&#xff09;查询多个字段&#xff08;2&#xff09;为字段设置别名&#xff08;3&#xff09;去除重复记录 总结 前言 本文主要介绍SQL语句中DQL语句的功能和使用方法&#…

【Go 基础篇】Go语言中的数组:初识与应用

Go语言以其简洁、高效和强大的特性在编程界广受欢迎。数组作为一种基本的数据结构&#xff0c;在各种应用场景中扮演着重要角色。本文将引入Go语言中的数组&#xff0c;介绍其特点、创建、初始化以及基本应用&#xff0c;为你打开数组的大门。 前言 数组是一种固定大小的数据…

【LeetCode75】第三十八题 二叉树的最近公共祖先

目录 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 代码&#xff1a; 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 给我们一棵二叉树&#xff0c;然后给我们pq两个节点&#xff0c;让我们找出二叉树中它们俩的最近的公共祖先。 那么什么样的节点是它们俩…

Linux常用命令——df命令

在线Linux命令查询工具 df 显示磁盘的相关信息 补充说明 df命令用于显示磁盘分区上的可使用的磁盘空间。默认显示单位为KB。可以利用该命令来获取硬盘被占用了多少空间&#xff0c;目前还剩下多少空间等信息。 语法 df(选项)(参数)选项 -a或--all&#xff1a;包含全部的…

C#,《小白学程序》第六课:队列(Queue)的应用————《实时叫号系统》

1 文本格式 /// <summary> /// 下面定义一个新的队列&#xff0c;用于演示《实时叫号系统》 /// </summary> Queue<Classmate> q2 new Queue<Classmate>(); /// <summary> /// 《小白学程序》第六课&#xff1a;队列&#xff08;Queue&#xf…

用Python画出极坐标的基向量

文章目录 极坐标基向量的推导可视化 极坐标基向量的推导 极坐标其实很神奇&#xff0c;一方面&#xff0c;它描述的是平直时空&#xff0c;另一方面&#xff0c;任意两点间的坐标差为 d r , d θ \text dr, \text d\theta dr,dθ时&#xff0c;两点间的距离却是不固定的。极坐…

wxpython + cef 是优秀的 WebView 组件

CEF 即 (Chromium Embedded Framework)&#xff1b;cef 是优秀的 WebView 组件。 pip install wxpython4.2 wxPython-4.2.0-cp37-cp37m-win_amd64.whl (18.0 MB) Successfully installed wxpython-4.2.0 pip install cefpython3 cefpython3-66.1-py2.py3-none-win_amd64.whl …

springboot+vue基于 JAVA 的医院门诊信息管理系统的设计与实现 f1ls0

系统根据现有的管理模块进行开发和扩展&#xff0c;采用面向对象的开发的思想和结构化的开发方法对医院门诊信息的现状进行系统调查。采用结构化的分析设计&#xff0c;该方法要求结合一定的图表&#xff0c;在模块化的基础上进行系统的开发工作。在设计中采用“自下而上”的思…

多线程和并发(1)—等待/通知模型

一、进程通信和进程同步 1.进程通信的方法 同一台计算机的进程通信称为IPC&#xff08;Inter-process communication&#xff09;&#xff0c;不同计 算机之间的进程通信被称为 RPC(Romote process communication)&#xff0c;需要通过网络&#xff0c;并遵守共同的协议。**进…