没有合适的资源?快使用搜索试试~ 我知道了~
首页Binder深入讲解__底层_内核实现
Binder深入讲解__底层_内核实现
5星 · 超过95%的资源 需积分: 10 18 下载量 110 浏览量
更新于2023-06-28
评论
收藏 368KB DOC 举报
本文是william的binder底层实现的中文版,详细介绍了binder的底层实现。
资源详情
资源评论
资源推荐
第一节 Android Binder
星期四
是一种在 里广泛使用的一种远程过程调用接口。从结构上来说 系
统是一种服务器客户机模式,包括 、 和 驱动,实际的数据传
输就是通过 驱动来完成的,这里我们就来详细的介绍 驱动程序。
通常来说, 是 系统中的内部进程通讯()之一。在 系统中共有三种 机制,
分别是:
-标准 !" 接口
-标准 #$ 接口
- 接口
尽管 %& 宣称 具有更加简洁、快速,消耗更小内存资源的优点,但并没有证据表明 #$ 就很
差。实际上 #$ 可能会更合适些,或许只是当时 %& 并没有注意到它吧,或者 %& 不想使用 %
协议的 #$ 库。我们不去探究具体的原因了,你只要清楚 系统中支持了多个 接口,而且大部
分程序使用的是我们并不熟悉的 接口。
是 '( 的 %& 精简实现,它包括一个 驱动程序、一个 服务器及
客户端(?)。这里我们只要介绍内核中的 驱动的实现。
对于 ,它也可以称为是 系统的一种 )(远程过程调用)机制,因为 实现
“ ”的功能就是在本地 执行 其他服务进程的功能的函数调用。不管是 也好,还是 ) 也好,我们所要知道
的就是 的功能是如何实现的。
介绍
2.1.1 Android Binder 协议
的 机制是基于 '(
*+(,&-(,./+.01(1.2+3.+2,+4来
实现的,是一个 '( 的 ! 实现。
的协议定义在 1,+ 头文件中, 的通讯就是基于这样的一个协议的。
Binder Type
(描述 的功能)
定义了五个(三大类) 类型,如下:
! " " # "$%&"
' ( " " # "$%&"
$ ! " ) " # "$%&"
'$ ( " ) " # "$%&"
* + " " # "$%&"
,-
Binder Object
进程间传输的数据被称为 对象('15.),它是一个 671715.,定义如下:
!./012.
3#4!+1506/0)07#3
!6516-
!6516/06!-
3#4!1+007#3
1
81#-3#51.0512.#3
!6516)05-3#112.#3
,-
3#90000!!1.0()51.0512.#3
81#.11:-
,-
其中,类型字段描述了 对象的类型,6&2 描述了传输方式,比如同步、异步等。
0!0.1/06!
*';9;<"3#)!!01=(0.055>0!."1#3
*?;9;@"3#.1!0).11 !1112.#3
*A;9;4"3#.1!00BC=!0!.1#3
**;9<;"3#0551(5!()D5!.1!#3
,-
传输的数据是一个复用数据联合体,对于 8#9) 类型,数据就是一个 1 本地对象,如果是
:8#9 类型,这数据就是一个远程的 + 对象。该如何理解本地 1 对象和远程 + 对
象呢?其实它们都指向同一个对象,不过是从不同的角度来说。举例来说,假如 有个对象 ;,对于
来说,; 就是一个本地的 1 对象;如果 想访问 的 ; 对象,这对于 来说,; 就是一个
+。因此,从根本上来说 + 和 1 都指向 ;。本地对象还可以带有额外的数据,保存
在 .0 中。
对象的传递是通过 172.7 来实现的,即 对象实际是封装在
172.7 结构体中。
binder_transaction_data
这个数据结构才是真正要传输的数据。它的定义如下:
!.0!0.100
3#)D!(1015!+1.0"
#+6)060.1!1+)0!0.17
#3
1
!E)05-3#06!.11+.100!0.1#3
81#-3#06!.11+0!0.1#3
,06-
81#.11:-3#0612..11:#3
!6.1-3#0!0.1.10#3
3#%05+10101)0!0.17#3
!6/06!-
!-
!-
!E00!E-3#1+!1+00#3
!E1F!!!E-3#1+!1+1F!!#3
3#+)!0!0.1!5")0005
#+1551(!)-1)(!"!()011
#)00F7
#3
1
!.
3#0!0.100#3
.1!81#F-
3#1F!!+1F1/012.!.!#3
.1!81#1F!!-
,-
4+G4H-
,00-
,-
结构体中的数据成员 & 是一个复合联合体对象,请参考前面的关于 1 本地对象及 +
远程对象的描述。. 是一个命令,描述了请求 对象执行的操作。
对象的索引和映射
中的一个重要概念就是对象的映射和索引。就是要把对象从一个进程映射到另一个进程中,以
实现线程迁移的概念。前面描述过 的一个重要概念是进程线程迁移,即当一个进程需要同另
“ ”一个进程通信时,它可以 迁移 远程的进程线程到本地来执行。对于调用进程来说,看起来就像是在
本地执行一样。这是 与其他 机制的不同点或者说是优点。当然迁移的工作是由 驱
动来完成的,而实现的基础和核心就是对象的映射和索引。
中有两种索引,一是本地进程地址空间的一个地址,另一个是一个抽象的 位句柄
(:8#9),它们之间是互斥的:所有的进程本地对象的索引都是本地进程的一个地址*22
(14,所有的远程进程的对象的索引都是一个句柄(+)。对于发送者进程来说,索引
就是一个远端对象的一个句柄,当 对象数据被发送到远端接收进程时,远端接受进程则会认为
索引是一个本地对象地址,因此从第三方的角度来说,尽管名称不同,对于一次 调用,两种索
引指的是同一个对象, 驱动则负责两种索引的映射,这样才能把数据发送给正确的进程。
对于 的 来说,对象的索引和映射是通过 17 和 17< 两个核心数据
结构来完成的,对于 本地对象,对象的 地址保存在 17=( 里,对于远程
对象,索引就保存在 17<=2. 里,每一个 17 都有一个 17< 对象与之相
联系,他们就是是通过 ( 和 2. 来做映射的,如下图:
671715. 就是进程间传递的 对象,每一个 671715. 对象内核都有一个
唯一的 17 对象,这个对象挂接在 17(. 的一颗二叉树上。对于一个 17
对象,内核也会有一个唯一的 17< 对象,可以这么理解,17< 的 2. 唯一的映射到
17 的 ( 和 .0 上,同时也唯一的映射到了 671715. 的 + 上。而
17< 又按照 和 2. 两种方式映射到 17(. 对象上,也就是可以通过
17 对象或者 2. 两种方式在 17(. 上查找到 17< 或 17。所以,
对于 671715. 对象来说,它的 1>.0 和 + 指向了同一个 17
对象上,即同一个 1 对象。
BinderDriverCommandProtocol
驱动的命令协议(7命令),定义了 驱动支持的命令格式及数据定义(协议)。不
同的命令所带有的数据是不同的。 的命令由 177 数据结构描述,它是 . 命
令(8#9)7?)@97)9#)的参数。
!.(0
!6516(!E-3#!1(#3
!6516(.1!-3#!.1!8#3
!6516(F-
!65160!E-3#!10#3
!65160.1!-3#!.1!8#3
!65160F-
,-
对于写操作,71 A 包含了一系列请求线程执行的 命令;对于读(返回)操作,
71 A 包含了一系列线程执行后填充的返回值。
命令(7)用于 8#9)7?)@97)9# 的 操作。
的 的命令格式是:B3#B#,,,B
23# #C 82
7@)8@'8
7)9D
172.7
7E$)97)9$@
7@@93@7E$)9
8(
7C)997$CC9) 7(
(2..
78)9C
7E$)9
7)999
7#9)9C
&2.(
78)9C7#'89
7E$)97#'89
7(B.0
7)9%@9)7''9)
798@9)7''9)
79;@7''9)
8(2
7)9E$9@7#9@:78'@C
@'8
&7(B.0
7#9#78#9)7#'89 .0
BinderDriverReturnProtocol
驱动的响应(返回,)7)协议,定义了 命令的数据返回格式。同 命令协议一
样, 驱动返回协议也是通过 8#9)7?)@97)9#. 命令实现的,不同的是它是
操作。
) 的命令格式是:B3#B#,,,B
)命令 3#
#C 82
)79))') 9.
)7'"
)78''
)7?87''9)
8(2
)7@)8@'8
)7)9D
172.
7
+..
)7E$)97)9$@
)7@@93@7E$)9
)7C8:9#
8(
)7#9#7)9D
@+&<+22.2
&+ 2,
1.@)8@'81.@@93@7E$)9
)7@)8@'87'39@
9
8(2,,,
-2<2+22.
剩余35页未读,继续阅读
imyfriend
- 粉丝: 294
- 资源: 76
上传资源 快速赚钱
- 我的内容管理 收起
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
会员权益专享
最新资源
- RTL8188FU-Linux-v5.7.4.2-36687.20200602.tar(20765).gz
- c++校园超市商品信息管理系统课程设计说明书(含源代码) (2).pdf
- 建筑供配电系统相关课件.pptx
- 企业管理规章制度及管理模式.doc
- vb打开摄像头.doc
- 云计算-可信计算中认证协议改进方案.pdf
- [详细完整版]单片机编程4.ppt
- c语言常用算法.pdf
- c++经典程序代码大全.pdf
- 单片机数字时钟资料.doc
- 11项目管理前沿1.0.pptx
- 基于ssm的“魅力”繁峙宣传网站的设计与实现论文.doc
- 智慧交通综合解决方案.pptx
- 建筑防潮设计-PowerPointPresentati.pptx
- SPC统计过程控制程序.pptx
- SPC统计方法基础知识.pptx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论1