Android复习Android底层源码分析_Binder.docxVIP

Android复习Android底层源码分析_Binder.docx

  1. 1、本文档共5页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
一、总体概述 Binder采用的是CS服务的机制,提供服务的成为Server进程而访问服务的进程成为Client进程。同一个Server进程可以同时运行多个组件来向Client进程提供服务,这些组件称为Service组件;同时一个Client进程也可以同时向多个Service组件请求服务,每次请求都对应一个Cilent组件。Server进程和Client进程之间的通信要依靠运行在内核控件的Binder驱动程序来进行,Binder驱动程序向用户控件暴露了一个设备文件/dev/binder,使得应用程序进程可以间接的通过它来建立通信信道。Service组件在启动时,会将自己注册到一个ServiceManager中,以便Client组件通过ServiceManager来找到他,可以说ServiceManager是一个上下文的管理者。 二、基础数据结构 binder_work:表示一个工作项 binder_node:表示一个Binder实体对象,每一个Service组件在Binder驱动程序中都对应一个Binder实体对象,用来描述他在内核中的状态,Binder驱动程序通过强引计数和弱引用计数来维护它的生命周期。它是存在一个宿主进程中的,宿主进程中用一个红黑树来维护它内部所有的Binder实体对象,它可能会被多个Client组件所引用,所以它内部使用一个hash列表来保存引用了它的Binder引用对象。它内部的成员变量ptr和cookie用来描述一个用户空间的Service组件。 binder_ref:表示一个Binder引用对象,每一个Client组件在Binder驱动程序中都对应一个Binder引用对象,用来描述它在内核中的状态,Binder驱动程序通过强引计数和弱引用计数来维护它的生命周期。成员变量node是用来描述一个Binder引用对象所引用的Binder实体对象的。binder_ref内部有一个desc变量是一个描述符,在Client进程的用户空间中,一个Binder引用对象是使用一个句柄值来描述的。当Client进程的用户空间通过Binder驱动来访问一个Service组件时,只需要指定一个句柄值,通过它来找到Binder引用对象,在从上面提到的node中就可以找到对应的实体对象,然后就可以通过实体对象找到要访问的Service组件。 binder_buffer:用来描述一个内核缓冲区,它是用来在进程间传递数据的。每一个使用Binder进程间通讯机制的进程在Binder驱动程序中都有一个内核缓冲区列表,用来保存Binder驱动程序为它所分配的内核缓冲区,而这个成员变量entry正是这个内核缓冲区列表中的一个节点。同时进程有使用了两个红黑树分别保存正在使用的内核缓冲区和空闲的内核缓冲区。 transaction和target_node事用来描述一个内核缓冲区正在交给哪个事物以及哪一个Binder实体来使用。 binder_proc:用来描述一个正在使用Binder进程间通信机制的进程。当一个进程调用函数open来打开设备文件/dev/binder是,Binder驱动程序就会为它创建一个binder_proc结构体,并且将它保存在一个全局的hash列表中,而成员变量proc_node就正好是该hash列表中的一个节点。进程打开了设备文件/dev/binder后,还必须调用mmap将它映射到进程的地址空间中来,实际上是请求Binder驱动程序为它分配一块内核缓冲区,以便可以用来进程间传输数据。这些内核缓冲区实际上有两个地址,其中一个是内核空间地址,另一个是用户空间地址,内核控件地址是在Binder驱动程序内部使用的,保存在buffer中而用户空间是在应用程序进程中使用的,保存在成员变量vma中,这两个地址相差一个固定的保存下来的值,给定一个就可以计算出另一个的大小。他们实际上都是虚拟内存,对应的真正的物理内存保存在成员变量pages中,只有分配一个物理页面不够时才分配新的。 成员变量buffer指向的是一个大的内核缓冲区,Binder驱动为了方便对它的管理,把它划分为若干小块,就是使用binder_buffer结构来描述的,而buffers指向的是该列表的头部,列表中有正在使用的,即已经分配了物理页面也有未使用的,没有分配物理页面,分别组织在两个红黑树中。每一个使用了Binder进程间通信机制的进程都有一个线程池,用来处理进程间通信请求,binder_proc成员变量threads指向了一个红黑树的根节点,以线程ID为关键字来组织一个进程的Binder线程池。 一个进程内部包含了一系列的Binder实体对象和Binder引用对象,进程使用三个红黑树来组织他们。 Binder驱动程序为进程分配内核缓冲区时,会为这个内核缓冲

文档评论(0)

153****9772 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档