Binder的学习与理解笔记之二:c++层的调用

接上一章:Binder的学习与理解笔记之一:总体印象
https://blog.csdn.net/kcstrong/article/details/80321207
整理一下c++层Binder的实现,所涉及类包括:ProcessState、IPCProcessThread、BpBinder
1.还记得上一章提到的ProcessState承接java层 BinderInternal类获得Binder对象的功能
ProcessState是一个单例,通过提供self方法对外开放调用,来看一下它的初始化
// frameworks/native/libs/binder/ProcessState.cpp

实现了两个重要功能:open_driver--打开binder、mmap--分配内存
它的getContextObject方法及后续实现:



可以得到几个结论:
a.最终调用到IPCThreadState中的transact方法
b.返回值为BpBinder类型


2.下面看一下IPCThreadState中
IPCThreadState通过self访问,区别于ProcessState是进程单实例,IPCThreadState是线程单实例,希望了解怎么实现的可以看一下IPCThreadState::self的实现
从上一章可知,BpBinder的transact最终也调至IPCThreadState的transact
好,看一下IPCThreadState::transact的实现:


waitForResponse有两个重要功能:
a.talkWithDriver
b.若没有收到返回数据,阻塞当前线程并待
talkWithDriver中的处理如下:

通过ioctl调至Binder的驱动层,Binder驱动层的代码及调用过程在此不作详细描述,在本例中,达到的效果为:挂起当前进程的处理,唤醒ServiceManager,告知ServiceManager要执行的业务逻辑为获取指定进程的Binder对象,在ServiceManager处理完毕后,将ServiceManager睡眠,唤起当前进程,向当前进程的共享内存块中填入处理后的数据。
处理完毕后返回到waitForResponse:
组装数据,然后goto finish
处理完毕后,回到了:
红框所标的语名执行完毕,从reply中可以获得binder
整个过程就结束了。

猜你喜欢

转载自blog.csdn.net/kcstrong/article/details/80333124