Android系统启动过程简介(下)

发布时间:2016-12-7 3:55:32 编辑:www.fx114.net 分享查询网我要评论
本篇文章主要介绍了"Android系统启动过程简介(下)",主要涉及到Android系统启动过程简介(下)方面的内容,对于Android系统启动过程简介(下)感兴趣的同学可以参考一下。

二、源码分析 对Android-2.1版本中的如下源码文件进行分析: (1) init.c:路径为system/core/init/init.c (2) parser.c:路径为system/core/init/ parser.c (3) builtins.c:路径为system/core/init/ builtins.c (4) property_service.c:路径为system/core/init/property_service.c (5) keycords.c:路径为system/core/init/keycords.c (6) signal_handler.c:路径为system/core/init/signal_handler.c 系统启动流程对应的源代码文件及函数如下 2.1 第一阶段(启动准备) system/core/init/init.c 在main函数中,具体的函数调用过程如下:  mkdir -> mount -> open_devnull_stdio-> log_init 2.2 第二阶段(解析init.rc文件) 在main函数中,具体的函数调用过程如下:  init_parse_config_file->parse_config-> parse_new_section->parse_service (或者parse_action)-> parse_line_service(或者parce_line_action) 2.3 第三阶段(触发需要执行的action) 在main函数中,具体的调用过程如下:  action_for_each_trigger("early-init",action_add_queue_tail);->action_add_queue_tail ( class_start default)->drain_action_queue();->action_remove_queue_head -> do_class_start 2.4 第四阶段(执行在action队列中的命令) 在main函数中,具体的调用过程如下: execute_one_command-> action_remove_queue_head->do_class_start->service_for_each_class-> service_start_if_not_disabled->service_start 2.5 第五阶段(循环处理) 在main函数中,具体的循环处理过程如下: for (; ;) {  poll > handle_property_set_fd > handle_keychord > handle_signal  }  注意:在2.3中,其实把第4阶段和第5阶段合并在一起了。execute_one_command也是放在这个for (; ;) 无限循环中。 2.6 主要函数介绍 函数名所在文件 功能概述 mainsystem/core/init/init.c  1号进程init的入口函数。主要分析init.rc配置文件,执行基本的action和启动必备的native service,然后进入一个infinite loop 处理来自property, signal的event  mkdirsystem/core/init/init.c  建立文件系统的基本目录 mountsystem/core/init/init.c  装载文件系统 open_devnull_stdiosystem/core/init/init.c  打开基本输入、输出设备 log_initsystem/core/init/init.c  初始化日志功能 init_parse_config_filesystem/core/init/ parser.c读取init.rc文件内容到内存数据区 parse_configsystem/core/init/ parser.c识别init.rc文件中的 Section(service and action series )和Text parse_new_sectionsystem/core/init/ parser.c识别section类别 parse_servicesystem/core/init/ parser.c对service section第一行进行分析 parse_line_servicesystem/core/init/ parser.c对service section的option选项进行分析 parse_actionsystem/core/init/ parser.c对action section第一行进行分析 parse_line_actionsystem/core/init/ parser.c对action section的每一行独立的命令进行分析 action_for_each_triggersystem/core/init/ parser.c触发某个action的执行  action_add_queue_tailsystem/core/init/ parser.c将某个action的从action_list加到action_queue execute_one_commandsystem/core/init/init.c  执行当前action的一个command action_remove_queue_headsystem/core/init/ parser.c从action_queue链表上移除头结点(action) do_class_startsystem/core/init/ builtins.cclass_start default对应的入口函数,主要用于启动native service service_for_each_classsystem/core/init/ parser.c遍历service_list链表上的所有结点 service_start_if_not_disabledsystem/core/init/ builtins.c判断service的flag是否disabled,如果不是,则调用相关函数,准备启动service service_startsystem/core/init/init.c  启动service的主要入口函数,设置service数据结构的相关数据结构后,调用fork创建一个新的进行,然后调用execve执行新的service forkLib function(ulibc)  进程创建函数 execveLib function(ulibc)  调用执行新的service pollLib function(ulibc)  查询property_set_fd,signal_fd和keychord_fd文件句柄是否有服务请求 handle_property_set_fdsystem/core/init/property_service.c处理系统属性服务请求,如:service, wlan和dhcp等等 handle_keychordsystem/core/init/keycords.c处理注册在service structure上的keychord,通常是启动service handle_signalsystem/core/init/signal_handler.c处理SIGCHLD signal

上一篇:LeetCode:Combination Sum II
下一篇:C++内部数据类型和非内部数据类型

相关文章

相关评论