Binder的一次拷贝是哪次

binder的一次拷贝发生在客户端发消息时,从用户空间拷贝消息到内核空间,原因是内核空间与用户空间存在内存隔离,必须内核和驱动开发专用函数 copy_from_user(…),把内存从用户空间拷贝过来才能继续操作

binder请求过程

简述一下通信过程:

1)进程启动时候,打开binder驱动,使用mmp()函数分配一段物理内存,让内核空间和用户空间都指向这段内存,mmp返回共享空间的地址,由进程持有,对应的内核部分由该进程对应的节点持有,驱动维护着所有节点

2)客户端通过驱动查询服务端的节点,不是直接通过驱动,而是先经过了servicemnager,但 servicemnager 实际上是句柄为0的服务端

3)写入对应内容到驱动,此时驱动会拷贝一次数据,然后把数据写入到对应的服务端共享内存中

4)队列被唤醒,服务端的epoll收到读消息

举一反三,从而推断socket发生2次拷贝的原因就在于,socket没有使用内存映射,使用 copy_from_user ,之后还需使用 copy_to_user 把消息从内核拷贝到用户空间的对应进程