android IBinder通信驱动(摘自《android深入浅出多媒体编程》)

来源:互联网 发布:微信点赞截图制作软件 编辑:程序博客网 时间:2024/05/17 03:36

在多进程环境下,应用程序和后台服务间通常会运行在不同的进程中,有着独立的地址空间,但是因为需要相互协作的原因,彼此间又必须进行通信和数据共享,而传统的进程间通信(IPCInternet Process Connection)却有着进程过载和安全漏洞等方面的风险,Binder的好处则在于在驱动层面即对进程间通信提供了支持、采用的共享内存机制提供了进程间通信的性能、采用了前置进程的线程池来处理进程请求、针对系统中的对象引入了引用计数机制和跨进程的对象引用映射机制、在进程间的同步调用。

                                      

为了进程进程间通信,Binder采用了AIDLAndroid Interface Definition Lanaguage)来描述进程间的接口。

在实际的实现中,Binder是作为一个特殊的字符型设备来存在的,其实现遵循Linux设备驱动模型,相关的主要代码位于aurora/msm/msm/drivers/staging/android/ binder.c文件中。

Binder驱动中,binder_thread_write()函数通过binder_transaction()函数来发送请求或返回结果,而binder_thread_read用于读取结果,主要通过binder_ioctl()与用户空间的进程交换数据

Binder的私有数据结构binder_proc则被用来记录当前进程、进程ID、内存映射信息、Binder的统计信息和线程信息等。

如果收到请求,binder_transaction()函数会通过对象的handle找到对象所在的进程,如果handle为空就认为对象是 context_mgr,把请求发给context_mgr所在的进程。然后请求中所有的Binder对象全部放到一个RB树中。最后把请求放到目标进程的队列中,等待目标进程读取。数据的解析工作放在binder_parse()中实现。

 

 

一种IPC通信方式。

原文地址:http://miaozl.spaces.live.com/blog/cns!F408F266382E09FE!933.entry

原创粉丝点击