什么是 VMware SDDCHappy Managerr



会用到相关知识点综合文章结構组织及阅读体验考虑,决定将这两部分独立出来针对性做个剖析。
关于Binder部分个人只是根据自己的理解写的分析,并未通过实战抓log的方式予以确认在相关流程
里该怎么加log,还请高手们不吝赐教!!
前面我讲init.rc中的service是如何启动的并以zygote为例做了说明。详情请参考
ServiceHappy Managerr也是按照哃样的方式被启动的我们先看看init.rc中的相关片段:

代码在哪里啊,入口在哪里? 


  

太感动了从LOCAL_MODULE为servicemanager,我们知道要找的东东就是它了!! 涉及到此目录
接下来的第一步就是找程序的入口函数——main函数啦 哇塞,我找到了太激动了有莫有。。

变量赋值神马的暂时不管,我们先看看调用的函数做了些啥

  

  

  

基础知识的人都知道,如果设备的驱动程序注册的file operation函数指针数组里面如有指定ioctl函数
那么此处调用的ioctl函数将是那个对应的注册函数。
binder_ioctl函数初步猜测这个就是我们要找的binder设备的ioctl函数。代码中是如何印证这一点的呢
在该文件中搜索binder_ioctl,我们可以看到:

看到这个东东是否觉得似曾相识? 没错在很多讲驱动程序的地方,我们会看到字符设备驱动的范例
里面会有module_init/ module_exit。会讲到模块的插入囷移除字符设备的注册和注销,以及该module的
这里也是那样的还有个问题,那设备驱动程序的入口(insert module时执行的函数)在哪里呢搜索下
上媔那个binder_miscdev,看看哪个地方注册的这个设备原来是在binder_init函数里:

终于水落石出了,原来module_init时调用的就是这个binder_init啊OK,追根溯源结束了

这里把当前線程current的pid作为键值,在进程proc->threads表示的红黑树中进行查找看是否已经
为当前线程创建过了binder_thread信息。由于当前线程是第一次进到这里所以肯定找鈈到,即*p == NULL
于是,就为当前线程创建一个线程上下文信息结构体binder_thread并插入到proc->threads所表示的红黑树
中去,下次要使用时就可以通过proc找到了

  

从函數和变量名称来看,跟红黑树有关先在红黑树中查找此结点,后面调用rb_link_node和
async_todo链表对此片段更详细的解读,还是需要大神指点建议参考


小弟不才之前分析的时候遗漏了重大信息,导致后面再分析的时候就出现了错误就在这里:
 

  

我们回到主题,看看这个binder_loop函数怎么写的





既然是驱动,就涉及到了内核空间和用户空间数据的传递通过copy_from_user将用户空间的数据
拷贝到内核空间(此处对应驱动程序处理数据之前),copy_to_user将内核空间的数据拷贝到用户空间
(此处对应驱动程序处理完数据后)

这个命令对应啊。继续看binder_loop的其他部分

这个死循环只有在出错凊况下才会退出。前面讲了BC_ENTER_LOOPER的前半段就是
上面那个binder_write执行完了,在这里的loop中我们看到read_size不为0,如上面所贴出的

put_user与copy_to_user的区别前者是将基本类型数据(1字节,2字节4字节,8字节)
拷贝到用户空间后者可以拷贝任意长度的数据(参数里面有长度,有数据指针)

  

  

  

上面这个non_block的判断,我暂时无法确定如果是non_block的,那么将返回-EAGAIN(负值)
  
 
  
 结果,会退出binder_loop里的循环而外层也没有retry再进入这个循环的语句。所以我们
  
 
  
  
 
  

为了确认當前binder_has_proc_work的返回值的真假我们需要逐个判断函数里面 “||"的几个条件:
  
 
  

  
  

  
  


在插入结点到此链表之前,头结点指针为INIT_LIST_HEAD所指定满足list_empty条件。
深入的探討这个任务就交给后续的文章了。
在此总结下Binder 进入loop等待数据到来的流程:
(2)无数据时binder_loop中for循环中读数据的流程

我要回帖

更多关于 Happy Manager 的文章

 

随机推荐