最近在看AndroidInit进程的处理流程,现记录如下。在Android中,Init进程是Linux内核启动后创建的第一个用户进程,地位非常重要。Init进程的可执行文件在/system/core/init/目录下,我们直接看Init进程的main()函数,该函数的代码处理流程较长,我们分两大段来分析。首先看第一大段:[cpp]viewplaincopy在CODE上查看代码片派生到我的代码片intmain(intargc,char**argv){//检测启动程序的文件名,如果是ueventd或者watchdogd,则执行相应守护进程的主函数,然后退出if(!strcmp(basename(argv[0]),"ueventd")){returnueventd_main(argc,argv);}if(!strcmp(basename(argv[0]),"watchdogd")){returnwatchdogd_main(argc,argv);}//(0);//umask设置用户创建文件的默认属性;默认情况下文件的属性是022,这里参数为0,意为该进程创建的文件的属性值将为0777add_environment("PATH",_PATH_DEFPATH);boolis_first_stage=(argc==1)||(strcmp(argv[1],"--second-stage")!=0);//Getthebasicfilesystemsetupweneedputtogetherintheinitramdisk//on/andthenwe'(is_first_stage){//创建一些基本的目录,并将一些文件系统mount到对应的目录上.//tmpfs、devpts、proc和sysfs都是文件系统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);}//Wemusthavesomeplaceotherthan/tocreatethedevicenodesfor//kmsgandnull,otherwisewewon'tbeabletoremount/read-only//,wecanactuallytalk//();//把标准输入、标准输出、标准错误重定向到空设备文件"/dev/__null__"klog_init();//创建/dev/__kmsg__设备节点,让进程可以使用kernel的log系统来输出logklog_set_level(KLOG_NOTICE_LEVEL);//设置log等级NOTICE("init%sstarted!\n",is_first_stage?"":"secondstage");if(!is_first_stage){//Indicatethatbootingisinprogresstobackgroundfwloaders,etc.//在/,表示初始化正在进行;is_booting()函数会依靠这个文件判断进程是否正在初始化//进程初始化结束后,.booting文件将会被删除close(open("/dev/.booting",O_WRONLY|O_CREAT|O_CLOEXEC,0000));property_init();//初始化Android属性系统,Android中的属性系统在各个进程间都可以访问,这里创建了一块共享区域来存储属性值//mandlineandinDT,//mand-();process_kernel_cmdline();//解析/proc/cmdline文件,获得kernel的启动参数,将结果保存到几个属性中//Propogatethekernelvariablestointernalvariables//();//将一些系统
Android -- Android Init进程的处理流程分析 来自淘豆网m.daumloan.com转载请标明出处.