学习笔记-Binder原理

89 阅读2分钟

首先要知道,在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传数据的基本流程。