Android的Init进程简析
来源:互联网 发布:软件系统启动超时 编辑:程序博客网 时间:2024/06/04 00:34
一,Android的init进程目录代码在:/system/core/init/
二,调用过程如下:
_start(uboot/cpu/s5pc11x/start.s)
|
|
_start_armboot(uboot/lib_arm/board.c)
|
|
main_loop(uboot/common/main.c)
|
|
do_bootm(uboot/lib_arm/bootm.c)
|
|
|
start_kernel(kernel/init/main.c)
|
|
rest_init(kernel/init/main.c)
|
|
kernel_init(kernel/init/main.c)
|
|
init_post(kernel/init/main.c)
|
|
run_init_process(kernel/init/main.c)
|
|
main(system/core/init/init.c)
三,创建启动所需的文件目录并挂载相应文件系统
mkdir("/dev", 0755);
mkdir("/proc", 0755);
mkdir("/sys", 0755);
mount("tmpfs", "/dev", "tmpfs", MS_NOSUID, "mode=0755");
mkdir("/dev/pts", 0755);
mkdir("/dev/socket", 0755);
mount("devpts", "/dev/pts", "devpts", 0, NULL);
mount("proc", "/proc", "proc", 0, NULL);
mount("sysfs", "/sys", "sysfs", 0, NULL);
四,解析相应的rc文件(run command)
init_parse_config_file("/init.rc");
/* pull the kernel commandline and ramdisk properties file in */
import_kernel_cmdline(0, import_kernel_nv);
/* don't expose the raw commandline to nonpriv processes */
chmod("/proc/cmdline", 0440);
get_hardware_name(hardware, &revision);
snprintf(tmp, sizeof(tmp), "/init.%s.rc", hardware);
init_parse_config_file(tmp);
安卓启动脚本文件有两个,一个是init.rc(目录:system/core/rootdir),另一个是init.平台.rc(比如init.x210.rc,目录:device/samsung/x210)
init_parse_config_file直接调用parse_config(init_parese.c)解析启动运行脚本,将其保存在struct parse_state中。
尔后设置相关执行初始函数,继而死循环执行脚本,并等待三个相关socket读写。一个属性设置,一个进程死亡,一个组合按键
很多daemon及服务进程都是这个时候启动的,
服务进程,守护进程:
zygote(java所有进程的父进程,包括system)
servicemanager(负责服务管理的,本身也是服务)
surfaceflinger(帧缓冲区服务)
vold(卷标监控)
netd(网络相关)
adbd
ril(无线硬件设备与电话服务之间的抽象层)
media(多媒体服务)
bootanim(开机动画)
dbus(与binder类似通信服务,只是使用的是socket,binder使用的是内核内存)
uevent(监控/dev/*设备节点)
二,调用过程如下:
_start(uboot/cpu/s5pc11x/start.s)
|
|
_start_armboot(uboot/lib_arm/board.c)
|
|
main_loop(uboot/common/main.c)
|
|
do_bootm(uboot/lib_arm/bootm.c)
|
|
|
start_kernel(kernel/init/main.c)
|
|
rest_init(kernel/init/main.c)
|
|
kernel_init(kernel/init/main.c)
|
|
init_post(kernel/init/main.c)
|
|
run_init_process(kernel/init/main.c)
|
|
main(system/core/init/init.c)
三,创建启动所需的文件目录并挂载相应文件系统
mkdir("/dev", 0755);
mkdir("/proc", 0755);
mkdir("/sys", 0755);
mount("tmpfs", "/dev", "tmpfs", MS_NOSUID, "mode=0755");
mkdir("/dev/pts", 0755);
mkdir("/dev/socket", 0755);
mount("devpts", "/dev/pts", "devpts", 0, NULL);
mount("proc", "/proc", "proc", 0, NULL);
mount("sysfs", "/sys", "sysfs", 0, NULL);
四,解析相应的rc文件(run command)
init_parse_config_file("/init.rc");
/* pull the kernel commandline and ramdisk properties file in */
import_kernel_cmdline(0, import_kernel_nv);
/* don't expose the raw commandline to nonpriv processes */
chmod("/proc/cmdline", 0440);
get_hardware_name(hardware, &revision);
snprintf(tmp, sizeof(tmp), "/init.%s.rc", hardware);
init_parse_config_file(tmp);
安卓启动脚本文件有两个,一个是init.rc(目录:system/core/rootdir),另一个是init.平台.rc(比如init.x210.rc,目录:device/samsung/x210)
init_parse_config_file直接调用parse_config(init_parese.c)解析启动运行脚本,将其保存在struct parse_state中。
尔后设置相关执行初始函数,继而死循环执行脚本,并等待三个相关socket读写。一个属性设置,一个进程死亡,一个组合按键
很多daemon及服务进程都是这个时候启动的,
服务进程,守护进程:
zygote(java所有进程的父进程,包括system)
servicemanager(负责服务管理的,本身也是服务)
surfaceflinger(帧缓冲区服务)
vold(卷标监控)
netd(网络相关)
adbd
ril(无线硬件设备与电话服务之间的抽象层)
media(多媒体服务)
bootanim(开机动画)
dbus(与binder类似通信服务,只是使用的是socket,binder使用的是内核内存)
uevent(监控/dev/*设备节点)
0 0
- Android的Init进程简析
- Android的init进程
- android 的Init进程
- android的首进程init
- [3] Android的init进程
- android init 进程的创建
- 关于android的init进程
- Android启动的init进程
- init进程简析
- android init进程 init.rc
- Android init 进程 init.rc init.*.rc
- Android init 进程 init.rc init.*.rc
- Android init 进程 init.rc init.*.rc
- android init进程启动的大致流程
- Android 4.4 的 init 进程详解
- Android的init进程启动过程
- Android中init进程的工作
- Android的init启动进程分析
- iOS JSON解析简述
- 开发互联网产品的优化要求
- Android 中保存全局变量
- 传智播客-20150627流程控制
- CyclicBarrier
- Android的Init进程简析
- MATLAB 图像处理相关知识
- acm 常用数据结构与算法专题(未分类均放于此)
- 数据库复习7——恢复
- 【Scala编程】格式化算术表达式程序
- HTML 4.0笔记(精华浓缩版)
- ios官方开发文档
- java中实现代理及委托代理模式
- 高效 , 极致, 口碑, 快