【Android】进程间通信——Binder


使用: 系统工程师应用工程师

引言

在这里插入图片描述Client,Server,Service Manager之间交互都是虚线表示,是由于它们彼此之间不是直接交互的,而是都通过与Binder驱动进行交互的

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

Binder驱动

在这里插入图片描述binder请求码,以”BC_“开头,简称BC码,用于从IPC层传递到Binder Driver层;
binder响应码,以”BR_“开头,简称BR码,用于从Binder Driver层传递到IPC层;

对于请求码为BC_TRANSACTION或BC_REPLY时,会执行binder_transaction()方法

ServiceManager

启动ServiceManager

在这里插入图片描述[-> service_manager.c] svcmgr_handler()
1.do_add_service//注册指定服务 2.do_find_service//根据名称查找相应服务
在这里插入图片描述
驱动设备的四大操作:初始化(binder_init),打开 (binder_open),映射(binder_mmap),数据操作(binder_ioctl)
在这里插入图片描述

内存机制:bind_mmap

虚拟进程地址空间(vm_area_struct)和虚拟内核地址空间(vm_struct)都映射到同一块物理内存空间。当Client端与Server端发送数据时,Client(作为数据发送端)先从自己的进程空间把IPC通信数据copy_from_user拷贝到内核空间,而Server端(作为数据接收端)与内核共享数据,不再需要拷贝数据,而是通过内存地址空间的偏移量,即可获悉内存地址,整个过程只发生一次内存拷贝
在这里插入图片描述

为何不直接让发送端和接收端直接映射到同一个物理空间,那样就连一次复制的操作都不需要了,0次复制操作那就与Linux标准内核的共享内存的IPC机制没有区别了,对于共享内存虽然效率高,但是对于多进程的同步问题比较复杂,而管道/消息队列等IPC需要复制2两次,效率较低

Binder在进程间数据通信的流程图,从图中更能明了Binder的内存转移关系。
在这里插入图片描述

获取ServiceManager

在这里插入图片描述由defaultServiceManager()返回的是BpServiceManager(单例)

  • 通过继承接口IServiceManager实现了接口中的业务逻辑函数;
  • 通过成员变量mRemote= new BpBinder(0)进行Binder通信工作
  • BpBinder通过handler来指向所对应BBinder, 在整个Binder系统中handle=0代表ServiceManager所对应的BBinder
    在这里插入图片描述
    getContextObject等价于new BpBinder(0);

defaultServiceManager 等价于 new BpServiceManager(new BpBinder(0));

ProcessState对象(单例)

  • 成员变量mDriverFD记录binder驱动的fd,用于访问binder设备
  • mmap的binder分配的默认内存大小为1M-8k,BINDER_VM_SIZE = (110241024) - (4096 *2),

服务注册

在这里插入图片描述

defaultServiceManager()
-> addService(String16("media.player"), new MediaPlayerService());
-> status_t err = remote()->transact(ADD_SERVICE_TRANSACTION, data, &reply);
-> status_t status = IPCThreadState::self()->transact(mHandle, code, data, reply, flags);

Binder代理类调用transact()方法,真正工作还是交给IPCThreadState来进行transact工作,

在这里插入图片描述

  • 1.MediaPlayerService进程调用ioctl()向Binder驱动发送IPC数据

在这里插入图片描述

  • 2.Binder驱动收到该Binder请求,生成BR_TRANSACTION命令,选择目标处理该请求的线程,即ServiceManager的binder线程
  • 3.Service Manager的线程调用服务注册函数将服务”media.player”注册到服务目录中。当服务注册完成后,生成IPC应答数据(BC_REPLY)
  • 3.Binder驱动收到该Binder应答请求,生成BR_REPLY命令。在MediaPlayerService收到该命令后,知道服务注册完成便可以正常使用

BC_TRANSACTION和BR_TRANSACTION过程是一个完整的事务过程;BC_REPLY和BR_REPLY是一个完整的事务过程

服务获取

getService()->循环5次checkService()
在这里插入图片描述其中remote()为BpBinder

->BpBinder::transact()->

status_t status = IPCThreadState::self()->transact(
            mHandle, code, data, reply, flags);
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

星空•物语

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值