首先要知道,在linux里面一切皆是文件。
binder机制:是一种进程间通信机制,
binder驱动:是一个虚拟物理设备驱动
应用层:binder是一个java类
多进程的优势:
为什么选用binder作为进程通信:
问题:binder如何实现一次拷贝的?
回答这个问题需要了解传统的IPC是如何通信的。
一个进程是由用户空间和内核空间组成的,比如用户空间占用3G,内核空间占用1G,
两个进程的内核空间,直接是共享同一块物理内存,而两个不同的进程的用户空间,是用MMU(memory manager unit) 内存管理单元映射到物理内存的。
也就是说你创建一百个进程,他们的内核空间是同一块内存,但是用户空间是不同的内存,
虚拟内存指的是在用户空间里面的内存,
而物理内存指的是内存条,虚拟内存的地址会通过MMU映射到物理内存中。
所以在传统IPC进程通信机制比如socket为什么是两次拷贝呢,第一次拷贝是指用户空间拷贝到内核空间,然后从内核空间拷贝到第二进程的用户空间。
所以问题来了,binder如何对传统的ipc机制进行优化的呢,又如何实现一次性拷贝呢?
如图:
几句话概括就是:用了MMAP,也就是内存映射实现的一次拷贝,
跟传统IPC机制一样,第一次都是copy_from_user(),数据拷贝到内核空间,第二次则通过内存映射,在内核空间和数据接收方(服务端)二者直接开辟一块物理内存地址,内核空间和服务端都映射到这块物理内存地址,数据从内核空间直接到服务端,这样就不需要二次拷贝了,这就是binder传数据的基本流程。