Binder系统_驱动情景分析_数据结构

总结:handle是进程A对进程B提供的服务S的引用

binder结点:在内核态驱动里

1、server传入一个flat_binder_object,为每个服务创建binder_node

binder_node.proc=server进程

2、servermagaer在驱动中创建binder_ref,引用binder_node

binder_ref.desc=1,2,3.......

在用户态创建服务链表

3、client向sever_manage查询服务,传name

4、server_manager返回handle给驱动程序

5、驱动程序在server_manage的bind_ref红黑树中根据handle找到binder_ref

在根据binder_ref.node找到binder_node

最后,给client创建新的binder_ref,它的desc从1开始

驱动返回desc给client,它即为handle

6、client=》handle:驱动根据handle找到binder_ref

                                       根据binder_ref找到binder_node

                                       根据binder_node找到server进程

 

数据传输过程(过程切换)

client=>server

先写后读

1、client构造数据

调用ioctl发数据

2、驱动里根据handle找到server进程

3、把数据放入进程的binder_proc.todo

4、休眠

5、被唤醒

6、从todo链表取出数据,返回用户空间

server

先读后写

1、读、休眠

2、被唤醒

3、从todo链表取出数据

返回用户空间

4、处理

5、把结果写给client,也是放入client的binder_proc.todo

唤醒client

 

 

数据如何复制

一般方法:需要2次复制

1、clien构造数据

2、驱动:copy_from_user

server:1、驱动:copy_to_user

               2、用户态处理

binder复制的方法:只需要复制一次

1、server  mmap,用户态

可以直接访问

驱动中某块内存

2、client构造数据

驱动copy_from_user

3、server可以在用户态直接使用数据

 

 

数据复制一遍,数据头要复制两遍

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值