binder第一课

来源:互联网 发布:建筑外观效果图软件 编辑:程序博客网 时间:2024/06/06 10:54

Binder系统核心

1.      RPC

2.      IPC

 

 

IPC:

源头:A

目的:

1.      B向serviceManager注册Led服务

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

数据:char buf[512

 

RPC:远程过程调用

问题:

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

传给他什么参数

返回值

---à通过IPCbuf来进行传输

 

 

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

0 0
原创粉丝点击