Android9开机启动与FBE过程完整介绍与LOG流程

news2024/10/7 10:13:09

一,开机整体流程概述

 

Init进程作为Android的第一个user space(用户空间)的进程,它是所有 Android 系统 native service 的祖先,它的进程号是 1。

init进程工作分为第一阶段和第二阶段。

二,init fisrt stage 

代码参考: http://androidxref.com/9.0.0_r3/xref/system/core/init/init.cpp 

init第一阶段都是为第二阶段准备的工作,主要工作如下:

  • ueventd/watchdogd跳转以及其它初始化
  • 挂载基础文件系统并创建目录
  • 初始化日志输出(InitKernelLogging)
  • 挂载分区设备 (mount fstab)
  • 启用SELinux安全策略
  • 开始第二阶段前的准备。

1, ueventd跟watchdogd

从init进程的Android.bp可以看到,ueventd跟watchdogd都是Init进程的软连接。

symlinks: [
"sbin/ueventd",
"sbin/watchdogd",
],

ueventd进程用来管理设备,如果有新设备插入,就会在/dev创建对应的设备文件。ueventd会fork一个新的子进程做检测工作。

watchdogd进程是看门狗程序,每隔一段时间通过系统调用write向内核看门狗设备发一个信息,以确保系统正常运行。

2,挂载基础文件,创建目录。

3,InitKernelLogging

init进程是用户空间进程,为了把LOG打印到Kernel log里面,需要初始化InitKernelLogging。InitKernelLogging的源码路径是 system/core/init/log.cpp,该函数首先是将标准输入输出重定向到"/sys/fs/selinux/null",然后调用InitLogging初始化log日志系统。

4,DoFirstStageMount

http://androidxref.com/9.0.0_r3/xref/system/core/init/init_first_stage.cpp   DoFirstStageMount()
Cross Reference: /system/core/fs_mgr/fs_mgr_fstab.cpp (androidxref.com)

fs_mgr流程是先从启动命令行中获取bootdir 拼接字符串得到 fstab的位置 

通过mount fstab,加载UFS中 system vendor 分区文件系统。

三,init second stage

1,加载system vendor 分区的selinux规则

2,初始化Property与property_service

      加载property service是因为init.rc 很多触发时机是通过property 回调执行的。

3,加载system vendor各种init.rc脚本

4,解析nit.rc 

     下面为各个section的执行顺序,英文编号的section是系统内建的,数字是可客制化的。

1) early-init

a) wait_for_coldboot_done

b) property_init

c) keychord_int

d) console_init

e) set_init_properties

2) init

3) early-fs

4) fs

5) post-fs

6) post-fs-data

f) property_service_init

g) signal_init

h) check_startup

7) early-boot

8) boot

9) service

5,其中解析厂商的规则

其中高通的init.target.rc中:

on fs
# exec u:r:vendor_init:s0 -- /vendor/bin/init.qti.getbootdevice.sh
mount_all /vendor/etc/fstab.qcom

 挂载/data分区。此过程结果接下面第三章节FBE过程。

四,FBE过程

1, 进入全盘加密

init进程处理 do_mount_all() 函数,会根据mount_all /vendor/etc/fstab.qcom 结果配置系统属性。 

if (ret== FS_MGR_MNTALL_DEV_NEEDS_ENCRYPTION) {

        //如果fstab里设置了默认加密,则设置下面这个属性

       property_set("vold.decrypt","trigger_encryption");

    } elseif (ret == FS_MGR_MNTALL_DEV_MIGHT_BE_ENCRYPTED) {

        //如果设备已经加密,则我们需要做一些处理:

       property_set("ro.crypto.state","encrypted");

        property_set("vold.decrypt", "trigger_default_encryption");

    } elseif (ret == FS_MGR_MNTALL_DEV_NOT_ENCRYPTED){

       //如果设备没有加密,则不需要做什么处理,和以前一样

       property_set("ro.crypto.state","unencrypted");

       action_for_each_trigger("nonencrypted", action_add_queue_tail);

init.rc 进入encrypt 状态

on property:vold.decrypt=trigger_encryption

start encrypt 

查看vdc.rc,通过exec 加上参数调用自己:

# One shot invocation to deal with encrypted volume.
on defaultcrypto
    exec - root -- /system/bin/vdc --wait cryptfs mountdefaultencrypted
    # vold will set vold.decrypt to trigger_restart_framework (default
    # encryption) or trigger_restart_min_framework (other encryption)

# One shot invocation to encrypt unencrypted volumes
on encrypt
    start surfaceflinger
    exec - root -- /system/bin/vdc --wait cryptfs enablecrypto
    # vold will set vold.decrypt to trigger_restart_framework (default
    # encryption)
vdc是个可执行文件,实际上功能不是vdc实现的,vdc是通过binder给VOLD发送响应的消息来实现的。具体代码跳过。

FBE相关技术参考下面文档

【数据安全】4. Android 文件级加密(File-based Encryption)之密钥管理_android fbe_zs.w的博客-CSDN博客

2,创建用户0

/system/core/rootdir/init.rc 中,on post-fs-data最后一个步骤是创建用户0:

on post-fs-data
    init_user0
查看 这个动作的代码/system/core/init/builtins.cpp,也是调用vdc来完成:
static Result<Success> do_init_user0(const BuiltinArguments& args) {
    return ExecWithRebootOnFailure(
        "init_user0_failed",
        {{"exec", "/system/bin/vdc", "--wait", "cryptfs", "init_user0"}, args.context});
}

​
和前面一样,VDC也是给vold发送消息,过程不再细说。

五,Android相关加载过程介绍

android加载两部分,一部分是在native 时候加载的,如surfaceflinger, ServiceManager, MediaServer。主要是为了完成跨进程通信和播放开机动画。不影响开机动画的服务由SystemServer加载。

service surfaceflinger /system/bin/surfaceflinger
    class core animation
    user system
    group graphics drmrpc readproc
    onrestart restart zygote

对应init.rc的脚本

on boot
    # Start standard binderized HAL daemons
    class_start hal

    class_start core

on nonencrypted
    class_start main
    class_start late_start

第二部分是zygote完成的加载,这部分网络资料很多,不再继续描述。

六,开机过程LOG介绍

为了让vold log打印在kernel log中,需要修改一下vold与kernel printk.

system/vold/main.cpp修改一下:

int main(int argc, char** argv) {
    atrace_set_tracing_enabled(false);
    if (getppid() == 1) {
        // If init is calling us then it's during boot and we should log to kmsg
        android::base::InitLogging(argv, &android::base::KernelLogger);
    } else {
        setenv("ANDROID_LOG_TAGS", "*:v", 1);
        android::base::InitLogging(argv, android::base::LogdLogger(android::base::SYSTEM));
    }

kernel/msm-4.14/kernel/printk/printk.c  删掉两行限制kernel log打印

static ssize_t devkmsg_write(struct kiocb *iocb, struct iov_iter *from)
{
	char *buf, *line;
	int level = default_message_loglevel;
	int facility = 1;	/* LOG_USER */
	struct file *file = iocb->ki_filp;
	struct devkmsg_user *user = file->private_data;
	size_t len = iov_iter_count(from);
	ssize_t ret = len;

	if (!user || len > LOG_LINE_MAX)
		return -EINVAL;

	/* Ignore when user logging is disabled. */
	if (devkmsg_log & DEVKMSG_LOG_MASK_OFF)
		return len;

	/* Ratelimit when not explicitly enabled. */
	if (!(devkmsg_log & DEVKMSG_LOG_MASK_ON)) {
        //删掉下面两行
		//if (!___ratelimit(&user->rs, current->comm))
		//	return ret;
	}

LOG打印参考

#这可以看作LINUX启动标志
01-01 08:00:00.000     0     0 I         : Booting Linux on physical CPU 0x0
01-01 08:00:00.016     0     0 I SELinux : Initializing.
#VFS加载后,可以进入第一阶段挂载文件系统
01-01 08:00:02.484     0     0 I VFS     : Mounted root (ext4 filesystem) readonly on device 253:0.
01-01 08:00:02.489     0     0 I         : Freeing unused kernel memory: 6144K
01-01 08:00:02.514     0     0 I init    : init first stage started!
01-01 08:00:02.515     0     0 I init    : Using Android DT directory /proc/device-tree/firmware/android/
01-01 08:00:02.520     0     0 I init    : [libfs_mgr]fs_mgr_read_fstab_default(): failed to find device default fstab
01-01 08:00:02.790     0     0 I         : init (266) used greatest stack depth: 13264 bytes left
01-01 08:00:02.793     0     0 I init    : [libfs_mgr]Enabling dm-verity for vendor (mode 0)
01-01 08:00:02.798     0     0 I device-mapper: verity: sha256 using implementation "sha256-ce"
01-01 08:00:02.816     0     0 I init    : [libfs_mgr]__mount(source=/dev/block/dm-0,target=/vendor,type=ext4)=0: Success
01-01 08:00:02.817     0     0 I init    : Skipped setting INIT_AVB_VERSION (not in recovery mode)
01-01 08:00:02.819     0     0 I init    : Loading SELinux policy
01-01 08:00:03.856     0     0 I selinux : SELinux: Loaded file_contexts
#/system与/vendor挂载后,可以开始解析里面的.rc文件
01-01 08:00:03.863     0     0 I init    : init second stage started!
01-01 08:00:03.996     0     0 I init    : Parsing file /init.rc...

01-01 08:00:05.114     0     0 I init    : processing action (early-init) from (/init.rc:14)
01-01 08:00:05.122     0     0 I init    : starting service 'ueventd'...

01-01 08:00:05.576     0     0 I ueventd : Coldboot took 0.372 seconds
01-01 08:00:05.582     0     0 I init    : wait for '/dev/.coldboot_done' took 239ms

01-01 08:00:05.683     0     0 I init    : processing action (SetMmapRndBits) from (<Builtin Action>:0)
01-01 08:00:05.685     0     0 I init    : processing action (SetKptrRestrict) from (<Builtin Action>:0)
01-01 08:00:05.686     0     0 I init    : processing action (keychord_init) from (<Builtin Action>:0)
01-01 08:00:05.688     0     0 E init    : could not open /dev/keychord: No such file or directory
01-01 08:00:05.689     0     0 I init    : processing action (console_init) from (<Builtin Action>:0)
01-01 08:00:05.690     0     0 I init    : processing action (init) from (/init.rc:41)

01-01 08:00:05.788     0     0 I init    : processing action (late-init) from (/init.rc:278)
01-01 08:00:05.790     0     0 I init    : processing action (late-init) from (/system/etc/init/atrace.rc:3)
01-01 08:00:05.798     0     0 I init    : processing action (queue_property_triggers) from (<Builtin Action>:0)
01-01 08:00:05.801     0     0 I init    : processing action (early-fs) from (/vendor/etc/init/hw/init.target.rc:46)
01-01 08:00:05.808     0     0 I init    : processing action (fs) from (/vendor/etc/init/hw/init.target.rc:54)

#开始挂载/data分区
01-01 08:00:07.060     0     0 I init    : Command 'mount_all /vendor/etc/fstab.qcom' action=fs (/vendor/etc/init/hw/init.target.rc:56) took 1248ms and succeeded

#启动servicemanager等
01-01 08:00:07.218     0     0 I init    : Command 'load_system_props' action=post-fs (/init.rc:317) took 124ms and succeeded
01-01 08:00:07.219     0     0 I init    : starting service 'logd'...
01-01 08:00:07.223     0     0 I init    : starting service 'servicemanager'...
01-01 08:00:07.226     0     0 I init    : starting service 'hwservicemanager'...
01-01 08:00:07.227     0     0 I init    : Created socket '/dev/socket/logd', mode 666, user 1036, group 1036
01-01 08:00:07.230     0     0 I init    : starting service 'vndservicemanager'...

#根据'mount_all /vendor/etc/fstab.qcom'的结果,启动vold开始全盘加密
01-01 08:00:07.325     0     0 I init    : processing action (post-fs-data) from (/init.rc:384)
01-01 08:00:07.348     0     0 I init    : starting service 'exec 4 (/system/bin/vdc --wait cryptfs enablefilecrypto)'...
01-01 08:00:07.423     0     0 I vold    : e4crypt_initialize_global_de
01-01 08:00:07.424     0     0 I vold    : Creating new key in /data/unencrypted/key

#根据enablefilecrypto的结果,创建user0
01-01 08:00:07.635     0     0 I init    : starting service 'exec 5 (/system/bin/vdc --wait cryptfs init_user0)'...
01-01 08:00:07.778     0     0 I vold    : Policy for /data/system_de/0 set to 74252c5158d80351 modes 127/4
01-01 08:00:07.779     0     0 I vold    : Policy for /data/misc_de/0 set to 74252c5158d80351 modes 127/4
01-01 08:00:07.781     0     0 I vold    : Policy for /data/vendor_de/0 set to 74252c5158d80351 modes 127/4
01-01 08:00:07.782     0     0 I vold    : Policy for /data/user_de/0 set to 74252c5158d80351 modes 127/4

#启动zygote
01-01 08:00:07.985     0     0 I init    : processing action (ro.crypto.state=encrypted && ro.crypto.type=file && zygote-start) from (/init.rc:575)
01-01 08:00:07.987     0     0 I init    : starting service 'update_verifier_nonencrypted'...

#后面进入android server与APP启动阶段。最后到boot_completed进入桌面。
01-01 08:00:08.023     0     0 I init    : starting service 'zygote'...
01-01 08:00:08.442   385   385 D AndroidRuntime: >>>>>> START com.android.internal.os.ZygoteInit uid 0 <<<<<<
01-01 08:00:08.442   385   385 I boot_progress_start: 8442
01-01 08:00:09.576   385   385 I boot_progress_preload_start: 9576
01-01 00:00:43.484   385   385 I boot_progress_preload_end: 10679
01-01 00:00:44.320   865   865 I boot_progress_system_run: 11515
01-01 00:00:48.177   865   865 I boot_progress_pms_start: 15372
01-01 00:00:48.206   865   865 I boot_progress_pms_system_scan_start: 15401
01-01 00:00:49.676   865   865 I boot_progress_pms_data_scan_start: 16871
01-01 00:00:49.685   865   865 I boot_progress_pms_scan_end: 16880
01-01 00:00:49.999   865   865 I boot_progress_pms_ready: 17194
01-01 00:01:13.262   865   865 I boot_progress_ams_ready: 40457
01-01 00:01:15.176   865  1073 I boot_progress_enable_screen: 42371

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

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

相关文章

js操作剪贴板讲解

文章目录 复制&#xff08;剪切&#xff09;到剪贴板Document.execCommand()Clipboard复制Clipboard.writeText()Clipboard.write() copy&#xff0c;cut事件 从剪贴板进行粘贴document.execCommand(paste)Clipboard粘贴Clipboard.readText()Clipboard.read() paste 事件 安全性…

使用docker快速搭建wordpress服务,并指定域名访问

文章目录 引入使用docker快速跑起服务创建数据库安装wordpress服务配置域名 引入 wordpress是一个基于PHP语言编写的开源的内容管理系统&#xff08;CMS&#xff09;&#xff0c;它有丰富的插件和主题&#xff0c;可以非常简单的创建各种类型的网站&#xff0c;包括企业网站、…

云安全攻防(十一)之 容器编排平台面临的风险

前言 容器技术和编排管理是云原生生态的两大核心部分——前者负责执行&#xff0c;后者负责控制和管理&#xff0c;共同构成云原生技术有机体&#xff0c;我们以 Kubernetes 为例&#xff0c;对容器编排平台可能面临的风险进行分析 容器编排平台面临的风险 作为最为流行的云…

LeetCode150道面试经典题-- 快乐数(简单)

1.题目 编写一个算法来判断一个数 n 是不是快乐数。 「快乐数」 定义为&#xff1a; 对于一个正整数&#xff0c;每一次将该数替换为它每个位置上的数字的平方和。然后重复这个过程直到这个数变为 1&#xff0c;也可能是 无限循环 但始终变不到 1。如果这个过程 结果为 1&am…

OpenLayers实战,高德GCJ-02坐标系转WGS-84坐标系

专栏目录: OpenLayers实战进阶专栏目录 前言 本章实现高德GCJ-02坐标系转WGS-84坐标系。日常开发中经常遇到源坐标高德的情况,这时候如果地图不是高德,而是使用的wgs84坐标系的地图,或者其他坐标系的情况下,就会导致位置偏移,本章就是解决高德坐标偏移问题。 二、依赖…

Detecting Twenty-thousand Classes using Image-level Supervision

Detecting Twenty-thousand Classes using Image-level Supervision 摘要背景方法PreliminariesDetic:具有图像类别的检测器loss技术细节扩展Grad-CAMGrad-CAM原理 总结 摘要 摘要 由于检测数据集的规模较小&#xff0c;目前的物体检测器在词汇量方面受到限制。而图像分类器的数…

深入了解Linux运维的重要性与最佳实践

Linux作为开源操作系统的代表&#xff0c;在企业级环境中的应用越来越广泛。而在保障Linux系统的正常运行和管理方面&#xff0c;Linux运维显得尤为关键。本文将介绍Linux运维的重要性以及一些最佳实践&#xff0c;帮助读者更好地了解和掌握Linux系统的运维技巧。 首先&#xf…

【Linux初阶】system V消息队列 + system V信号量

文章目录 一、system V消息队列&#xff08;了解&#xff09;二、system V信号量&#xff08;了解&#xff09;1.信号量是什么2.临界资源和临界区3.互斥4.为什么要信号量 三、IPC资源的组织方式结语 一、system V消息队列&#xff08;了解&#xff09; 消息队列提供了一个从一…

玩转IndexedDB,比localStorage、cookie还要强大的网页端本地缓存

随着浏览器的功能不断增强&#xff0c;越来越多的网站开始考虑&#xff0c;将大量数据储存在客户端&#xff0c;这样可以减少从服务器获取数据&#xff0c;直接从本地获取数据。 现有的浏览器数据储存方案&#xff0c;都不适合储存大量数据&#xff1a;Cookie 的大小不超过 4K…

回归预测 | MATLAB实现基于SAE堆叠自编辑器多输入单输出回归预测

回归预测 | MATLAB实现基于SAE堆叠自编辑器多输入单输出回归预测 目录 回归预测 | MATLAB实现基于SAE堆叠自编辑器多输入单输出回归预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 1.MATLAB实现基于SAE堆叠自编辑器多输入单输出回归预测&#xff1b; 2.运行环…

找到链表的第一个入环节点

1.题目 给定一个链表的头节点 head &#xff0c;返回链表开始入环的第一个节点。 如果链表无环&#xff0c;则返回 null。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系统…

会玩这 10 个 Linux 命令,一定是个有趣的 IT 男!

Linux当中有很多比较有趣的命令&#xff0c;可以动手看看&#xff0c;很简单的。 1.rev命令 一行接一行地颠倒所输入的字符串。 运行&#xff1a; $rev如输入&#xff1a;shiyanlou shiyanlou2.asciiview命令 1.先安装aview $sudo apt-get install aview2.再安装imagema…

zabbix案例--zabbix监控Tomcat

目录 一、 部署tomcat 二、配置zabbix-java-gateway 三、配置zabbix-server 四、配置zabbix-web界面 一、 部署tomcat tar xf apache-tomcat-8.5.16.tar.gz -C /usr/local/ ln -sv /usr/local/apache-tomcat-8.5.16/ /usr/local/tomcat cd /usr/local/tomcat/bin开启JMX…

如何解决docker中出现的“bash: vim: command not found”

目录 问题描述&#xff1a; 问题解决&#xff1a; 问题描述&#xff1a; 在docker中&#xff0c;想要执行vim编辑文件&#xff0c;弹出“docker bash: vim: command not found“&#xff08;如下图&#xff09;&#xff0c;请问该如何解决&#xff1f; 问题解决&#xff1a; …

使用维纳过滤器消除驾驶舱噪音(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

管理类联考——逻辑——论证逻辑——汇总篇——因果推理

因果推理的逻辑方法&#xff08;穆勒五法) 确定现象之间因果关系的方法有五种&#xff1a; 求同法、求异法、求同求异并用法、共变法、剩余法。这五种方法统称为穆勒五法。用穆勒五法确定的因果关系具有或然性。 PS&#xff1a;求同球童&#xff1b;求异球衣&#xff0c;求同…

设计模式——建造者(Builder)模式

建造者模式&#xff08;Builder Pattern&#xff09;&#xff0c;又叫生成器模式&#xff0c;是一种对象构建模式 它可以将复杂对象的建造过程抽象出来&#xff0c;使这个抽象过程的不同实现方法可以构造出不同表现的对象。建造者模式是一步一步创建一个复杂的对象&#xff0c;…

YARN框架和其工作原理流程介绍

目录 一、YARN简介 二、YARN的由来 三、YARN的基本设计思想 四、YARN 的基本架构 4.1 基本架构图 4.2 基本组件介绍 4.2.1 ResourceManager 4.2.1.1 任务调度器(Resource Scheduler) 4.2.1.2 应用程序管理器&#xff08;Applications Manager&#xff09; 4.2.1.3 其他…

官方已经宣布了,2023年下半年软考各科实行机考

软考办官方通知 我认为&#xff0c;第一次参加软考机考的考生会有好处&#xff0c;因为新政策在第一年执行时一般不会太难。我非常好奇如何在论文中画图。 下面&#xff0c;我将从一个曾参加软考高级水平考试的人的角度&#xff0c;讲述机考的优缺点&#xff0c;并分享我自己的…

xxljob搭建(内网穿透)

调度中心搭建 先从码云或者github上将项目拷贝到本地&#xff0c;选择最新的release分支拷贝下来的xxl-job-admin模块就是调度中心&#xff0c;我们需要做的有两点&#xff0c;第一点将doc/db/tables_xxl_job.sql执行&#xff0c;第二点修改xxl-job-admin的application.proper…