您的位置:首页 > 其它

binder第一课

2016-03-29 21:26 218 查看
Binder系统核心

1. RPC

2. IPC



IPC:

源头:A

目的:

1. B向serviceManager注册Led服务

2. A向serviceManager查询led服务,得到一个handle

数据:char buf[512

RPC:远程过程调用

问题:

调用哪一个函数:server的函数编号

传给他什么参数

返回值

---à通过IPC的buf来进行传输

serviceManager:

1. Open驱动

2. 告诉驱动,它是”serviceManager”

3. While(1)

a) 读驱动获取数据

b) 解析数据

c) 调用

i. 注册服务:在链表中记录服务名字

ii. 获取服务:

1. 在链表中查询又无服务

2. 返回”server进程”的handle

frameworks\native\cmds\servicemanager

service_manager.c :

a. binder_open

b. binder_become_context_manager

c. binder_loop(bs, svcmgr_handler);

c.1 res = ioctl(bs->fd, BINDER_WRITE_READ, &bwr);

c.2 binder_parse

// 解析

// 处理 : svcmgr_handler

SVC_MGR_GET_SERVICE/SVC_MGR_CHECK_SERVICE : 获取服务

SVC_MGR_ADD_SERVICE : 注册服务

// 回复

Server:

1. Open驱动

2. 注册服务

a) 向serviceManager发送服务的名字

3. While(1)

a) 读驱动

b) 解析数据

c) 调用对应的函数

例子:

bctest.c

注册服务的过程:

a. binder_open

b. binder_call(bs, &msg, &reply, 0,SVC_MGR_ADD_SERVICE)

// msg:含有服务的名字

// reply:它会含有servicemanager回复的数据

// 0表示servicemanager

// code: 表示要调用servicemanager中的"addservice函数"

Client:

1. Open驱动

2. 获取服务:

a) 向serviceManager查询服务

b) 获得一个handle

3. 向这个handle发数据

例子:

获取服务的过程:

a. binder_open

b. binder_call(bs, &msg, &reply,target, SVC_MGR_CHECK_SERVICE)

// msg:含有服务的名字

// reply:它会含有servicemanager回复的数据, 表示提供服务的进程

//target: 0表示servicemanager

// code: 表示要调用servicemanager中的"getservice函数"

库文件binder.c分析:

Binder_call:远程调用

问题:

1. 向谁发数据

a) target

2. 调用哪个函数

a) code

3. 提供什么参数

a) msg

4. 返回值是什么

a) reply

int binder_call(struct binder_state *bs,

struct binder_io *msg, structbinder_io *reply,

uint32_t target, uint32_t code)

binder_call的内部实现

1. 构造参数:用binder_io来描述

a) 数据转换:binder_io->binder_write_read

用户空间----> 内核空间

2. 调用ioctl来发数据

3. 调用ioctl来收数据

a) 数据转换:binder_write_read ----> binder_io

内核空间---------->用户空间

怎么写app:

1. Client

a) Binder_open

b) 获得服务:handle

c) 构造参数:binder_io

d) 调用binder_call

e) 分析返回的binder_io,取出返回值

2. Server

a) Binder_open

b) 注册服务

c) 调用ioctl

d) 解析数据binder_write_read

.readbuf->binder_transacton_data(有code,参数等)

e) 根据code,来决定调用哪个函数,从binder_io中取出参数

f) 把返回值转换为binder_io,发给client
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: