前言:
我们在多篇文章 AIDL进程间通信 Service主动修改Activity视图之回调传递 三(附github源码)、最简单的Activity、Service进程间 AIDL通信指南二(附github源码)都讲到了binder,服务器端实现binder,客户端连接接收到binderProxy,那么binder底层的原理到底是什么?它是怎么实现跨进程通信的?
预备知识
1.binder_init()
初始化binder驱动
2.binder_open()
打开binder驱动
3.ioctl()
ioctl()函数详解
与binder驱动读写数据的系统调用
4.mmap
void* mmap ( void * addr , size_t len , int prot , int flags , int fd , off_t offset )
定义:映射文件描述符fd指定文件的 [off,off + len]区域至调用进程的[addr, addr + len]的内存区域
使用:首先在内核虚拟地址空间,申请一块与用户虚拟内存相同大小的内存;然后再申请1个page大小的物理内存,再将同一块物理内存分别映射到内核虚拟地址空间和用户虚拟内存空间,从而实现了用户空间的Buffer和内核空间的Buffer同步操作的功能。
binder交互过程
- 首先,把用户空间数据ubuf拷贝到内核空间bwr;
当bwr写缓存有数据,则执行binder_thread_write;当写失败则将bwr数据写回用户空间并退出; - 当bwr读缓存有数据,则执行binder_thread_read;当读失败则再将bwr数据写回用户空间并退出;
- 最后,把内核数据bwr拷贝到用户空间ubuf。