Android init进程启动过程分析

本文深入剖析了Android系统的init进程启动流程,从main()函数开始,涉及mkdir/mount、import_kernel_cmdline、init.rc解析、硬件信息获取、action_queue的构建及执行等关键步骤。init进程在系统启动中负责初始化property机制、service管理和各种配置的执行,为后续系统服务的运行奠定基础。
摘要由CSDN通过智能技术生成

本文分析Android中init进程的执行过程,只是分析init进程启动的流水,具体细节在今后的各个专题中再分别详细分析。本文虽是后面各个专题的基础,读者初看可能理解不深,可以在阅读后面各个专题的时候,结合本文的整体流程会有更清晰的理解。

Init进程从 /system/core/init/init.c里的main()函数开始

1.      mkdir && mount

2.      import_kernel_cmdline

    从内核中通过/proc/cmdline导入下列命令行参数,这些参数会分别被设置到各个属性值中:

      androidboot.console      // 设置console
      androidboot.mode         // 设置属性ro.factorytest
      androidboot.serialno     // 设置属性ro.serialno
      androidboot.baseband     // 设置属性ro.baseband
      androidboot.carrier      // 设置属性ro.carrier
      androidboot.bootloader   // 设置属性ro.bootloader
      androidboot.hardware     // 设置属性ro.hardware
      androidboot.bsp          // 根据这个设置与否,选择不同的init.rc版本

注意:以上说的设置属性还未真正设置,property机制还未工作。

3.      init_parse_config_file()

    解析init.rc或者init_bsp.rc(看步骤2导入的参数“androidboot.bsp”是否设置)

    Init.rc的解析,参见《Android中init.rc文件的解析

4.      get_hardware_name()

    从/proc/cpuinfo中获取“Hardware”字段信息写入<hw>;“Reversion” 字段信息写入<reversion>

5.      init_parse_config_file()

    解析init.<hw>.rc或者init_bsp.<hw>.rc(看步骤2导入的参数“androidboot.bsp”是否设置)

    Init.rc的解析,参见《Android中init.rc文件的解析

6.      action_for_each_trigger("early-init",action_add_queue_tail);

    对init???.rc中解析出的early-initsection里action,执行action_add_queue_tail操作,也就是把act->qlist加入到action_queue的列尾

:此时并未真正执行,只是挂在队列尾。

7.      把一些初始化操作加入到action_queue列表中

    queue_builtin_action(wait_for_coldboot_done_action,"wait_for_coldboot_done");    queue_builtin_action(property_init_action,"property_init");    queue_builtin_action(keychord_init_action,"keychord_init");    queue_builtin_action(console_init_action,"console_init");    queue_builtin_action(set_init_properties_action,"set_init_properties");

queue_builtin_action(int (*func)(int nargs,char **args), char *name)是以name形成action,挂在 action_list上;以func和name组成command,挂在action的commands上。然后加入到 action_queue的队尾。

8.      对其他section内的action,加入到action_queue列表中

    另外一些初始操作也加入到action_queue列表中

        /* execute all the boot actions to getus started */    action_for_each_trigger("init",action_add_queue_tail);    action_for_each_trigger("early-fs", action_add_queue_tail);    action_for_each_trigger("fs",action_add_queue_tail);    action_for_each_trigger("post-fs",action_add_queue_tail);    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");     /* execute all the boot actions to get usstarted */    action_for_each_trigger("early-boot", action_add_queue_tail);    action_for_each_trigger("boot",action_add_queue_tail);         /* run all property triggers based oncurrent state of the properties */    queue_builtin_action(queue_property_triggers_action,"queue_propety_triggers");

9.      进入无限循环中for(;;)

   9.1 execute_one_command():[system/core/init/init.c]

      1) 从action_queue取下structaction *act赋给cur_action;

      2) 从cur_action获得struct command *赋给cur_command;

      3) 执行cur_command->func(cur_command->nargs, cur_command->args)

     注1:以上是第一次执行时,如果action中还有command,就不需要1,而2中就是直接再在action上取下一条command即可。

     注2:这里才是真正地命令的执行,前面的action_for_each_trigger()和queue_builtin_action()只是加入到action_queue队列中,而这里是从队列中顺序取出,并执行。

     所以,加入队列action_queue的顺序也就决定了执行的顺序。Init???.rc中action所在的section决定了它们执行的先后次序:early-init -> init -> early-fs -> fs -> post-fs ->early-boot -> boot。

   9.2 restart_processes():system/core/init/init.c

      对有SVC_RESTARTING标志的service,执行restart_service_if_needed()

  9.3 用poll等待几个事件:property事件/子进程结束的signal事件/keychord

   9.4 处理等到的事件

      对property_set事件,调用handle_property_set_fd()处理;

      对keychord事件,调用handle_keychord()处理;

      对signal事件,调用handle_signal()处理;  

总结

本文分析了Android里的init进程的启动过程,从中可以知道init做的主要工作包括对init.rc的解析property机制的实现service支撑的实现。详细细节在后面的专题中讨论。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我是你的春哥!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值