当前位置:文档之家› android系统开机启动流程分析

android系统开机启动流程分析

一,系统引导bootloader
加电,cpu执行bootloader程序,正常启动系统,加载boot.img【其中包含内核。

还有ramdisk】
二,内核kernel
bootloader加载kernel,kernel自解压,初始化,载入built-in驱动程序,完成启动。

内核启动后会创建若干内核线程,在后装入并执行程序/sbin/init/,载入init process,切换至用户空间(user-space)
内核zImage解压缩
head.S【这是ARM-Linux运行的第一个文件,这些代码是一个比较独立的代码包裹器。

其作用就是解压Linux内核,并将PC指针跳到内核(vmlinux)的第一条指令】首先初始化自解压相关环境(内存等),调用decompress_kernel进行解压,解压后调用start_kernel启动内核【start_kernel是任何版本linux内核的通用初始化函数,它会初始化很多东西,输出linux版本信息,设置体系结构相关的环境,页表结构初始化,设置系
统自陷入口,初始化系统IRQ,初始化核心调度器等等】,最后调用rest_init【rest_init
会调用kernel_init启动init进程(缺省是/init)。

然后执行schedule开始任务调度。

这个init是由android的./system/core/init下的代码编译出来的,由此进入了android的代码】。

三,Init进程启动
【init是kernel启动的第一个进程,init启动以后,整个android系统就起来了】
init进程启动后,根据init.rc 和init. <machine_name>.rc脚本文件建立几个基本
服务(servicemanager zygote),然后担当property service 的功能
打开.rc文件,解析文件内容。

【system/core/init/init.c】将service信息放置到service.list中【system/core/init/init_parser.c】。

建立service进程。

【service_start(…) execve(…)】
在init.c中,完成以下工作
1、初始化log系统【解析/init.rc和init.%hardware%.rc文件,在两个
文件解析步骤2时执行“early-init”行动】
2、初始化设备【在/dev下创建所有设备节点,下载firmwares】
3、初始化属性服务器【在两个文件解析步骤2时执行“init”行动】
4、开启属性服务【在两个文件解析步骤2时执行“early-boot”和
“boot”行动;在两个文件解析步骤2时执行“excecute
property”行动】
5、进入一个无限循环【等待device/property set/child进程退出事
件】
四,Servicemanager
【Servicemanager属于Native Service。

在执行init.rc时就会启动,与Zygote
一样】
通知binder设备,把自己变成context_manager
【service servicemanager/system/bin/servicemanager,从main(…)开始】
进入循环,不停的去读binder设备,看是否有对service的请求
如果有,调用svcmar_handler函数回调处理请求
【在Servicemanager中的svcmar_handler负责处理android中所有有关service的请求响应】
有增加服务请求时,由Servicemanager负责注册各项服务。

【注册后,会将该service加入svcList中,svcList中存了各个注册过的service的name和
handler。

当接收到获取service的请求时,Servicemanager会去查找该service,如果存在,则把返回数据写入reply,返回给客户。


【处理服务注册和监听】
五,Zygote
【Servicemanager和Zygote进程奠定了android的基础,Zygote这个进程起
来才会立起真正的android运行空间,初始化建立的service都是Native
service.rc在脚本文件中Zygote的描述,Zygote是用于初始化虚拟机的进程,
它会监听请求创建虚拟机实例的socket】
建立java runtime【Zygote从main(…)开始
frameworks/base/cmds/app_main.cpp】
创建Dalvik java虚拟机,JNI_Createjava VM()
注册Android Runtime中的JNI接口给虚拟机
呼叫Java类com.android.internal.os.ZygoteInit中的main函数
【AndroidRuntime::start(…)
frameworks/base/core/jni/AndroidRuntime.cpp】
登记Listen端口,用来接受请求【registerZygoteSocket()】
加载preloaded class、resource用来加快启动速度,【preloadClasses()】
启动System Server【startSystemServer()】
进入Zygote服务框架,经过以上步骤Zygote就建立完成,利用socket通信,
接受ActivityManagerService的请求,fork应用程序。

六,System server
【System Server作为Zygote的第1个子进程,是Android Framework的核心,它主要负责Android系统初始化并启动其他服务。

其它的Android服务都由
SystemServer启动并运行在该进程空间】
Fork出独立的进程,名称为“system-server”
System service启动原生服务,包括Surface Flinger和Audio Flinger
【system_main.cpp的main函数调用system_init.cpp的system_init函数。


后调用SystemServer.java的SystemServer:Init2,启动新线程】
原生system service向service manager注册为IPC服务目标。

【比如
AudioFlinger.cpp的instantiate函数】
System service开始Android managed services。

Android managed services向service manager注册
System server加载所有的服务后,系统初始化完成
七,Home启动
使用xxx.systemReady()通知各个服务,系统已经就绪。

特别对于ActivityManagerService.systemReady(回馈)
Widget.wallpaper.imm(输入法)等ready通知
启动Launcher。

相关主题