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

Binder系统_驱动情景分析_数据结构_第1张图片

Binder系统_驱动情景分析_数据结构_第2张图片

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

Binder系统_驱动情景分析_数据结构_第3张图片

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可以在用户态直接使用数据

 

 

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

Binder系统_驱动情景分析_数据结构_第4张图片

你可能感兴趣的:(binder分析)