接口MemoryBase以接口MemoryHeapBase为基础,这两个接口都可以作为一个Binder对象在进程之间进行传输。因为接口MemoryHeapBase是一个Binder对象,所以拥有Server端对象(必须实现一个BnInterface接口)和Client端引用(必须要实现一个BpInterface接口)的概念。
1.在Server端实现
在Server端的实现过程中,接口MemoryHeapBase可以将所有涉及到的类分为如下的三种类型。
业务相关类:即与Ashmem操作相关的类,包括MemoryHeapBase、BnMemory Heap、IMemoryHeap。
Binder进程通信类:即和Binder进程通信机制相关的类,包括IInterface、BnInterface、IBinder、BBinder、ProcessState和IPCThreadState。
智能指针类:RefBase。
在上述三种类型中,Binder进程通信类和智能指针类将在本书后面的章节中进行讲解。在接口IMemoryBase中定义了操作Ashmem的几个方法,此接口在文件frameworks\native\include\binder\IMemory.h中定义,具体实现代码如下。
在上述定义代码中,有如下三个重要的成员函数。
getHeapID:功能是获得Ashmem块的打开文件描述符。
getBase:功能是获得Ashmem块的基地址,通过这个地址可以在程序里面直接访问这块共享内存。
getSize:功能是获得Ashmem块的大小。
类BnMemoryHeap是一个本地对象类,当Client端引用请求Server端对象执行命令时,Binder系统就会调用类BnMemoryHeap的成员函数onTransact执行具体的命令。函数onTransact在文件frameworks\native\libs\binder\IMemory.cpp中定义,具体实现代码如下。
类MemoryHeapBase继承了类BnMemoryHeap,作为Binder机制中的Server角色需要实现IMemoryBase接口,主要功能是实现类IMemoryBase中列出的成员函数,描述了一块Ashmem服务。类在文件frameworks\native\include\binder\MemoryHeapBase.h中定义,具体实现代码如下。
类MemoryHeapBase在文件frameworks\native\libs\binder\MemoryHeapBase.cpp中实现,其核心功能是包含了一块Ashmem。具体实现代码如下。
在上述代码中,各个参数的具体说明如下。
size:表示要创建的Ashmem的大小。
flags:设置这块Ashmem的属性,例如可读写、只读等。
name:此参数只是作为调试信息使用的,用于标识Ashmem的名字,可以是空值。
接下来看MemoryHeapBase的成员函数mapfd,其功能是将得到的Ashmem的文件描述符映射到进程地址空间。函数mapfd在文件frameworks\native\libs\binder\Memory HeapBase.cpp中定义,具体实现代码如下。
这样在调用个函数mapfd后,会进入到内核空间的Ashmem驱动程序模块中执行函数ashmem_map。
最后看成员函数getHeapID、getBase和getSize的具体实现,具体实现代码如下。
2.Client端实现(www.daowen.com)
在Client端的实现过程中,接口MemoryHeapBase可以将所有涉及到的类分为如下的三种类型。
业务相关类:即跟匿名共享内存操作相关的类,包括BpMemoryHeap、IMemoryHeap。
Binder进程通信类:即和Binder进程通信机制相关的类,包括IInterface、BpInterface、IBinder、BpBinder、ProcessState、BpRefBase和IPCThreadState。
智能指针类:RefBase。
在上述三种类型中,Binder进程通信类和智能指针类将在本书后面的章节中进行讲解,在本章将重点介绍业务相关类。
类BpMemoryHeap是类MemoryHeapBase在Client端进程的远接接口类,当Client端进程从Service Manager获得了一个MemoryHeapBase对象的引用后,会在本地创建一个BpMemoryHeap对象来表示这个引用。类BpMemoryHeap是从RefBase类继承下来的,也要实现IMemoryHeap接口,可以和智能指针结合来使用。
类BpMemoryHeap在文件frameworks\native\libs\binder\IMemory.cpp中定义,具体实现代码如下。
类BpMemoryHeap对应的构造函数是BpMemoryHeap,具体实现代码如下。
成员函数getHeapID、getBase和getSize的实现代码如下。
在使用上述成员函数之前,通过调用函数assertMapped来确保在Client端已经准备好了Ashmem。函数assertMapped在文件frameworks\native\libs\binder\IMemory.cpp中定义,具体实现代码如下。
类HeapCache在文件frameworks\native\libs\binder\IMemory.cpp中定义,具体实现代码如下。
在上述代码中定义了成员变量mHeapCache,功能是维护进程内的所有BpMemoryHeap对象。另外还提供了函数find_heap和函数get_heap来查找内部所维护的BpMemoryHeap对象,这两个函数的具体说明如下。
函数find_heap:如果在mHeapCache找不到相应的BpMemoryHeap对象,则把BpMemoryHeap对象加入到mHeapCache中。
函数get_heap:不会自动把BpMemoryHeap对象加入到mHeapCache中。
接下来看函数find_heap,首先以传进来的参数binder作为关键字在mHeapCache中查找,查找是否存在对应的heap_info对象info。
如果有:增加引用计数info.count的值,表示此BpBinder对象多了一个使用者。
如果没有:创建一个放到mHeapCache中的heap_info对象info。
函数find_heap在文件frameworks\native\libs\binder\IMemory.cpp中定义,具体实现代码如下。
由上述实现代码可知,函数find_heap是BpMemoryHeap的成员函数,能够调用了全局变量gHeapCache执行查找的操作。对应的实现代码如下。
通过调用函数find_heap得到BpMemoryHeap对象中的函数assertReallyMapped,这样可以确认它内部的Ashmem是否已经映射到进程空间。函数assertReallyMapped在文件frameworks\native\libs\binder\IMemory.cpp中定义,具体实现代码如下。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。