主题 : Android:Binder驱动的原理和实现
取我所需的坦荡,即使病入膏肓
级别: 五分秋意
UID: 76075
精华: 0
发帖: 1382
威望: 4765 点
无痕币: 4174 WHB
贡献值: 2 点
在线时间: 148(时)
注册时间: 2009-01-01
最后登录: 2018-01-24

0 Android:Binder驱动的原理和实现

 一、Binder驱动的原理  为了完成进程间通信,Binder采用了AIDL(Android Interface Definition Language)来描述进程间的接口。在实际的实现中,Binder是作为一个特殊的字符型设备而存在的,设备节点为/dev/binder,其实现遵循Linux设备驱动模型,实现代码主要涉及以下文件:
  kernel/drivers/staging/binder.h
  kernel/drivers/staging/binder.c
  在其驱动的实现过程中,主要通过binder_ioctl函数与用户空间的进程交换数据。BINDER_WRITE_READ用来读写数据,数据包中有一个cmd域用于区分不同的请求。binder_thread_write函数用于发送请求或返回结果,而binder_thread_read函数则用于读取结果。在binder_thread_write函数中调用binder_transaction函数来转发请求并返回结果。当收到请求时,binder_transaction函数会通过对象的handle找到对象所在的进程,如果handle为空,就认为对象是context_mgr,把请求发给context_mgr所在的进程。请求中所有的Binder对象全部放到一个RB树中,最后把请求放到目标进程的队列中,等待目标进程读取。数据的解析工作放在binder_parse()中实现;关于如何生成context_mgr,内核中提供了BINDER_SET_CONTEXT_ MGR命令来完成此项功能。下面我们就来看看Binder驱动究竟是如何实现的。
  二、Binder驱动的实现
  上面我们已经对Binder驱动的原理进行了分析,在开始分析驱动的实现之前,我们还是通过一个例子来说明Binder在实际应用中应该如何运用,以及它能帮我们解决什么样的问题。这样会更容易帮助大家理解Binder驱动的实现。比如,A进程如果要使用B进程的服务,B进程首先要注册此服务,A进程通过Binder获取该服务的hanlde,通过这个handle,A进程就可以使用该服务了。此外,你可以把handle理解成地址。A进程使用B进程的服务还意味着二者遵循相同的协议,这个协议反映在代码上就是二者要实现IBinder接口。
  1.“对象”与“引用”
  Binder不仅是Android系统中的一个完善的IPC机制,它也可以被当作Android系统的一种RPC(远程过程调用)机制,因为Binder的功能就是在本地“执行”其他进程的功能。因此,进程在通过Binder获取将要调用的进程服务时,可以是一个本地对象,也可以是一个远程服务的“引用”。这一点可能比较难以理解,稍候就会为大家分析,这里就先记住Binder不仅可以与本地进程通信,还可以与远程进程通信;这里的本地进程就是我们所说的本地对象,而远程进程则是我们所说的远程服务的一个“引用” 。[1]
  Binder的实质就是要把对象从一个进程映射到另一个进程中,而不管这个对象是本地的还是远程的。如果是本地对象,更好理解;如果是远程对象,就按照我们上面所讲的来理解,即将远程对象的“引用”从一个进程映射到另一个进程中,于是当使用这个远程对象时,实际上就是使用远程对象在本地的一个“引用”,类似于把这个远程对象当作一个本地对象在使用。这也就是Binder与其他IPC机制不同的地方。
  这个本地“对象”与远程对象的“引用”有什么不同呢?本地“对象”表示本地进程的地址空间的一个地址,而远程对象的“引用”则是一个抽象的32位句柄。它们之间是互斥的:所有的进程本地对象都是本地进程的一个地址(address、ptr、binder),所有的远程进程的对象的“引用”都是一个句柄。对于发送者进程来说,不管是“对象”还是“引用”,它都会认为被发送的Binder对象是一个远程对象的句柄(即远程对象的“引用”)。但是,当Binder对象的数据被发送到远端接收进程时,远端接收进程则会认为该Binder对象是一个本地对象地址(即本地对象)。正如我们之前说的,当Binder对象被接收进程接收后,不管该Binder对象是本地的还是远程的,它都会被当作一个本地进程来处理。因此,从第三方的角度来说,尽管名称不同,对于一次完整的Binder调用,都将指向同一个对象,Binder驱动则负责两种不同名称的对象的正确映射,这样才能把数据发送给正确的进程进行通信。这个映射关系也是进程间引用对象的基础,对一个对象的引用,在远程是句柄,在本地则是地址(即本地对象的地址)。
知足常乐
级别: 十方秋水

UID: 23
精华: 1
发帖: 261149
威望: 117162 点
无痕币: 2494 WHB
贡献值: 0 点
在线时间: 9392(时)
注册时间: 2007-11-24
最后登录: 2024-05-13

复制下来有时间看看。
事能知足心常乐 人到无求品自高
级别: 八片秋叶

UID: 3560
精华: 0
发帖: 19267
威望: 57475 点
无痕币: 17527 WHB
贡献值: 1 点
在线时间: 2467(时)
注册时间: 2007-12-10
最后登录: 2015-05-22

呵呵,看花眼。
千山同一月 万户尽皆春 千江有水千江月 万里无云万里天
级别: 总版主

UID: 998
精华: 0
发帖: 605058
威望: 529687 点
无痕币: 65 WHB
贡献值: 0 点
在线时间: 62585(时)
注册时间: 2008-12-25
最后登录: 2024-05-18

这个有点难度,学习就比较难的
取我所需的坦荡,即使病入膏肓
级别: 五分秋意
UID: 76075
精华: 0
发帖: 1382
威望: 4765 点
无痕币: 4174 WHB
贡献值: 2 点
在线时间: 148(时)
注册时间: 2009-01-01
最后登录: 2018-01-24

谢谢支持了哈

安卓 我一直很看好  

所以就在Linux区发个帖子 以后汇编在一起
选择秋无痕论坛别无选择
级别: 五分秋意
UID: 124602
精华: 0
发帖: 1254
威望: 8092 点
无痕币: 198 WHB
贡献值: 0 点
在线时间: 148(时)
注册时间: 2011-09-02
最后登录: 2014-02-14

看看学习学习
Total 0.055451(s) query 4, Time now is:05-18 12:12, Gzip enabled 粤ICP备07514325号-1
Powered by PHPWind v7.3.2 Certificate Code © 2003-13 秋无痕论坛