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

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

当上电时,系统先执行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_setupchar* 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.mzph.cn/news/55757.shtml

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

相关文章

基于全新电脑环境安装pytorch的GPU版本

前言: 距离第一次安装深度学习的GPU环境已经过去了4年多(当时TensorFlow特别麻烦),现在发现安装pytorch的GPU版本还是很简单方便的,流程记录如下。 安装步骤: 步骤一:官网下载Anaconda Free…

研磨设计模式day11观察者模式

目录 场景 代码示例 定义 观察者模式的优缺点 本质 何时选用 简单变型-区别对待观察者 场景 我是一家报社,每当我发布一个新的报纸时,所有订阅我家报社的读者都可以接收到 代码示例 报纸对象 package day11观察者模式;import java.util.Observ…

Python+TinyPNG熊猫网站自动化的压缩图片

前言 本篇在讲什么 PythonTinyPNG自动化处理图片 本篇需要什么 对Python语法有简单认知 依赖Python2.7环境 依赖TinyPNG工具 本篇的特色 具有全流程的图文教学 重实践,轻理论,快速上手 提供全流程的源码内容 ★提高阅读体验★ 👉…

AI + Milvus:将时尚应用搭建进行到底

在上一篇文章中,我们学习了如何利用人工智能技术(例如开源 AI 向量数据库 Milvus 和 Hugging Face 模型)寻找与自己穿搭风格相似的明星。在这篇文章中,我们将进一步介绍如何通过对上篇文章中的项目代码稍作修改,获得更…

[管理与领导-53]:IT基层管理者 - 8项核心技能 - 8 - 持续改进

前言: 管理者存在的价值就是制定目标,即目标管理、通过团队(他人)拿到结果。 要想通过他人拿到结果: (1)目标:制定符合SMART原则的符合业务需求的目标,团队跳一跳就可以…

Microsoft正在将Python引入Excel

Excel和Python这两个世界正在碰撞,这要归功于Microsoft的新集成,以促进数据分析和可视化 Microsoft正在将流行的编程语言Python引入Excel。该功能的公共预览版现已推出,允许Excel用户操作和分析来自Python的数据。 “您可以使用 Python 绘图…

Git向远程仓库与推送以及拉取远程仓库

理解分布式版本控制系统 1.中央服务器 我们⽬前所说的所有内容(⼯作区,暂存区,版本库等等),都是在本地也就是在你的笔记本或者计算机上。⽽我们的 Git 其实是分布式版本控制系统!什么意思呢? 那我们多人…

VUE3基础

一、vue-router v4.x 介绍 | Vue Router 1、安装 yarn add vue-routernext next代表最新的版本 2、路由配置 在src目录下,新建router/index.ts,具体配置如下 import {RouteRecordRaw,createRouter,createWebHashHistory} from vue-router const r…

NO.04 MyBatis的各种查询功能

目录 1、查询一个实体类对象 2、查询一个List集合 3、查询单个数据 5、查询多条数据并存储在Map集合中 5.1 方法一:将数据存储在map集合中,再将map集合存储在List集合中 5.2 方法二:将数据存储在map集合中 6、MyBatis中为Java中常用的…

JavaWeb 速通JQuery

目录 一、JQuery快速入门 1.基本介绍 : 2.入门案例 : 二、JQuery对象 1.基本介绍 : 2.DOM对象 --> JQuery对象 : 3.JQuery对象 --> DOM对象 : 三、JQuery选择器 1.简介 : 2.基本选择器 : 3.层次选择器 : 4.过滤选择器 : 4.1 基础过滤选择器 4.2 内容过滤选择…

精益求精:如何在 React 项目中巧妙运用 Redux 并优化项目结构

在前端开发中,React 和 Redux 已经成为构建可扩展、高效的应用程序的首选工具。本文将向您介绍如何在 React 项目中使用 Redux 并精心划分项目结构,以确保代码的可维护性和可扩展性。 第一步:安装 Redux 首先,确保您的项目已经集…

Vue中ElementUI结合transform使用时,发现弹框定位不准确问题

在近期开发中,需要将1920*1080放到更大像素大屏上演示,所以需要使用到transform来对页面进行缩放,但是此时发现弹框定位出错问题,无法准备定位到实际位置。 查看element-ui官方文档无果后,打算更换新的框架进行开发&am…

Java升级JDK17(更高版本同理),修改maven

记住三个网址就行:下面这个是oracle的 Java Platform, Standard Edition 17 ReferenceImplementations https://www.oracle.com/java/technologies/downloads/#jdk17-windows 另外一个 redhat旗下的:这个是开源的(推荐这个!&am…

国产系统下开发QT程序总结

国产系统下开发QT程序总结 1. 国产系统简介 开发国产系统客户端的过程中,会出现兼容性问题。以下介绍Kylin和UOS环境下开发QT程序, 首先麒麟和统信这两个系统基于Ubuntu开发的。所以在Ubuntu开发理论上在国产系统上也能运行。芯片架构又分为amd,arm,mi…

pythonapi接口怎么对接?

Python API接口对接是使用Python语言开发应用程序时,与外部API接口进行交互的一种方式。API(应用程序接口)是一种定义了程序或系统如何与另一个程序或系统进行交互的协议。通过使用Python API接口,可以轻松地访问和操作外部API提供…

飞凌嵌入式受邀参加「RISC-V芯片应用交流会」并发表主题演讲

8月23日下午,在第三届RISC-V中国峰会现场,由赛昉科技主办的「RISC-V芯片应用交流会」吸引了诸多行业伙伴和专家到场参与。此次会议旨在分享赛昉科技高性能RISC-V芯片的软件生态、应用产品、解决方案等全面进展,共同探讨RISC-V芯片的未来发展和…

Git 删除已经合并的本地分支

在使用 Git 的开发流程中,经常会创建很多的 Git 分支,包括功能分支(features/*)、发布分支(release/*)和 hotfix 分支(hotfix/*)。在开发了一段时间之后,本地就会有出现很…

javaee spring 自动注入,如果满足条件的类有多个如何区别

如图IDrinkDao有两个实现类 方法一 方法二 Resource(name“对象名”) Resource(name"oracleDrinkDao") private IDrinkDao drinkDao;

Java --- 异常处理

目录 一、什么是异常 二、异常抛出机制 三、如何对待异常 四、 Java异常体系 4.1、Throwable 4.2、Error 4.2、Exception 4.2.1、编译时异常 4.2.2、运行时期异常 五、异常处理 5.1、捕获异常(try-catch) 5.1.2、catch中异常处理方式 …

你对SPA单页面的理解,它的优缺点分别是什么?如何实现SPA应用呢?

一、什么是SPA SPA(single-page application),翻译过来就是单页应用SPA是一种网络应用程序或网站的模型,它通过动态重写当前页面来与用户交互,这种方法避免了页面之间切换打断用户体验在单页应用中,所有必…