本文介绍Android的kernel启动后,第一个初始化进程的处理内容(类似于Meego的init进程,但是Android简化了很多标准的Linux处理方式,应该是为了加速系统的启动速度的缘故)。
从上电复位到bootloader的运行以及kernel的初始化部分会有专门的文章进行介绍,此处专注于系统此后的行为!
kernel初始化最后阶段的thread退化(退化的方式另有专门的文章)成init进程。我们就分析下这个进程的内容!。
system/core/init/init.c
除了Linux下创建进程的一些标准处理后(signal处理,mask初始化等)便开始正式的初始化。
1)这部分完成基本的fs的初始化。
mkdir("/dev", 0755); 用于后面创建设备节点
mkdir("/proc", 0755);为mount procfs准备
mkdir("/sys", 0755); 为mount sysfs作准备
mount("tmpfs", "/dev", "tmpfs", 0, "mode=0755"); mount tmpfs
mkdir("/dev/pts", 0755);
mkdir("/dev/socket", 0755);
mount("devpts", "/dev/pts", "devpts", 0, NULL); mount登录终端设备
mount("proc", "/proc", "proc", 0, NULL); mount procfs
mount("sysfs", "/sys", "sysfs", 0, NULL); mount sysfs
需要值得一提的是Linux下是使用script来完成处理的,而Android却是直接使用syscall,应该也是为了提升系统的开机速度考虑的。
2)创建null device,重定向标准输入,输出以及标准出错。由于Android基本处于非terminal下,所以很多输出都是重定向如null的。同时为了跟踪系统的行为Android使用kmsg系统。
open_devnull_stdio();
log_init(); 初始化kmsg系统
3)这部分内容比较重要。关于/init.rc是一个配置文件。我们可以按照语法添加自己的初始化命令以及注册service等。详细清看我转载的一篇文章
android的init.rc文件的语法 parse_config_file("/init.rc");