总结: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可以在用户态直接使用数据
数据复制一遍,数据头要复制两遍