没有合适的资源?快使用搜索试试~ 我知道了~
Androidinit启动过程分析.pdf
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 6 浏览量
2022-07-13
21:47:00
上传
评论
收藏 36KB PDF 举报
温馨提示
试读
20页
Androidinit启动过程分析.pdf
资源推荐
资源详情
资源评论
Android init 启动过程分析
分析 android 的启动过程,从内核之上,我们首先应该从文件系统的 init 开始,因为 init
是内核进入文件系统后第一个运行的程序, 通常我们可以在 linux 的命令行中指定内核第一
个调用谁,如果没指定那么内核将会到 /sbin/,
/bin/ 等目录下查找默认的 init ,如果没有找到那么就报告出错。
下面是曾经用过的几种开发板的命令行参数:
S3C2410 启动参数:
noinitrd
root=/dev/nfs nfsroot=192.168.2.56:/nfsroot/rootfs
ip=192.168.2.188:192.168.2.56:192.168.2.56:255.255.255.0::eth0:on
console=ttySAC0
S3C2440 启动参数:
setenv bootargs console=ttySAC0
root=/dev/nfs nfsroot=192.168.2.56:/nfsroot/rootfs
ip=192.168.2.175:192.168.2.56:192.168.2.201:255.255.255.0::eth0:on
mem=64M init=/init
marvell 310 启动参数:
boot root=/dev/nfs
nfsroot=192.168.2.56:/nfsroot/rootfs,rsize=1024,wsize=1024
ip=192.168.2.176:192.168.2.201:192.168.2.201:255.255.255.0::eth0:-On
console=ttyS2,115200 mem=64M init=/init
init 的源代码在文件: ./system/core/init/init.c 中, init 会一步步完成下面的任务:
1. 初始化 log 系统
2. 解析 /init.rc 和/init.%hardware%.rc 文件
3. 执行 early-init action in the two files parsed in step 2.
4. 设备初始化,例如:在 /dev 下面创建所有设备节点,下载 firmwares.
5.
初始化属性服务器, Actually the property system is working as a share memory.
Logically it looks like a registry under Windows system.
6. 执行 init action in the two files parsed in step 2.
7. 开启 属性服务。
8. 执行 early-boot and boot actions in the two files parsed in step 2.
9. 执行 Execute property action in the two files parsed in step 2.
10.
进入一个无限循环 to wait for device/property set/child process exit events. 例如 ,
如果 SD 卡被插入, init 会收到一个设备插入事件,它会为这个设备创建节点。系统中比较
重要的进程都是由 init 来 fork 的,所以如果他们他谁崩溃
了,那么 init 将会收到一个 SIGCHLD 信号,把这个信号转化为子进程退出事件, 所以
在 loop 中, init 会操作进程退出事件并且执行
*.rc 文件中定义的命令。
例如,在 init.rc 中,因为有:
service zygote /system/bin/app_process -Xzygote /system/bin --zygote
--start-system-server
socket zygote stream 666
onrestart write /sys/android_power/request_state wake
onrestart write /sys/power/state on
所以,如果 zygote 因为启动某些服务导致异常退出后, init 将会重新去启动它。
int main(int argc, char **argv)
{
...
// 需要在后面的程序中看打印信息的话,需要屏蔽 open_devnull_stdio() 函数
open_devnull_stdio();
...
// 初始化 log 系统
log_init();
// 解析 /init.rc 和/init.%hardware%.rc 文件
parse_config_file("/init.rc");
...
snprintf(tmp, sizeof(tmp), "/init.%s.rc", hardware);
parse_config_file(tmp);
...
// 执行 early-init action in the two files parsed in step 2.
action_for_each_trigger("early-init", action_add_queue_tail);
drain_action_queue();
...
/* execute all the boot actions to get us started */
/* 执行 init action in the two files parsed in step 2 */
action_for_each_trigger("init", action_add_queue_tail);
drain_action_queue();
...
/* 执行 early-boot and boot actions in the two files parsed in step 2 */
action_for_each_trigger("early-boot", action_add_queue_tail);
action_for_each_trigger("boot", action_add_queue_tail);
drain_action_queue();
/* run all property triggers based on current state of the properties */
queue_all_property_triggers();
drain_action_queue();
/* enable property triggers */
property_triggers_enabled = 1;
...
for(;;) {
int nr , timeout = -1;
...
drain_action_queue();
restart_processes();
if (process_needs_restart) {
timeout = (process_needs_restart - gettime()) * 1000;
if (timeout
重要的数据结构
两个列表,一个队列。
static list_declare(service_list);
static list_declare(action_list);
static list_declare(action_queue);
*.rc 脚本中所有 service 关键字定义的服务将会添加到 service_list 列表中。
*.rc 脚本中所有 on 关键开头的项将会被会添加到 action_list 列表中。
每个 action 列表项都有一个列表,此列表用来保存该段落下的 Commands
脚本解析过程:
parse_config_file("/init.rc")
int parse_config_file(const char *fn)
{
char *data;
data = read_file(fn, 0);
if (!data) return -1;
parse_config(fn, data);
DUMP();
return 0;
}
static void parse_config(const char *fn, char *s)
{
...
case T_NEWLINE:
if (nargs) {
int kw = lookup_keyword(args[0]);
if (kw_is(kw, SECTION)) {
state.parse_line(&state, 0, 0);
parse_new_section(&state, kw, nargs, args);
} else {
state.parse_line(&state, nargs, args);
}
nargs = 0;
}
...
}
parse_config 会逐行对脚本进行解析,如果关键字类型为 SECTION ,那么将会执行
parse_new_section()
类型为 SECTION 的关键字有: on 和 sevice
关键字类型定义在 Parser .c (system\core\init) 文件中
Parser .c (system\core\init)
#define SECTION 0x01
#define COMMAND 0x02
#define OPTION 0x04
关键字 属性
capability, OPTION, 0, 0)
class, OPTION, 0, 0)
class_start, COMMAND, 1, do_class_start)
class_stop, COMMAND, 1, do_class_stop)
console, OPTION, 0, 0)
critical, OPTION, 0, 0)
disabled, OPTION, 0, 0)
domainname, COMMAND, 1, do_domainname)
exec, COMMAND, 1, do_exec)
export, COMMAND, 2, do_export)
group, OPTION, 0, 0)
hostname, COMMAND, 1, do_hostname)
ifup, COMMAND, 1, do_ifup)
insmod, COMMAND, 1, do_insmod)
import, COMMAND, 1, do_import)
keycodes, OPTION, 0, 0)
mkdir , COMMAND, 1, do_mkdir)
mount, COMMAND, 3, do_mount)
on, SECTION, 0, 0)
oneshot, OPTION, 0, 0)
onrestart, OPTION, 0, 0)
restart, COMMAND, 1, do_restart)
service, SECTION, 0, 0)
setenv, OPTION, 2, 0)
setkey, COMMAND, 0, do_setkey)
setprop, COMMAND, 2, do_setprop)
setrlimit, COMMAND, 3, do_setrlimit)
socket, OPTION, 0, 0)
start, COMMAND, 1, do_start)
stop, COMMAND, 1, do_stop)
trigger , COMMAND, 1, do_trigger)
剩余19页未读,继续阅读
资源评论
hyh15959933972
- 粉丝: 0
- 资源: 8万+
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功