转自:http://blog.csdn.net/wuyun2009/article/details/5656241

在Android系统启动时,内核引导参数上一般都会设置“init=/init”,这样的话,如果内核成功挂载了这个文件系统之后,首先运行的就是这个根目录下的init程序。这个程序所了什么呢? 我们只有RFSC(Readthe Fucking Source code)!!

init程序源码在Android官方源码的system/core/init中,main在init.c里。我们的分析就从main开始。

init:

(1)安装SIGCHLD信号。(如果父进程不等待子进程结束,子进程将成为僵尸进程(zombie)从而占用系统资源。因此需要对SIGCHLD信号做出处理,回收僵尸进程的资源,避免造成不必要的资源浪费。

(2)对umask进行清零。
    何为umask,请看http://www.szstudy.cn/showArticle/53978.shtml

(3)为rootfs建立必要的文件夹,并挂载适当的分区。
    /dev (tmpfs)
        /dev/pts (devpts)
        /dev/socket
    /proc (proc)
    /sys  (sysfs)

(4)创建/dev/null和/dev/kmsg节点。

(5)解析/init.rc,将所有服务和操作信息加入链表。

(6)从/proc/cmdline中提取信息内核启动参数,并保存到全局变量。

(7)先从上一步获得的全局变量中获取信息硬件信息和版本号,如果没有则从/proc/cpuinfo中提取,并保存到全局变量。

(8)根据硬件信息选择一个/init.(硬件).rc,并解析,将服务和操作信息加入链表。
         在G1的ramdisk根目录下有两个/init.(硬件).rc:init.goldfish.rc和init.trout.rc,init程序会根据上一步获得的硬件信息选择一个解析。

(9)执行链表中带有“early-init”触发的的命令。

(10)遍历/sys文件夹,是内核产生设备添加事件(为了自动产生设备节点)。

(11)初始化属性系统,并导入初始化属性文件。

(12)从属性系统中得到ro.debuggable,若为1,則初始化keychord監聽。

(13)打開console,如果cmdline中沒有指定console則打開默認的/dev/console。

(14)讀取/initlogo.rle(一張565 rle 壓縮的位圖),如果成功則在/dev/graphics/fb0顯示Logo,如果失敗則將/dev/tty0設為TEXT模式并打開/dev/tty0,輸出文本“ANDROID”字樣。

(15)判斷cmdline 中的參數,并设置属性系统中的参数:
         1、 如果 bootmode為
         - factory,設置ro.factorytest值為1
         - factory2,設置ro.factorytest值為2
         - 其他的設ro.factorytest值為0
       2、如果有serialno参数,則設置ro.serialno,否則為""
       3、如果有bootmod参数,則設置ro.bootmod,否則為"unknown"
       4、如果有baseband参数,則設置ro.baseband,否則為"unknown"
       5、如果有carrier参数,則設置ro.carrier,否則為"unknown"
       6、如果有bootloader参数,則設置ro.bootloader,否則為"unknown"
       7、通过全局变量(前面从/proc/cpuinfo中提取的)設置ro.hardware和ro.version。

(16)執行所有触发标识为init的action。

(17)開始property服務,讀取一些property文件,這一動作必須在前面那些ro.foo設置后做,以便/data/local.prop不能干預到他們。
      - /system/build.prop
      - /system/default.prop
      - /data/local.prop
      - 在讀取默認的property后讀取presistent propertie,在/data/property中

(18)為sigchld handler創建信號機制。

(19)確認所有初始化工作完成:
          device_fd(device init 完成)
          property_set_fd(property server start 完成)
          signal_recv_fd (信號機制建立)

(20) 執行所有触发标识为early-boot的action

(21) 執行所有触发标识为boot的action

(22)基于當前property狀態,執行所有触发标识为property的action

(23)注冊輪詢事件:
           - device_fd
           - property_set_fd
           -signal_recv_fd
           -如果有keychord,則注冊keychord_fd

(24)如果支持BOOTCHART,則初始化BOOTCHART

(25)進入主進程循環:
      - 重置輪詢事件的接受狀態,revents為0
      - 查詢action隊列,并执行。
      - 重啟需要重啟的服务
      - 輪詢注冊的事件
          - 如果signal_recv_fd的revents為POLLIN,則得到一個信號,獲取并處理
          - 如果device_fd的revents為POLLIN,調用handle_device_fd
          - 如果property_fd的revents為POLLIN,調用handle_property_set_fd
          - 如果keychord_fd的revents為POLLIN,調用handle_keychord

android init(system/core/init/init.c)分析相关推荐

  1. Android SELinux 的认知以及 init 的相关知识,Linux 环境利用这2个模块进行白名单测试 -- 架构分析

    SELinux -- 在 Android 5.0+ google 加入了新的安全模块即SELinux,SELinux是一种Android上面的安全机制,针对Linux的安全加强系统 我们可以通过配置S ...

  2. Android系统init进程启动及init.rc全解析

    这是一篇用心写的博客,也希望大家用心看并帮忙找到文章的改进之处,谢谢: 服务启动机制 system/core/init/init.c文件main函数中parse_config_file(init.rc ...

  3. Android系统(2)---init.rc知识

    在解析Init.rc之前需要对init.rc文件有一个认识,init.rc是由一种被称为"Android初始化语言"(Android Init Language,这里简称为AIL)的脚本写成的文件.该 ...

  4. 做Android开发,要清楚init.rc里面的东西

    init.rc 复习 看这个之前,先看看大神总结的文章 这篇文章总结的非常到位,但是因为代码不是最新的Android版本,对我们最新的Android版本不适用. http://gityuan.com/ ...

  5. 【Android 源码学习】 init启动

    目录 Android 源码学习 init启动 从main.cpp开始 init.cpp 部分逻辑 init启动zygote 属性服务 总结 Android 源码学习 init启动 Android 11 ...

  6. 【Android】系统架构功能+init、zygote、system server、app等进程间关系分析

    文章目录 架构功能 Loader层 Linux内核层 硬件抽象层 (HAL) Android Runtime & 系统库 Framework层 App层 Syscall && ...

  7. Android 10.0系统启动之init进程-[Android取经之路]

    摘要:init进程是linux系统中用户空间的第一个进程,进程号为1.当bootloader启动后,启动kernel,kernel启动完后,在用户空间启动init进程,再通过init进程,来读取ini ...

  8. Android开发入门教程2-Android init 启动过程分析

    Android init 启动过程分析   分析android的启动过程,从内核之上,我们首先应该从文件系统的init开始,因为 init 是内核进入文件系统后第一个运行的程序,通常我们可以在linu ...

  9. 《深入理解Android 卷Ⅰ》深入理解init

    深入理解init 1.1 概述 init 是一个进程,确切地说,它是Linux 系统中用户空间地第一个进程.由于Android 是基于Linux 内核的,所以init 也是Android 系统中用户空 ...

最新文章

  1. 迪拜测试世界上首款自动驾驶出租车,距离2030年的自动驾驶目标又进一步
  2. oracle中各种函数,oracle中常用函数大全
  3. 两年来的core折腾之路几点总结,附上nginx启用http2拿来即用的配置
  4. centos关闭邮件提醒
  5. python面向对象三大特性_python面向对象的三大特性
  6. GB35114 A级过检
  7. 2.4.1 ALU-串行加法器和并行加法器
  8. mtk android 源代码下载,MTK手机开发之路--MTK源代码下载
  9. Frenet和笛卡尔坐标系互转
  10. Windows启动配置数据(BCD)存储文件包含一些无效信息
  11. iphone获取手机设备号
  12. Unity 制作简单的任务动画
  13. WD蓝盘绿盘黑盘红盘的区别
  14. 【科研绘图】-C4D搭建石墨烯
  15. 马斯克疯狂理念在中国落地?国产高速飞行列车即将登场
  16. nvenc vs x264 对比(2)
  17. 解决安装office2016后文件图标显示空白图标
  18. H5指北针JavaScript代码
  19. 扬帆起航——第一篇博客
  20. 一致 先验分布 后验分布_先验概率、似然函数与后验概率

热门文章

  1. 从进程说起:容器到底是怎么一回事儿?
  2. 实战:Nginx集成Lua脚本并调用memcached
  3. JVM: G1和CMS的区别
  4. 数据包分片和重组 MTU与MSS
  5. Python 实现杨辉三角
  6. mysql半复制_mysql半同步复制
  7. 医院的“数据中心”,究竟应该怎么建?
  8. 数据网络卡顿怎么处理_监控网络卡顿怎么办
  9. web版本 开源压测工具_标星 1.3K 的 Web 框架压测库,助你更好的选择框架
  10. C++:C++语言入门级基础知识考察点回顾之函数、结构体和类