android之init进程-uevent

转载!

Init是linux kernel启动的第一个进程,理解init,对熟悉android系统非常重要。

Android的每个目录下面都有一个非常重要的文件Android.mk,负责编译该目录下面的代码。

System/core/init/android.mk

[cpp] view plaincopy

  1. <span style="font-size:18px;"> </span><span style="font-size:18px;"><span style="color:#ff0000;">LOCAL_MODULE:= init
  2. </span>
  3. LOCAL_FORCE_STATIC_EXECUTABLE := true
  4. LOCAL_MODULE_PATH := $(TARGET_ROOT_OUT)
  5. <span style="color:#ff0000;">include $(BUILD_EXECUTABLE</span>)
  6. SYMLINKS := $(TARGET_ROOT_OUT)/sbin/ueventd
  7. $(SYMLINKS): INIT_BINARY := $(LOCAL_MODULE)
  8. $(SYMLINKS): $(LOCAL_INSTALLED_MODULE) $(LOCAL_PATH)/Android.mk
  9. @echo "Symlink: [email protected] -> ../$(INIT_BINARY)"
  10. @mkdir -p $(dir [email protected])
  11. @rm -rf [email protected]
  12. </span><span style="font-size:18px;color:#ff0000;">$(hide) ln -sf ../$(INIT_BINARY) [email protected]
  13. </span>

上面的代码会生成一个叫init的可执行程序,它会被放在/下面,且同时    会产生一个符号链接/sbin/eventd,指向/init. 我们不禁要问,为什么这样做?

Init是一个脚本解释器,它会对目标系统下的两个文件解析,

/init.rc

/init.xxx.rc (xxx代表平台平台名)

先看看源代码目录/device/xxx/init.rc

[cpp] view plaincopy

  1. <span style="font-size:18px;">  on early-init
  2. start ueventd
  3. </span>

看来init在解析脚本的时候又启动了一个自己的进程,只是进程名变成了ueventd.

System/core/init/init.c/main

[cpp] view plaincopy

  1. <span style="font-size:18px;">  if (!strcmp(basename(argv[0]), "ueventd"))
  2. return ueventd_main(argc, argv);
  3. </span>

根据进程名不同,程序执行路径不同。Ueventd顾名思义应该是接收uvent的守护进程,这里它的主要作用根据uevent是创建或删除/dev/xxx(xxx设备名),我们知道在linux下面创建设备节点的接口mknod,我们跟进去看看这个接口是在哪里调用的

System/core/init/Ueventd.c/ueventd_main

[cpp] view plaincopy

  1. <span style="font-size:18px;">ueventd_parse_config_file("/ueventd.rc");
  2. snprintf(tmp, sizeof(tmp), "/ueventd.%s.rc", hardware);
  3. ueventd_parse_config_file(tmp);
  4. device_init();
  5. </span>

ueventd有两个脚本需要解析,ueventd.rc,ueventd.xxx.rc,脚本,又见脚本这个脚本可以让客户设置/dev 或 /sys目录及子目录的权限.

system/core/rootdir/ueventd.rc

[cpp] view plaincopy

  1. <span style="font-size:18px;">  /dev/binder               0666   root       root</span>

这里请注意,ueventd_parse_config_file并不创建设备节点,它的作用是提供数据库,当有设备节点生成的时候,eventd会参考这个数据库设置设备节点的权限。

system/core/init/devices.c/device_init

[cpp] view plaincopy

  1. <span style="font-size:18px;"> device_fd = open_uevent_socket();
  2. coldboot("/sys/class");
  3. coldboot("/sys/block");
  4. coldboot("/sys/devices");
  5. </span>

这个函数很简单,主要是创建了uevent的socket handle,同时触发/sys/clas,/sys/block,/sys/devices这三个目录及其子目录下的uevent,然后接受并创建设备节点,至此设备节点才算创建,coldboot里面有个很有意思的函数do_coldboot,这是一个递归调用函数,实现的很有意思,大家可以看看.

system/core/init/Ueventd.c/ueventd_main

[cpp] view plaincopy

  1. <span style="font-size:18px;">  while(1) {
  2. ufd.revents = 0;
  3. nr = poll(&ufd, 1, -1);
  4. if (nr <= 0)
  5. continue;
  6. if (ufd.revents == POLLIN)
  7. handle_device_fd();
  8. }
  9. </span>

死循环,接受kernel传过来的uevent,动态创建或删除节点.

handle_device_fd会最终调用mknod创建设备节点,流程如下:

handle_device_fd-> handle_device_event-> make_device-> mknod

时间: 2024-10-07 01:58:05

android之init进程-uevent的相关文章

Android之init进程分析(1)

本文介绍init进程中的action触发方式 一,什么是action 在android中,使用action来管理并执行命令.action是一个数据结构,里面包含了命令集合command,action的名字等.Android系统通过action来执行一组命令. struct action { /* node in list of all actions */ struct listnode alist; /* node in the queue of pending actions */ stru

android init进程分析

android的init进程用来启动zygote进程,用来启动android世界.init进程的源码在顶层目录的/system/core/init使用 find -name Android.mk -exec grep -l "init" {} \;来查找源码,接下来的android服务程序也是使用这个指令来查找源码. /system/core/init/init.c 整个init进程的入口函数669 int main(int argc, char **argv) init_parse_

Android Init进程命令的执行和服务的启动

这里开始分析init进程中配置文件的解析,在配置文件中的命令的执行和服务的启动. 首先init是一个可执行文件,它的对应的Makfile是init/Android.mk. Android.mk定义了init程序在编译的时候,使用了哪些源码,以及生成方式.当init程序生成之后,最终会放到/init,即根目录的init文件.通常所说的init进程就是执行这个init程序. 执行这个init程序的代码是在KERNEL/init/main.c文件中的kernel_init()函数里,当kernel把一

Android之rild进程启动源码分析

Android 电话系统框架介绍 在android系统中rild运行在AP上,AP上的应用通过rild发送AT指令给BP,BP接收到信息后又通过rild传送给AP.AP与BP之间有两种通信方式: 1.Solicited Response:Ap向Bp发送请求,Bp给Ap发送回复,该类型的AT指令及其回调函数以数组的形式存放在Ril_commands.h文件中: {数组中的索引号,请求回调函数,响应回调函数} [plain] view plaincopy {0, NULL, NULL},      

Android init进程概述

init进程,其程序位于根文件系统中,在kernle自行启动后,其中的 start_kernel 函数把根文件系统挂载到/目录后,在 rest_init 函数中通过 kernel_thread(kernel_init, NULL, CLONE_FS | CLONE_SIGHAND); 建立PID为1的内核进程,随后调用 run_init_process 来加载boot分区中根文件系统里的init程序来跳转到用户空间运行.init是第一个运行在用户空间的进程.之后很多的系统服务都由init进程fo

Android init进程——属性服务

目录 目录 概述 属性服务 属性服务初始化 创建存储空间 __system_property_area_init init_workspace 客户端进程访问属性内存区域 属性服务器的分析 启动属性服务器 服务端处理设置属性请求 客户端发送请求 概述 init是一个进程,确切的说,它是Linux系统中用户空间的第一个进程.由于Android是基于Linux内核的,所以init也是Android系统中用户空间的第一个进程.init的进程号是1.作为天字第一号进程,init有很多重要的工作: ini

Android -- Init进程对信号的处理流程

Android -- Init进程对信号的处理流程 在Android中,当一个进程退出(exit())时,会向它的父进程发送一个SIGCHLD信号.父进程收到该信号后,会释放分配给该子进程的系统资源:并且父进程需要调用wait()或waitpid()等待子进程结束.如果父进程没有做这种处理,且父进程初始化时也没有调用signal(SIGCHLD, SIG_IGN)来显示忽略对SIGCHLD的处理,这时子进程将一直保持当前的退出状态,不会完全退出.这样的子进程不能被调度,所做的只是在进程列表中占据

android init进程分析 init脚本解析和处理

(懒人近期想起我还有csdn好久没打理了.这个android init躺在我的草稿箱中快5年了.略微改改发出来吧) RC文件格式 rc文件是linux中常见的启动载入阶段运行的文件.rc是run commands的缩写.基本上能够理解为在启动阶段运行的一些列命令.android init进程启动时,也会运行此启动脚本文件,init.rc.init.rc的写法稍有点复杂,具体可參考 /system/core/init下的readme文件.脚本基本组成是由四类,为: commands: 命令 act

Android Framework学习(一)之init进程解析

init进程是Android系统中用户空间的第一个进程,它被赋予了很多极其重要的工作职责,init进程相关源码位于system/core/init,本篇博客我们就一起来学习init进程(基于Android 7.0). init入口函数分析 init的入口函数为main,位于system/core/init/init.cpp int main(int argc, char** argv) { if (!strcmp(basename(argv[0]), "ueventd")) { ret