linux内存空间与BInder Driver

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

Android Binder IPC详解-Android学习之旅(96)-LMLPHP

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

Android Binder IPC详解-Android学习之旅(96)-LMLPHP

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

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

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

Android Binder Model

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

Android Binder IPC详解-Android学习之旅(96)-LMLPHP

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

Android Binder IPC详解-Android学习之旅(96)-LMLPHP

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

Android Binder IPC详解-Android学习之旅(96)-LMLPHP

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

Binder IPC的数据传递

传递过程如下图所示:

Android Binder IPC详解-Android学习之旅(96)-LMLPHP

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

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

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

Android Binder IPC详解-Android学习之旅(96)-LMLPHP

Binder的数据流

Android Binder IPC详解-Android学习之旅(96)-LMLPHP

Binder协议

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

Android Binder IPC详解-Android学习之旅(96)-LMLPHP

Android Binder IPC详解-Android学习之旅(96)-LMLPHP

Android Binder IPC详解-Android学习之旅(96)-LMLPHP

RPC代码和RPC数据

如下图:

Android Binder IPC详解-Android学习之旅(96)-LMLPHP

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

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进行访问

05-02 01:05