linux内存空间与BInder Driver

Android进程和linux进程一样,他们只运行在进程固有的虚拟空间中。一个4GB的虚拟地址空间,其中3GB是用户空间,1GB是内核空间 ,用户空间是非共享的,内核空间是共享的,如下图:

linux本身就提供了IPC工具,但是android中的Binder功能更丰富,不仅可以用来实现进程件的IPC通信,还可以用来调用另一个进程的函数,支持RPC操作,Binder使用运行在内科空间中的抽象驱动程序Binder(IPC) Driver,来实现进程间的通信,如下图:

Android使用Binder机制的原因有两个:

1.首先Binder采用了linux的优秀的内存管理技术,在通过内科空间传递数据时,能保证数据的正确性。

2.使用用户空间无法访问的内存空间来交换数据,保证了IPC的安全性

Android Binder Model

介绍一个Surface Flinger服务的使用,进程A与进程B分别调用Surace Flinfer服务,统一生成显示画面,如下图:

服务客户端通过Binder Driver将IPC数据传递到Service Server,实现跨进程调用,如下图:

IPC数据由4部分构成,如下图:

上图中,handle实质的服务号,用来区分不同的服务。RPC代码和RPC数据分别表示待调用的函数和待调的函数参数。Binder协议表示IPC数据的处理方法。

Binder IPC的数据传递

传递过程如下图所示:

Binder尝试RPC操作的时候,会进行Open()调用,Binder Driver的文件描述符,而后通过mmap()系统调用,在内核中开辟一块区域,以便存放接收的IPC数据。最后,调用ioctl()函数,讲IPC数据作为参数,传递给Binder Driver。ioctl命令的格式:

ioctl(文件描述符,ioctl命令,数据类型)

文件描述符是open()函数的返回值,后两个参数的介绍如下图:

Binder的数据流

Binder协议

Binder协议就是IPC数据的第四个参数,根据从IPC传递到Binder Driver和从Binder Driver传递到IPC层,分为两种,如下图:



RPC代码和RPC数据

如下图:

关于相关的鸡排你博客,链接如下:

Android的启动过程分析(从进程和Framework的角度
Android系统服务详解
Android的Context Manager(服务管理器)源码剖析

Binder寻址

分为三个过程:

1.Service Server会向Context Manager注册,发送IPC数据,BinderDriver生成节点编号和服务一一对应,以及Binder节点和Binder引用文件一一对应。

2.服务客户端向Context Manager发送IPC数据,查询服务的编号,这个编号和服务,以及Binder节点以及Binder引用一一对应。

3.服务客户端访问Service Server的服务,通过编号对应到Binder节点和服务,直接对Service Server进行访问

更多相关文章

  1. “罗永浩抖音首秀”销售数据的可视化大屏是怎么做出来的呢?
  2. Nginx系列教程(三)| 一文带你读懂Nginx的负载均衡
  3. 不吹不黑!GitHub 上帮助人们学习编码的 12 个资源,错过血亏...
  4. 一款霸榜 GitHub 的开源 Linux 资源监视器!
  5. Android(安卓)----SQLiteDate(Cursor接口)
  6. Java与C之间传递数据
  7. Android新手入门2016(8)--ListView之ArrayAdapter
  8. android视频监控的解决方案探讨
  9. Android开发之Serializable 和 Parcelable的区别(源代码分享)

随机推荐

  1. 【Android】Fragment懒加载和ViewPager的
  2. 关于Android长按出现复制粘贴栏在顶部占
  3. Android性能优化之过渡绘制
  4. Android - 软件自动更新的实现
  5. Android 中activity的启动方式和一些特定
  6. android将tab选项卡放在底部
  7. 资源—— 读取assets目录下的文件详细介
  8. Android 收集崩溃信息并上传
  9. Android 中 ListView 分页加载数据
  10. Android消息机制之同步障碍机制和应用