Android 源码分析之 init 分析

   uboot  在初始化结束之后,会调用 start_kernel 来运行linux kernel.
   刚刚简单的看了看kernel 3.4, 现在的kernel是采用创建内核线程的形式来运行 init 的。 具体的代码可以参考 linux kernel 代码中的 init/main.c  start_kernel -> rest_init , 在  rest_init 中创建了内核线程, 这个线程的处理函数是 init_post, 在 init_post 中系统会调用 
        run_init_process("/sbin/init");
        run_init_process("/etc/init");
        run_init_process("/bin/init");
        run_init_process("/bin/sh");
   早期的 linux kenel 还不支持内核线程,是直接在 start_kernel 调用 init 的。
  
   Android 的 init 文件在 system/core/sh/init.c 代码不复杂,简单的分析一下:


   1. 程序开始先判断一下是不是作为 ueventd 来运行,如果是就运行 ueventd 的逻辑了
   2. 创建用到的文件系统的结构 /dev, /proc, /sys, 挂接 tmpfs 等等
   3. 创建 /dev/.booting 文件
   4. open_devnull_stdio 创建字符设备 /dev/__null_ 
   5. klog_init 创建 klog 用的字符设备
   6. 从 init.c 读取配置文件
   7. 读取本机专注的配置信息 /init.MACHINENAME.rc
   8. ..... 最后读取配置信息的每一条,开始执行


   init.rc 脚本是整个 android 其他的一个关键点, init.rc 所支持的所有的关键字都包涵在 core\init\keywords. h
   Android 中无数的细节都堪称经典,这个小小的 init.rc  的解析的架构,完全可以复用在自己的项目,对配置文件的简单解析,或者成为简单的脚本引擎。

你可能感兴趣的:(Android 源码分析之 init 分析)