3.3 init进程的执行过程
init进程是用户空间的第一个进程,进程号为1。Android世界中,很多重要的工作都是从它开始的。
init进程相关源码位于/system/core/init目录下,从其编译文件Android.mk中可以看到这部分源代码最终被编译为可执行文件init,代码如下:
注意 pollfd是Linux中定义的结构体,用于存放需要监控事件的文件描述符,其定义如下:
struct pollfd {
int fd; //需要监控的文件描述符
short events; //监控fd上的事件,由调用方设置
short revents; //fd上发生过的事件,由返回方设置
};
poll的函数原型如下:
int poll(struct pollfd fds[], nfds_t nfds, int timeout);
nfds:用于标记fds[]中结构体元素的总数。
timeout:用于标记poll函数调用的阻塞事件,单位是毫秒。如果timeout=0,则poll不阻塞,直接返回。poll返回fds中revents不为0的fd个数;如果超时没有任何事件发生,返回0;失败时,返回-1。
通过对init.c文件中main函数的分析,可以将init的执行过程分为以下四个阶段:
1)初始化文件系统和日志系统,为之后的执行阶段做准备。这部分主要是Linux标准函数的调用。
2)解析 init.rc和init..rc初始化文件。
3)触发需要执行的Action和Service。
4)init循环监听处理事件。init触发所有Action后,进入一个无限循环,执行在可执行队列中的命令,重启异常退出的Service,并循环处理来自property service(属性服务)、signal和keychord的事件。
第一阶段很容易理解,都是基本的Linux函数调用。接下来,将针对其余三个阶段详细讲解init的运行过程。