注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

民主与科学

独立之人格,自由之思想

 
 
 

日志

 
 

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

2011-10-19 16:08:23|  分类: 深入研究 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
二、源码分析
对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 主要函数介绍
函数名 所在文件 功能概述
main system/core/init/init.c 1号进程init的入口函数。主要分析init.rc配置文件,执行基本的action和启动必备的native service,然后进入一个infinite loop 处理来自property, signal的event 
mkdir system/core/init/init.c 建立文件系统的基本目录
mount system/core/init/init.c 装载文件系统
open_devnull_stdio system/core/init/init.c 打开基本输入、输出设备
log_init system/core/init/init.c 初始化日志功能
init_parse_config_file system/core/init/ parser.c 读取init.rc文件内容到内存数据区
parse_config system/core/init/ parser.c 识别init.rc文件中的 Section(service and action series )和Text
parse_new_section system/core/init/ parser.c 识别section类别
parse_service system/core/init/ parser.c 对service section第一行进行分析
parse_line_service system/core/init/ parser.c 对service section的option选项进行分析
parse_action system/core/init/ parser.c 对action section第一行进行分析
parse_line_action system/core/init/ parser.c 对action section的每一行独立的命令进行分析
action_for_each_trigger system/core/init/ parser.c 触发某个action的执行 
action_add_queue_tail system/core/init/ parser.c 将某个action的从action_list加到action_queue
execute_one_command system/core/init/init.c 执行当前action的一个command
action_remove_queue_head system/core/init/ parser.c 从action_queue链表上移除头结点(action)
do_class_start system/core/init/ builtins.c class_start default对应的入口函数,主要用于启动native service
service_for_each_class system/core/init/ parser.c 遍历service_list链表上的所有结点
service_start_if_not_disabled system/core/init/ builtins.c 判断service的flag是否disabled,如果不是,则调用相关函数,准备启动service
service_start system/core/init/init.c 启动service的主要入口函数,设置service数据结构的相关数据结构后,调用fork创建一个新的进行,然后调用execve执行新的service
fork Lib function(ulibc) 进程创建函数
execve Lib function(ulibc) 调用执行新的service
poll Lib function(ulibc) 查询property_set_fd,signal_fd和keychord_fd文件句柄是否有服务请求
handle_property_set_fd system/core/init/property_service.c 处理系统属性服务请求,如:service, wlan和dhcp等等
handle_keychord system/core/init/keycords.c 处理注册在service structure上的keychord,通常是启动service
handle_signal system/core/init/signal_handler.c 处理SIGCHLD signal
  评论这张
 
阅读(1074)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017