Android本质上就是一个基于Linux内核的操作系统方案Word文档格式.docx
- 文档编号:13521283
- 上传时间:2022-10-11
- 格式:DOCX
- 页数:18
- 大小:154.33KB
Android本质上就是一个基于Linux内核的操作系统方案Word文档格式.docx
《Android本质上就是一个基于Linux内核的操作系统方案Word文档格式.docx》由会员分享,可在线阅读,更多相关《Android本质上就是一个基于Linux内核的操作系统方案Word文档格式.docx(18页珍藏版)》请在冰豆网上搜索。
当Linux核加载完后,要做的第一件事就是调用init程序,也就是说,init是用户空间执行的第一个程序。
在分析init的核心代码之前,还需要初步了解init除了建立一些目录外,还做了如下的工作
1.初始化属性
2.处理配置文件的命令(主要是init.rc文件),包括处理各种Action。
3.性能分析(使用bootchart工具)。
4.无限循环执行command(启动其他的进程)。
尽管init完成的工作不算很多,不过代码还是非常复杂的。
Init程序并不是由一个源代码文件组成的,而是由一组源代码文件的目标文件而成的。
这些文件位于如下的目录。
<
Android源代码本目录>
/system/core/init
其中init.c是init的主文件,现在打开该文件,看看其中的容。
由于init是命令行程序,所以分析init.c首先应从main函数开始,现在好到main函数,代码如下:
intmain(intargc,char**argv)
{
intfd_count=0;
structpollfdufds[4];
char*tmpdev;
char*debuggable;
chartmp[32];
intproperty_set_fd_init=0;
intsignal_fd_init=0;
intkeychord_fd_init=0;
boolis_charger=false;
if(!
strcmp(basename(argv[0]),"
ueventd"
))
returnueventd_main(argc,argv);
watchdogd"
returnwatchdogd_main(argc,argv);
/*cleartheumask*/
umask(0);
//下面的代码开始建立各种用户空间的目录,如/dev、/proc、/sys等
mkdir("
/dev"
0755);
/proc"
/sys"
mount("
tmpfs"
"
MS_NOSUID,"
mode=0755"
);
/dev/pts"
/dev/socket"
devpts"
0,NULL);
proc"
sysfs"
/*检测/dev/.booting文件是否可读写和创建*/
close(open("
/dev/.booting"
O_WRONLY|O_CREAT,0000));
open_devnull_stdio();
klog_init();
//初始化属性
property_init();
get_hardware_name(hardware,&
revision);
//处理核命令行
process_kernel_cmdline();
……
is_charger=!
strcmp(bootmode,"
charger"
INFO("
propertyinit\n"
is_charger)
property_load_boot_defaults();
readingconfigfile\n"
//分析/init.rc文件的容
init_parse_config_file("
/init.rc"
……//执行初始化文件中的动作
action_for_each_trigger("
init"
action_add_queue_tail);
//在charger模式下略过mount文件系统的工作
is_charger){
early-fs"
fs"
post-fs"
post-fs-data"
}
queue_builtin_action(property_service_init_action,"
property_service_init"
queue_builtin_action(signal_init_action,"
signal_init"
queue_builtin_action(check_startup_action,"
check_startup"
if(is_charger){
}else{
early-boot"
boot"
/*runallpropertytriggersbasedoncurrentstateoftheproperties*/
queue_builtin_action(queue_property_triggers_action,"
queue_property_triggers"
#ifBOOTCHART
queue_builtin_action(bootchart_init_action,"
bootchart_init"
#endif
//进入无限循环,建立init的子进程(init是所有进程的父进程)
for(;
;
){
intnr,i,timeout=-1;
//执行命令(子进程对应的命令)
execute_one_command();
restart_processes();
property_set_fd_init&
&
get_property_set_fd()>
0){
ufds[fd_count].fd=get_property_set_fd();
ufds[fd_count].events=POLLIN;
ufds[fd_count].revents=0;
fd_count++;
property_set_fd_init=1;
signal_fd_init&
get_signal_fd()>
ufds[fd_count].fd=get_signal_fd();
signal_fd_init=1;
keychord_fd_init&
get_keychord_fd()>
ufds[fd_count].fd=get_keychord_fd();
keychord_fd_init=1;
if(process_needs_restart){
timeout=(process_needs_restart-gettime())*1000;
if(timeout<
0)
timeout=0;
action_queue_empty()||cur_action)
//bootchart是一个性能统计工具,用于搜集硬件和系统的信息,并将其写入磁盘,以便其
//他程序使用
if(bootchart_count>
0||timeout>
BOOTCHART_POLLING_MS)
timeout=BOOTCHART_POLLING_MS;
if(bootchart_step()<
0||--bootchart_count==0){
bootchart_finish();
bootchart_count=0;
//等待下一个命令的提交
nr=poll(ufds,fd_count,timeout);
if(nr<
=0)
continue;
for(i=0;
i<
fd_count;
i++){
if(ufds[i].revents==POLLIN){
if(ufds[i].fd==get_property_set_fd())
handle_property_set_fd();
elseif(ufds[i].fd==get_keychord_fd())
handle_keychord();
elseif(ufds[i].fd==get_signal_
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Android 本质上 就是 一个 基于 Linux 内核 操作系统 方案