android系统启动流程(一)解析init进程

上传人:第*** 文档编号:31319739 上传时间:2018-02-06 格式:DOC 页数:12 大小:91KB
返回 下载 相关 举报
android系统启动流程(一)解析init进程_第1页
第1页 / 共12页
android系统启动流程(一)解析init进程_第2页
第2页 / 共12页
android系统启动流程(一)解析init进程_第3页
第3页 / 共12页
android系统启动流程(一)解析init进程_第4页
第4页 / 共12页
android系统启动流程(一)解析init进程_第5页
第5页 / 共12页
点击查看更多>>
资源描述

《android系统启动流程(一)解析init进程》由会员分享,可在线阅读,更多相关《android系统启动流程(一)解析init进程(12页珍藏版)》请在金锄头文库上搜索。

1、Android 系统启动流程(一)解析 init进程前言作为“Android 框架层”这个大系列中的第一个系列,我们首先要了解的是 Android 系统启动流程,在这个流程中会涉及到很多重要的知识点,这个系列我们就来一一讲解它们,这一篇我们就来学习 init 进程。1.init 简介init 进程是 Android 系统中用户空间的第一个进程,作为第一个进程,它被赋予了很多极其重要的工作职责,比如创建 zygote(孵化器)和属服务等。init 进程是由多个源文件共同组成的,这些文件位于源码目录 system/core/init。本文将基于 Android7.0 源码来分析 Init 进程。2

2、.引入 init 进程说到 init 进程,首先要提到 Android 系统启动流程的前几步: 1.启动电源以及系统启动 当电源按下时引导芯片代码开始从预定义的地方(固化在 ROM)开始执行。加载引导程序Bootloader 到 RAM,然后执行。 2.引导程序 Bootloader 引导程序是在 Android 操作系统开始运行前的一个小程序,它的主要作用是把系统 OS 拉起来并运行。 3.Linux 内核启动 内核启动时,设置缓存、被保护存储器、计划列表,加载驱动。当内核完成系统设置,它首先在系统文件中寻找”init”文件,然后启动 root 进程或者系统的第一个进程。 4.init 进程

3、启动讲到第四步就发现我们这一节要讲的 init 进程了。关于 Android 系统启动流程的所有步骤会在本系列的最后一篇做讲解。3.init 入口函数init 的入口函数为 main,代码如下所示。 system/core/init/init.cppint main(int argc, char* argv) if (!strcmp(basename(argv0), ueventd) return ueventd_main(argc, argv);if (!strcmp(basename(argv0), watchdogd) return watchdogd_main(argc, argv);

4、umask(0);add_environment(PATH, _PATH_DEFPATH);bool is_first_stage = (argc = 1) | (strcmp(argv1, -second-stage) != 0);/创建文件并挂载if (is_first_stage) mount(tmpfs, /dev, tmpfs, MS_NOSUID, mode=0755);mkdir(/dev/pts, 0755);mkdir(/dev/socket, 0755);mount(devpts, /dev/pts, devpts, 0, NULL);#define MAKE_STR(x)

5、 _STRING(x)mount(proc, /proc, proc, 0, hidepid=2,gid= MAKE_STR(AID_READPROC);mount(sysfs, /sys, sysfs, 0, NULL);open_devnull_stdio();klog_init();klog_set_level(KLOG_NOTICE_LEVEL);NOTICE(init %s started!n, is_first_stage ? first stage : second stage);if (!is_first_stage) / Indicate that booting is in

6、 progress to background fw loaders, etc.close(open(/dev/.booting, O_WRONLY | O_CREAT | O_CLOEXEC, 0000);/初始化属性相关资源property_init();/1process_kernel_dt();process_kernel_cmdline();export_kernel_boot_props();./启动属服务start_property_service();/2const BuiltinFunctionMap function_map;Action:set_function_map(

7、Parserparser.AddSectionParser(service,std:make_unique();parser.AddSectionParser(on, std:make_unique();parser.AddSectionParser(import, std:make_unique();/解析 init.rc 配置文件parser.ParseConfig(/init.rc);/3. while (true) if (!waiting_for_exec) am.ExecuteOneCommand();restart_processes(); int timeout = -1;if

8、 (process_needs_restart) timeout = (process_needs_restart - gettime() * 1000;if (timeout & * /设置触发器 /动作触发之后要执行的命令 为了分析如何创建 zygote,我们主要查看 Services 类型语句,它的格式如下所示:service * / /option 是 service 的修饰词,影响什么时候、如何启动 services . 需要注意的是在 Android 7.0 中对 init.rc 文件进行了拆分,每个服务一个 rc 文件。我们要分析的 zygote 服务的启动脚本则在 init.z

9、ygoteXX.rc 中定义,这里拿 64 位处理器为例,init.zygote64.rc 的代码如下所示。 system/core/rootdir/init.zygote64.rcservice zygote /system/bin/app_process64 -Xzygote /system/bin -zygote -start-system-serverclass mainsocket zygote stream 660 root systemonrestart write /sys/android_power/request_state wakeonrestart write /sys

10、/power/state ononrestart restart audioserveronrestart restart cameraserveronrestart restart mediaonrestart restart netdwritepid /dev/cpuset/foreground/tasks /dev/stune/foreground/tasks其中 service 用于通知 init 进程创建名 zygote 的进程,这个 zygote 进程执行程序的路径为/system/bin/app_process64 ,后面的则是要传给 app_process64 的参数。clas

11、s main 指的是 zygote 的 class name 为 main,后文会用到它。5.解析 service接下来我们来解析 service,会用到两个函数,一个是 ParseSection,它会解析 service的 rc 文件,比如上文讲到的 init.zygote64.rc,ParseSection 函数主要用来搭建 service 的架子。另一个是 ParseLineSection,用于解析子项。代码如下所示。 system/core/init/service.cppbool ServiceParser:ParseSection(const std:vector& args,st

12、d:string* err) if (args.size() str_args(args.begin() + 2, args.end();service_ = std:make_unique(name, default, str_args);/1return true;bool ServiceParser:ParseLineSection(const std:vector& args,const std:string& filename, int line,std:string* err) const return service_ ? service_-HandleLine(args, er

13、r) : false;注释 1 处,根据参数,构造出一个 service 对象,它的 classname 为”default” 。当解析完毕时会调用 EndSection:void ServiceParser:EndSection() if (service_) ServiceManager:GetInstance().AddService(std:move(service_);接着查看 AddService 做了什么:void ServiceManager:AddService(std:unique_ptr service) Service* old_service = FindServic

14、eByName(service-name();if (old_service) ERROR(ignored duplicate definition of service %s,service-name().c_str();return; services_.emplace_back(std:move(service);/1注释 1 处的代码将 service 对象加入到 services 链表中。上面的解析过程总体来讲就是根据参数创建出 service 对象,然后根据选项域的内容填充 service 对象,最后将 service 对象加入到 vector 类型的 services 链表中。

15、,6.init 启动 zygote讲完了解析 service,接下来该讲 init 是如何启动 service,在这里我们主要讲解启动zygote 这个 service。在 zygote 的启动脚本中我们得知 zygote 的 class name 为 main。在init.rc 有如下配置代码: system/core/rootdir/init.rc.on nonencrypted # A/B update verifier that marks a successful boot. exec - root - /system/bin/update_verifier nonencrypted class_start main class_start late_start . 其中 class_start 是一个 COMMAND,对应的函数为 do_class_start。我们知道 main 指的就是 zygote,因此 class_start main 用来启动 zygote。do_class_start 函数在 builtins.cpp 中定义,如下所示。system/core/init/builtins.cppstatic int do_class_start(const std:vect

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 其它办公文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号