2022年Android的IPC机制Binder的各个部分 .pdf
《2022年Android的IPC机制Binder的各个部分 .pdf》由会员分享,可在线阅读,更多相关《2022年Android的IPC机制Binder的各个部分 .pdf(11页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、Android 的 IPC 机制 Binder 的各个部分第一部分Binder的组成1.1 驱动程序部分驱动程序的部分在以下的文件夹中:kernel/include/linux/binder.hkernel/drivers/android/binder.cbinder 驱 动 程 序 是 一 个miscdevice , 主 设 备 号 为10 , 此 设 备 号 使 用 动 态 获 得(MISC_DYNAMIC_MINOR) ,其设备的节点为:/dev/binderbinder 驱动程序会在proc 文件系统中建立自己的信息,其文件夹为/proc/binde,其中包含如下内容:proc 目录:
2、调用Binder 各个进程的内容state 文件:使用函数binder_read_proc_state stats 文件:使用函数binder_read_proc_stats transactions 文件:使用函数binder_read_proc_transactions transaction_log文 件 : 使 用 函 数binder_read_proc_transaction_log, 其 参 数 为binder_transaction_log ( 类型为 struct binder_transaction_log) failed_transaction_log 文件:使用函数bin
3、der_read_proc_transaction_log 其参数为binder_transaction_log_failed ( 类型为 struct binder_transaction_log) 在 binder 文件被打开后,其私有数据(private_data)的类型:struct binder_proc在这个数据结构中,主要包含了当前进程、进程ID 、内存映射信息、Binder 的统计信息和线程信息等。在用户空间对Binder 驱动程序进行控制主要使用的接口是mmap、poll 和 ioctl,ioctl 主要使用的ID 为:#define BINDER_WRITE_READ _I
4、OWR(b, 1, struct binder_write_read) #define BINDER_SET_IDLE_TIMEOUT _IOW(b, 3, int64_t) #define BINDER_SET_MAX_THREADS _IOW(b, 5, size_t) #define BINDER_SET_IDLE_PRIORITY _IOW(b, 6, int) #define BINDER_SET_CONTEXT_MGR _IOW(b, 7, int) #define BINDER_THREAD_EXIT _IOW(b, 8, int) #define BINDER_VERSION
5、_IOWR(b, 9, struct binder_version)BR_XXX 等宏为 BinderDriverReturnProtocol ,表示 Binder 驱动返回协议。BC_XXX 等宏为 BinderDriverCommandProtocol ,表示 Binder 驱动命令协议。binder_thread 是 Binder 驱动程序中使用的另外一个重要的数据结构,数据结构的定义如下所示:struct binder_thread struct binder_proc *proc; struct rb_node rb_node; 名师资料总结 - - -精品资料欢迎下载 - - -
6、- - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 11 页 - - - - - - - - - int pid; int looper; struct binder_transaction *transaction_stack; struct list_head todo; uint32_t return_error; uint32_t return_error2; wait_queue_head_t wait; struct binder_stats stats; ;binder_thread 的各个成员信息是从rb_nod
7、e 中得出。BINDER_WRITE_READ是最重要的ioctl,它使用一个数据结构binder_write_read 定义读写的数据。struct binder_write_read signed long write_size; signed long write_consumed; unsigned long write_buffer; signed long read_size; signed long read_consumed; unsigned long read_buffer; ; 1.2 servicemanager 部分 servicemanager 是一个守护进程,用于
8、这个进程的和/dev/binder通讯,从而达到管理系统中各个服务的作用。可执行程序的路径:/system/bin/servicemanager开源版本文件的路径:frameworks/base/cmds/servicemanager/binder.h frameworks/base/cmds/servicemanager/binder.c frameworks/base/cmds/servicemanager/service_manager.c程序执行的流程:open():打开 binder 驱动mmap():映射一个128*1024 字节的内存ioctl(BINDER_SET_CONTEX
9、T_MGR):设置上下文为mgr 进入主循环binder_loop() ioctl(BINDER_WRITE_READ),读取 binder_parse()进入 binder 处理过程循环处理 binder_parse()的处理,调用返回值:当处理BR_TRANSACTION的时候,调用svcmgr_handler() 处理增加服务、检查服务等工作。各种服务存放在一个链表(svclist)中。其中调用binder_等开头的函数,又会调用ioctl 的各种命令。处理 BR_REPLY 的时候,填充binder_io 类型的数据结名师资料总结 - - -精品资料欢迎下载 - - - - - - -
10、 - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 11 页 - - - - - - - - - 1.3 binder的库的部分 binder相关的文件作为Android的 utils库的一部分,这个库编译后的名称为libutils.so,是 Android系统中的一个公共库。主要文件的路径如下所示:frameworks/base/include/utils/* frameworks/base/libs/utils/*主要的类为:RefBase.h :引用计数,定义类RefBase。Parcel.h :为在 IPC 中传输的数据定义容器,定义
11、类ParcelIBinder.h :Binder 对象的抽象接口,定义类 IBinderBinder.h :Binder 对象的基本功能,定义类 Binder 和 BpRefBaseBpBinder.h :BpBinder 的功能,定义类BpBinderIInterface.h :为抽象经过Binder 的接口定义通用类,定义类 IInterface ,类模板 BnInterface ,类模板 BpInterfaceProcessState.h表示进程状态的类,定义类ProcessStateIPCThreadState.h表示 IPC 线程的状态,定义类IPCThreadState各个类之间的
12、关系如下所示:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 11 页 - - - - - - - - - 在 IInterface.h中定义的BnInterface和 BpInterface是两个重要的模版,这是为各种程序中使用的。BnInterface模版的定义如下所示:template class BnInterface : public INTERFACE, public BBinder public: virtual sp queryLocalInterface
13、(const String16& _descriptor); virtual String16 getInterfaceDescriptor() const; protected: virtual IBinder* onAsBinder(); ; BnInterface模版的定义如下所示:template class BpInterface : public INTERFACE, public BpRefBase public: BpInterface(const sp& remote); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - -
14、 - - 名师精心整理 - - - - - - - 第 4 页,共 11 页 - - - - - - - - - protected: virtual IBinder* onAsBinder(); ; 这两个模版在使用的时候,起到得作用实际上都是双继承:使用者定义一个接口INTERFACE ,然后使用BnInterface和 BpInterface两个模版结合自己的接口,构建自己的BnXXX和 BpXXX两个类。 DECLARE_META_INTERFACE和 IMPLEMENT_META_INTERFACE两个宏用于帮助BpXXX类的实现:#define DECLARE_META_INTER
15、FACE(INTERFACE) static const String16 descriptor; static sp asInterface(const sp& obj); #define IMPLEMENT_META_INTERFACE(INTERFACE, NAME) const String16 I#INTERFACE:descriptor(NAME); String16 I#INTERFACE:getInterfaceDescriptor() const return I#INTERFACE:descriptor; sp I#INTERFACE:asInterface(const s
16、p& obj) sp intr; if (obj != NULL) intr = static_cast( obj-queryLocalInterface( I#INTERFACE:descriptor).get(); if (intr = NULL) intr = new Bp#INTERFACE(obj); return intr; 在 定 义 自 己 的 类 的 时 候 , 只 需 要 使 用DECLARE_META_INTERFACE和IMPLEMENT_META_INTERFACE两个接口,并结合类的名称,就可以实现BpInterface中的asInterface()和 getInt
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2022年Android的IPC机制Binder的各个部分 2022 Android IPC 机制 Binder 各个 部分
限制150内