android binder笔记(一)

最近在看韦老师的android binder视频 ,记录下个人对视频学习的理解。

学习需要记录与分享,如果有误,希望得到大家的指正!


 




IPC:两个进程间数据通信的一种方式
RPC:一个进程调用另外一个进程的方法
比如A进程要调用驱动的 led_open 但是A没有权限。只能通过系统程序的B进程来调用
那么 A 将要调用的方法 调用的参数 发给B ,B获取数据 并解析出来 然后执行led_open函数

那么A如何将数据发给B呢 ?
A怎么找到B呢?这里就引入一个 servicemanager

 



1.这里binder驱动 就是作为全局的数据传递的IPC服务,它负责将数据在所有进程之间的共享管理

2.进程间通讯 通过注册到binder驱动中的一个handler(整数)来标识
也就是A进程告诉binder 我要向0x123 这个handler的进程发数据,并标志这个buffer的handler为0x123
B进程会轮询0x123所标志的buffer 并从中获取数据
 

3.servicemanager,的作用相当于一个中间机构,b进程向它注册服务,a进程从它获取服务
b进程向它注册的时候 提供给了一个服务名+b的hander
a进程从它获取服务的时候,可以通过一个服务名找到 b的handler

4.a 怎么找到servicemanage的?
因为servicemanage向binder注册的时候,就声明我是servicemanage,那么binder驱动将指定它的hander是0
我们可以向0的handler发送数据 ,其中code是要访问的方法,  binder_io是要访问的参数

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 : 注册服务
// 回复




bctest.c 测试文件
注册服务的过程:一般在B进程也就是service进程中调用
a. binder_open
b. binder_call(bs, &msg, &reply, 0, SVC_MGR_ADD_SERVICE)
msg  // 含有服务的名字
reply  // 它会含有servicemanager回复的数据
0        // 0表示servicemanager
SVC_MGR_ADD_SERVICE   // code: 表示要调用servicemanager中的"addservice函数"

 



获取服务的过程: 一般在A进程也就是client中调用
a. binder_open
b. binder_call(bs, &msg, &reply, target, SVC_MGR_CHECK_SERVICE)
// 含有服务的名字
// 它会含有servicemanager回复的数据, 表示提供服务的进程
// 0表示servicemanager
// code: 表示要调用servicemanager中的"getservice函数"

 








关键函数binder_call的分析


 


 

 

转载于:https://www.cnblogs.com/sunrise110/p/9463691.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值