B可能提供多个服务,每个服务的handle是不一样的
open("1.txt")的时候得到一个handle,就是引用
service_manager对应服务的handle值 | test_server提供的服务 | test_client对应服务的handle值 | |
handle值 | 1 | hello服务 | 2 |
handle值 | 2 | goodbye服务 | 1 |
引用就是binder_ref,binder_ref当中有一个整数,调用驱动程序的时候会对比binder_ref,如果这个整数等于handle,就表示找到了这个引用。
使用ioctl读或写时一定会传入一个结构体binder_write_read类型的变量,而binder中关键内容的内存拷贝则会采用mmap的方式来实现。
数据的跨进程传递,只需要一次拷贝就可以完成的原理:当把同一块物理页面同时映射到进程空间和内核空间,这时在两者之间传递数据,只需要其中任意一方把数据拷贝到物理页面,另一方直接读取即可。
总结:结构变量拷贝两次,内存buf拷贝与映射各一次。
(出处https://blog.csdn.net/vviccc/article/details/90717764)