android之init进程-uevent

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

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

   System/core/init/android.mk

[cpp]  view plain copy

  1.    LOCAL_FORCE_STATIC_EXECUTABLE := true  
  2.    LOCAL_MODULE_PATH := $(TARGET_ROOT_OUT)  
  3.   
  4.    SYMLINKS := $(TARGET_ROOT_OUT)/sbin/ueventd  
  5.    $(SYMLINKS): INIT_BINARY := $(LOCAL_MODULE)  
  6.    $(SYMLINKS): $(LOCAL_INSTALLED_MODULE) $(LOCAL_PATH)/Android.mk  
  7.     @echo "Symlink: $@ -> ../$(INIT_BINARY)"  
  8.     @mkdir -p $(dir $@)  
  9.     @rm -rf $@  


  

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

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

     /init.rc

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

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

[cpp]  view plain copy
  1.      start ueventd  

     

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

    

     System/core/init/init.c/main

[cpp]  view plain copy
  1. if (!strcmp(basename(argv[0]), "ueventd"))  
  2.         return ueventd_main(argc, argv);  

     

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

     

     System/core/init/Ueventd.c/ueventd_main

       

[cpp]  view plain copy
  1. ueventd_parse_config_file("/ueventd.rc");  
  2.   
  3.   snprintf(tmp, sizeof(tmp), "/ueventd.%s.rc", hardware);  
  4.   ueventd_parse_config_file(tmp);   
  5.   device_init();  


 

 

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

    system/core/rootdir/ueventd.rc 

[cpp]  view plain copy
  1. /dev/binder               0666   root       root</span>  

    

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

    

      system/core/init/devices.c/device_init

         

[cpp]  view plain copy
  1.    device_fd = open_uevent_socket();  
  2.    coldboot("/sys/class");  
  3.    coldboot("/sys/block");  
  4.    coldboot("/sys/devices");  


        

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

      

     system/core/init/Ueventd.c/ueventd_main  

[cpp]  view plain copy
  1.  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.     }


 

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

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

      handle_device_fd-> handle_device_event-> make_device-> mknod

    

      over.

      

       

         

    


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值