Android init进程

本文为读书笔记,如有侵权,请联系我 
    linux中的所有进程都是由Init进程创建并运行的。首先linux内核启动,然后在用户空间中,启动init进程,再依次启动系统运行所需的其他进程。在系统启动完成后,init进程会作为守护进程监视其他进程。若某个监视中的进程一旦终结,进入将僵死状态,它就会释放进程所占用的系统资源。在android平台也有init进程。出上述功能外,还有其他功能。
下面分几部分应该掌握的:
一。 启动,首先启动linux,内核,然后进入用户空间,启动init进程,再依次启动系统运行所需的其他进程。
再系统启动完成后,init进程会作为守护进程监视其他进程。
二。 init进程主要提供4大功能
 init不仅进行(1)子进程的终止服务,(2)当应用程序访问设备驱动时,还会生成设备节点文件,(3)同时提供属性服务,保存系统运行所需的环境变量。还会(4)分析init.rc启动脚本文件,根据相关文文件中的内容,执行相应的功能。下面是详细说明:
   init进程是android系统启动后,由内核启动的第一个用户级进程,其启动过程如下:源码分析如下:
   首先init注册SIGCHLD信号处理器,用于处理子进程产生的信号(linux进程间相互发送消息来实现进程间的通信,这些消息就是信号,而对子进程产生的信号,再init的事件处理循环中进行)。
   init注册玩信号处理器后,然后创建并挂载启动所需的目录。像/dev, /pro, /sys等的系统运行时目录,再系统终止时,会消失。生成运行时目录后,创建运行日志输出设备
   在生成输出设备后,开始解析init.rc文件。 init.rc是init启动后的执行脚本,记录着init进程执行的功能,此文件定义在system/core/rootdir/目录下,包括init.rc和init.{hardware}.rc文件,用于环境设置与通用的进程相关的定义。 此过程中,会根据init.rc中的定义生成服务列表和动作列表,分别以链表的形式挂载再service_list与action_list上
   接着创建init进程中已经定义好的节点文件(device_init())
   然后开始初始化属性服务(property_init())
   接下来系统加载开机logo
           执行与动作列表的init区相关的命令。
   启动属性服务(start_property_service())
   接着创建套接字,以便init进程再收到子进程终止的信息SIGCHLD信号时,调用相应的handler
           程序开始执行与Action list的early-boot, boot ,  property相关的命令
   设置事件处理循环的监听事件。

下面对init源码分析,并对其提供的4个功能分别说明:
(1)init.rc脚本文件的分析与执行
         解析此脚本,设置系统环境,记录待处理的进程。生成service_list与action_list相关的列表。动作列表用来创建目录,以及为某些特定文件指定权限。服务列表用来记录初始化程序需要启动的一些程序。
   动作列表与服务列表通过drain_action_queue()函数来运行
(2)创建设备节点文件
   android应用程序通过设备驱动访问硬件,设备节点文件是设备驱动的逻辑文件,应用程序使用设备节点文件来访问设备驱动程序。要创建设备节点,需要遵循android提供的创建设备节点的方法:静态和动态
静态创建
  Linux中,运行所需的设备节点文件是预先定义再/dev目录下,应用程序无需经过其他步骤,通过事先定义好的设备节点文件即可访问设备驱动。再android系统的根文件系统不存再/dev目录,因此系统运行中,需要一个进程来创建设备节点文件,而此进程就是init进程。
  init进程通过两种方式创建设备节点文件,第一种,以预先定义好的设备信息为基础,当init进程启动时,统一创建设备节点文件; 第二种,在系统运行中,当有设备插入usb端口时,init进程就会接收到这一事件,为插入的设备动态创建设备节点文件。
  第一种方法是连接已定义的设备,称为冷拔插;而第二种方法是在系统运行的状态下连接设备,称为热拔插。

创建节点文件
  linux通过mknod使用程序创建设备节点文件。linux引入udev使用程序,udev以守护进程的形式运行,当设备驱动被加载时,它会掌握主设备号,次设备号,以及设备类型,而后再/dev下创建设备节点文件。
  下图为从加载驱动到udev创建设备节点文件的整个过程。再系统运行中,若某个设备被插入,内核就会加载与该设备相关的驱动程序,而后驱动调用驱动函数probe(),将主设备号,次设备号,以及设备类型保存到/sys文件系统中。然后发出uevent,并传递给udev守护进程。
  
 TIP: uevent 是内核向用户空间进程传递信息的信号系统,即在添加或删除设备时,内核使用uevent将设备信息传递到用户空间。uevent包含设备名称,类别,主设备号,次设备号,设备节点文件创建的目录等信息,并将这些信息传递给udev守护进程。udev守护进程监听uevent,当uevent发生时,它接受并读取其中的设备信息,而后创建设备节点文件。
   udev以守护进程的形式运行,通过监听分析内核发出的uevent,查看注册在/sys目录下的设备信息,而后在/dev目录相应位置创建设备节点文件。系统内核启动后,udev进程运行在用户空间内,它无法处理内核启动过程中发生的uevent。虽然内核空间内的设备驱动程序可以正常运行,但由于未创建访问设备驱动所需的设备节点文件,将会出现应用程序无法使用相关设备的问题。
   linux系统中,在udev守护进程运行前,通过提供与加载的设备驱动程序冷拔插机制,来解决设备节点文件没有被创建的问题。当插入设备时,热拔插机制会立即进行处理,而冷拔插与热拔插有着不同的处理机制。当内核启动后,冷拔插机制启动udev守护进程,从/sys目录下读取事先注册好的设备信息,而后引发与各设备相对应的uevent,创建设备节点文件。android也采用这种处理方式来创建设备节点文件,不同的是使用init进程来扮演udev守护进程的角色。
   android的binder驱动程序即是采用热插拔的方式创建设备节点的。Binder驱动是一个虚拟的设备,不存在物理硬件,被用在进程间的RPC。一个应用程序若想使用BInder,需要通过/dev/binder设备节点来访问Binder驱动程序。
   当内核启动时,BInder驱动程序在初始化函数misc_register()函数中,将创建设备节点文件所需的信息保存到/sys目录下。由于Binder驱动程序应该由用户级进程init创建设备节点文件,但由于系统处于内核启动,无法发生uevent,因此仅仅向/sys目录注册驱动程序信息,而后创建设备节点文件。
   内核启动完毕后,init进程启动,对于像binder驱动程序这样无法创建设备节点的驱动,将采用冷拔插方式进行处理,init进程事先获知等待冷拔插处理的驱动程序,并事先定义好各驱动程序的设备节点文件(在android中,/system/core/init/device.c中列出了init进程创建的节点文件目录)。然后调用mknod()创建设备节点文件。

动态创建
   热插拔由init的事件处理循环来完成。

(3)进程的终止再启动
   init进程读取并分析init.rc文件,后的服务列表,而后从列表中依次启动服务子进程。init启动的主进程如下:
    sh 搭载android的机器终端,连接串口或adbd时,提供控制台输入输出的shell程序
    adbd 调试服务
    servicemanager 用来管理系统中的服务。
    vold 用来挂载/管理USB存储或SD卡设备
    playmp3 在android启动时,输出声音。
   除了上述进程外,还启动了其他多种进程。若init启动某进程终止,会对系统运行产生影响,则init进程会重新启动它们。

(4)属性服务
   属性变更请求是init事件处理循环处理的另一个事件。在android平台中,为了让运行中的所有进程共享系统运行时所需要的各种设置值,系统开辟了属性存储区域,并提供了访问该区域的api。在android平台中,属性服务得到了系统的应用,再访问属性值时,添加了访问权限控制,增强了访问的安全性。系统忠所有运行忠的进程都可以访问属性值,但仅由init进程才能修改属性值。其他进程修改属性值时,需要向init进程发送请求,最终由init进程负责修改属性值。init进程会检查各属性访问权限,而后修改。当属性更改后,若定义在init.rc文件中的某个特定条件得到满足,则与次条件相匹配的动作就会发生。每个动作都有一个触发器(trigger),它决定动作的执行时间,记录在on property 关键字后的命令就会被执行。
   下面是init进程与其他进程在访问病修改属性值的大致情形:

    属性值被android存放在一块共享内存中,作为ashmem(android shared memory)。












































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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值