相关源码:
/system/core/init/Init.h
/system/core/init/Init.cpp
/system/core/init/Init_parser.h
/system/core/init/Init_parser.cpp
/system/core/init/Signal_handler.h
/system/core/init/Signal_handler.cpp
Android系统在启动的过程中,kernel会启动第一个进程:init,它是一个由内核启动的用户级进程,实现了内核空间到用户空间的转变。
一、Linux操作系统
整个linux操作系统可以分为三层次,从最底层到最上层依次是:硬件-->内核空间-->用户空间,如下图:
PS:
(1) 内核空间中存放的是内核代码和数据,而进程的用户空间中存放的是用户程序的代码和数据;
(2)内核态与用户态:
a、当一个任务(进程)执行系统调用而陷入内核代码中执行时,称进程处于内核运行态(内核态)。
当进程处于内核态时,执行的内核代码会使用当前进程的内核栈,每个进程都有自己的内核栈;
b、当进程在执行用户自己的代码时,则称其处于用户运行态(用户态)。
当正在执行用户程序而突然被中断程序中断时,此时用户程序也可以象征性地称为处于进程的内核态。
二、init 进程
Android的init 进程(system/core/init/init.c)主要功能:
1)、分析init.rc启动脚本文件(system/core/rootdir),根据文件内容执行相应的功能;
2)、当一些关键进程死亡时,重启该进程;
3)、提供Android系统的属性服务;
在init中启动起来的服务按照init.rc中的先后顺序,大致有:
(1)console: start a shell,code path: system/bin/sh,其源码中包含常用的shell命令,如ls,cd等。
(2)adbd: start adb daemon,通常带有disabled的选项,表明需要按名字启动,code path:system/bin/adb。
(3)servicemanager:这个服务管理着系统内所有binder services。code path: frameworks/base/cmds/servicemanager。
(4)Vold: android 的udev,code path: system/vold。
(5)Netd: start ntd daemon, code path: system/netd。
(6)Debuggerd: start debug system, code path: system/core/debuggerd。
(7)zygote: ['zaigəut]这是一个非常重要的服务,稍后详解。start Android Java Runtime and start systemserver。code path:frameworks/base/cmds/app_process。
(8)media: add AudioFlinger,AudioPolicyService,MediaPlayerService and CameraService to servicemanager,
(9)启动管理binder通讯的机制,依靠ProcessState 和IPCThreadState类来完成binder机制。Code path :frameworks/base/media/mediaserver。
(10)bootanim: 开机动画和铃声,code path:frameworks/base/cmds/bootanimation。
等等。