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/*设备节点)
   
0 0
原创粉丝点击