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