千家信息网

binder 机制流程分析

发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,前面我们对着代码分析了整个 test_client 和 test_server 的整个流程,下面我们再来总结下整个流程。假设我们有此种服务场景:test_server 提供 HelloService
千家信息网最后更新 2026年10月31日binder 机制流程分析

前面我们对着代码分析了整个 test_client 和 test_server 的整个流程,下面我们再来总结下整个流程。

假设我们有此种服务场景:test_server 提供 HelloService 服务,还有 GoodbyeService 服务;test_client 来使用服务。

对于 test_server 来说:

1. addService:

a. test_server 为每个服务构造 flat_binder_object 结构体。它里面中含有的 binder 指针和 cookie 指针 指向不同服务;

b. 调用 ioctl 发送数据:

b.1 数据中含有 flat_binder_object + 服务名称;

b.2 数据中含有"目的地":handle = 0,表示发给 SM;

c. 上面调用 ioctl ,那么驱动程序对每一个 flat_binder_object 构造 binder_node 结构体。它里面中含有的 ptr 和 cookie 指针是来自于 flat_binder_object 结构体里的 binder 和 cookie 指针;

d. 驱动程序根据 handle = 0 找到 SM,然后把数据发给 SM 并且创建 binder_ref 结构体;

e. 在 SM 里记录服务的名称及 desc 值。

对于 test_client 来说:

2. getService:

a. test_client 构造数据。数据 = 名称 +"目的(指的是 handle = 0)";

b. 调用 ioctl 发送数据;

c. 那么驱动程序根据 handle = 0 找到 SM 并把数据发给 SM;

d. SM 从 svclist 链表中找到对应项。比如根据名"Hello"找到第一项,handle = 1;

e. SM 通过 ioctl 返回数据。数据 = flat_binder_object,flat_binder_object 结构体中的 type 表示引用 binder_ref,handle = 1;

f. 驱动:发现数据中含有 flat_binder_object,且 type 为引用,从 SM 的 binder_ref 链表中找到对应项(传入的 handle == binder_ref.desc),再找到 binder_node,最后为 test_client 建立 binder_ref;

对于 SM 来说:

3. 那么 test_client 是怎么使用 HelloService?

a. 构造数据,数据中含有 code(调用哪个函数),"目的"handle = 1;

b. 使用 ioctl 发数据;

c. 驱动:去除 handle = 1,找到 binder_ref,进而找到 binder_node,再找到 test_server;最后把数据传入给 test_server,并且在数据中设置(ptr 和 cookie) 等于 binder_node 的(ptr 和 cookie);

d. test_server 根据(ptr 和 cookie)知道调用的是哪个服务;

1、那么在 test_server 中,驱动构造出 binder_node 结构体(放在链表中)包含有 HelloService 和 GoodbyeService 服务。binder_node 结构体中包含的 ptr 和 cookie 和 proc,proc 结构体指向的就是进程 test_server;

2、在 SM 中,驱动同样也构造出 binder_ref 结构体(也是以链表的形式)包含有 HelloService 和 GoodbyeService 服务。binder_ref 结构体中包含的 desc 和 node,此 node 指向的便是前面的 test_server 中的 binder_node 结构体找到对应服务;

3、在 test_client 中,驱动同样也构造出 binder_ref 结构体(也是以链表的形式)包含有 HelloService 和 GoodbyeService 服务。binder_ref 结构体中包含的 desc 和 node,此 node 指向的便是前面的 SM 中的 binder_node 结构体;

同样 test_client 根据 desc 找到对应的具体服务名(哪个服务,Hello 或 Goodbye 服务);

此时 binder 系统的流程调用已经非常明了了,那么此系统中的最核心的函数是 ioctl;test_client 端中最核心的数据是 handle,test_server 端最核心的数据是 ptr 和 cookie;

数据 服务 结构 驱动 指向 指针 流程 名称 核心 目的 程序 驱动程序 a. b. c. d. 中包 函数 形式 系统 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 河南真二互联网科技有限公司 互联网科技未来 互联网科技开发公司 深圳互联网科技公司 中国互联网科技发展 奇酷互联网络科技 深圳齐家互联网科技 互联网科技公司做什么 金融科技与互联网金融相同和不同 重庆互联网医院沙龙医盟信息科技 世界互联网科技公司市值排名 宝灵互联网科技有限公司 厦门千工互联网科技有限公司 赶超互联网科技 微信多开 互联网科技如何创业 互联网方面的科技前沿 艺电能源互联网科技有限公司招聘 张家口科技产业互联网平台 中国互联网公司的科技投入 深圳互联网科技园地址 互联网科技会 恒生科技互联网指数分析 互联网公司会议桌创意科技软装饰 互联网金融科技公司干啥的 来此购互联网科技有限公司 烟台灵鸽互联网科技有限公司 互联网企业科技类企业如何做账 互联网科技快讯热点 西安左小互联网科技有限公司 北京瑞云互联网科技有限公司
0