android之init进程-uevent

来源:互联网 发布:时时彩计算软件 编辑:程序博客网 时间:2024/04/28 06:42

 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.    
  6.    <span style="color:#ff0000;">include $(BUILD_EXECUTABLE</span>)  
  7.   
  8.    SYMLINKS := $(TARGET_ROOT_OUT)/sbin/ueventd  
  9.    $(SYMLINKS): INIT_BINARY := $(LOCAL_MODULE)  
  10.    $(SYMLINKS): $(LOCAL_INSTALLED_MODULE) $(LOCAL_PATH)/Android.mk  
  11.     @echo "Symlink: $@ -> ../$(INIT_BINARY)"  
  12.     @mkdir -p $(dir $@)  
  13.     @rm -rf $@  
  14.     </span><span style="font-size:18px;color:#ff0000;">$(hide) ln -sf ../$(INIT_BINARY) $@  
  15. </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.   
  3.   snprintf(tmp, sizeof(tmp), "/ueventd.%s.rc", hardware);  
  4.   ueventd_parse_config_file(tmp);  
  5.   
  6.   device_init();  
  7. </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

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 宽带连接被删了 怎么办 手机被偷了qq怎么办 手机丢了微信怎么办啊 手机店把手机修坏了怎么办 在手机店买到山寨机手机怎么办 有人在qq群上骂我怎么办 qq群一直有人骚扰怎么办 苹果手机QQ图标不在桌面上怎么办 苹果手机长按不能删除怎么办 qq发的图片过期怎么办 九黎八卦在仓库怎么办 飞猪f2领了万豪银卡没住怎么办 机械键盘摁键冲突怎么办 玩游戏键盘没反应怎么办 玩枪战游戏头晕恶心怎么办 手机看视频不能横屏怎么办 苹果手机安全码忘记了怎么办 信用卡安全码忘记了怎么办 联想电脑管家阻止我安装软件怎么办 word恢复后打开乱码怎么办 苹果手机局域网也登陆不了怎么办 剑三账号冻结7天怎么办 荒野行动无缘无故被限制时间怎么办 电脑打游戏闪屏怎么办 微信下载出现数据包出错怎么办 安卓平板闪退怎么办 剑侠世界2出了1怎么办 苹果手机有木马病毒删除不了怎么办 苹果手机病毒了怎么办【解决方法】 苹果手机点击病毒链接怎么办 苹果手机有病毒啦怎么办 苹果7p反复重启怎么办 苹果手机屏幕触屏不灵怎么办 苹果手机屏翘起来了怎么办 苹果x手机触屏失灵怎么办 苹果7手机变成黑白屏怎么办 苹果手机屏不动了怎么办 苹果6老是卡屏怎么办 苹果x卡屏死机怎么办 苹果6死机卡屏怎么办 苹果手机主屏死机怎么办