Android 根文件系统启动分析
2010-05-08 18:36:00 来源:WEB开发网核心提示:如果device_fd的revents为POLLIN,调用handle_device_fd * - 如果property_fd的revents为POLLIN,调用handle_property_set_fd * - 如果keychord_fd的revents为POLLIN,调用handle_keychord */ fo
如果device_fd的revents为POLLIN,调用handle_device_fd * -
如果property_fd的revents为POLLIN,调用handle_property_set_fd * -
如果keychord_fd的revents为POLLIN,调用handle_keychord */ for(;;) { int nr, i, timeout =
-1; for (i = 0; i < fd_count; i++) ufds[i].revents = 0; drain_action_queue();
restart_processes(); if (process_needs_restart) { timeout =
(process_needs_restart - gettime()) * 1000; if (timeout < 0) timeout = 0;
}#if BOOTCHART if (bootchart_count > 0) { if (timeout < 0 || timeout >
BOOTCHART_POLLING_MS) timeout = BOOTCHART_POLLING_MS; if (bootchart_step() <
0 || --bootchart_count == 0) { bootchart_finish(); bootchart_count = 0; }
}#endif nr = poll(ufds, fd_count, timeout); if (nr <= 0) continue; if
(ufds[2].revents == POLLIN) { /* we got a SIGCHLD - reap and restart as needed
*/ read(signal_recv_fd, tmp, sizeof(tmp)); while (!wait_for_one_process(0)) ;
continue; } if (ufds[0].revents == POLLIN) handle_device_fd(device_fd); if
(ufds[1].revents == POLLIN) handle_property_set_fd(property_set_fd); if
(ufds[3].revents == POLLIN) handle_keychord(keychord_fd); } return 0;}
2、启动脚本init.rc
在Android中使用启动脚本init.rc,可以在系统的初始化过程中进行一些简单的初始化操作。这个脚本被直接安装到目标系统的根文件系统中,被init可执行程序解析。 init.rc是在init启动后被执行的启动脚本,其余发主要包含了以下内容:
Commands:命令
Actions:动作
Triggers:触发条件
Services:服务
Options:选项
Propertise:属性
Commands是一些基本的操作,例如:
mkdir /sdcard 0000 system system mkdir /system mkdir /data 0771 system system mkdir /cache 0770 system cache mkdir /config 0500 root root mkdir /sqlite_stmt_journals 01777 root root mount tmpfs tmpfs /sqlite_stmt_journals size=4m
这些命令在init可执行程序中被解析,然后调用相关的函数来实现。 Actions(动作)表示一系列的命令,通常在Triggers(触发条件)中调用,动作和触发条件例如:
更多精彩
赞助商链接