binder一次跨进程通信,只须要一次拷贝(缘由后面会解析),而通常的像socket通信则须要两次拷贝;socket
用户和内核空间分配了一段虚拟地址,这段虚拟地址将用于binder内存的访问。binder的物理内存页由binder驱动负责分配,而后这些物理页的访问,将分为进程的用户空间和进程内核空间。因为进程的用户空间和内核空间的虚拟地址范围是不同的,因此这里分配的一段虚拟地址将包括进程的用户空间地址和内核空间地址
内核刚开始只是分配了一个物理页,而且分别将这个物理页映射到进程的内核虚拟地址空间V1(修改内核空间的页表映射)和进程的用户虚拟地址空间V2(修改用户空间的页表映射)。在用户空间访问V1和在内核空间访问V2,其实都是访问的是同一个物理内存块,从而实现进程的内核和用户空间共享同一块物理内存的目的。这样binder驱动在内核空间,将一段数据拷贝到这个物理页,则该进程的用户空间则不须要copy_to_user()便可以同步看到内核空间的修改,并可以访问这段物理内存.进程