简介
同一个程序中的两个函数之间能直接调用的根本原因是处于相同的内存空间中,虚拟地址的映射规则完全一致,所以可以直接相互调用。而两个不同的进程,是没有办法通过内存地址来访问对方内部函数和变量的,既然无法直接访问对方进程的内容,这时就可以用到Binder来间接访问对方的内容。
binder主要分为一下四部分内容:
- Binder驱动
- Service Manager
- Binder Client
- Binder Server
智能指针概括
- Android中的智能指针是基于引用计数的强指针SP以及弱指针WP两种。
- 通常情况下目标对象的父类是RefBase,这个提高了weakrf_impl类型的引用计数,可以同时进行强弱引用的控制(内部由mStrong和mWeak提供计数)
- 当incStrong增加强引用时,也会增加弱引用。
- 当incWeak时只增加弱引用计数。
- 使用者可以通过extend ObjectLifetime设置引用计数的规则,不同规则下对删除目标对象的时机判断也是不一样的。
- 使用者可以根据程序需求来选择合适的智能指针类型和计数器规则。
Binder
Binder驱动和协议
Binder Driver会通过misc_register()将自己注册成一个misc device,并向上层提供一个/dev/binder节点,binder节点并不对应真实的硬件设备。binder驱动运行于内核态,可以提供binder_open(),binder_ioctl(),binder_mmap()等常用的文件操作。
- 打开Binder驱动-binder_open,会返回一个binder_proc实体,之后的binder操作都依赖这个对象。
- binder_mmap把设备指定的内存块直接映射到应用程序的内存空间中。这个通过虚拟内存的转换也是指向的物理内存的某个位置。会返回一个binder_proc->buffer来表示内存地址。
TODO 后期再补
参考
- 《深入理解Android内核设计思想》
- Android Binder设计与实现 - 设计篇