Linux 内核映像通常包括两部分代码,分别为实模式代码和保护模式代码。当 BootLoader 装载内核映像到代码段内存时,分别放置实模式代码和保护模式代码到不同的位置,然后进入实模式代码执行,实模式代码执行完成后转入保护模式代码。
实模式和保护模式的概念再次不做过多解释,读者可以自行查阅资料。
当系统内核加载完成之后,会首先启动 Init 守护进程,它是内核启动的第一个用户级进程,它的进程号总是 1。Init 进程启动完成之后,还负责启动其他的一些重要守护进程,包括:
Usbd 进程(USB Daemon):USB 连接后台进程,负责管理 USB 连接。
adbd 进程(Android Debug Bridge Daemon):ADB 连接后台进程,负责管理 ADB 连接。
debuggerd 进程(Debugger Daemon) :调试器后台进程,负责管理调试请求及调试过程。
rild 进程 (Radio Interface Layer Daemon):无线接口层后台进程,负责管理无线通信服务。
Init 进程和一些重要的守护进程启动完成之后,系统启动 Zygote 进程。Zygote 进程启动后,首先初始化一个 Dalvik VM实例,然后为它加载资源与系统共享库,并开启 Socket 监听服务,当收到创建Dalvik VM 实例请求时,会通过COW(copy on write)技术最大程度地复用自己,生成一个新的Dalvik VM 实例。Dalvik VM 实例的创建方法基于 linux 系统的 fork 原理。
其实,我个人理解,Zygote 进程就相当于Linux系统中的 fork 进程。由它可以在系统运行期间,接收到创建虚拟机请求时,孵化 Dalvik VM实例。Zygote 进程孵化 Dalvik VM 实例流程如下图所示:
图1 Zygote进程孵化Dalvik VM实例流程