在操作系统中为了保证安全性和独立性,在用户态进程之间是独立的,所以如需要进程间数据交互和通信,将进程A的数据拷贝到内核态,然后进程B将进程A的数据从内核态拷贝到用户态;
Binder的作用是连接两个进程,实现了mmap方法进行系统调用(进行通信的核心原理是内存映射),主要负责创建数据接收的缓存空间和管理数据接收缓存;
Binder的一次拷贝:Binder实现1次内存拷贝的秘密就是:它借助了虚拟内存映射机制,在数据接收方和内核空间的数据缓存区做了内存映射。这样一来,从发送方发送的数据,拷贝到内核空间时,直接映射拷贝到了接收方的内存空间中了,也就实现了一次拷贝就完成了数据从发送方、到内核、再到接收方的数据传输过程。
当2个进程C和S进行跨进程通信时,C传递给SM(ServiceManager)一个S的名称,SM查找已注册的列表,从列表中解析出S在客户端C中的Binder引用,C就可以使用这个Binder引用进行通信了。Binder引用会把数据转化成可序列化的对象,经过Binder驱动程序,把数据拷贝到S进程中,然后再反序列化,最终获得C传递过来的数据,并调用S端的本地方法来实现服务的调用。
Binder机制在Android中的具体实现原理:
1.首先服务端需要向ServiceManager继续宁服务注册操作,ServiceManager有一个全局的service列表,用于缓存所有的服务的handler和name;
2.然后客户端与服务端通信时,通过向ServiceManager中获取服务端的代理,来完成与服务端的数据传递;
3.拿到服务对象之后,我们需要向服务对象发送请求,实现我们需要的功能;通过共享内存的方式使用内核方法copy_from_user方法我们的参数先拷贝到内核空间,这时我们的客户端进行等待;然后Binder驱动向服务端的todo队列里面,插入一条事务,执行完成之后,把执行结果通过copy_to_user方法将内核的结果拷贝到用户空间,唤醒等待的客户之后并把结果响应回来,这样完成一次通信;(参考文献:https://blog.csdn.net/yiranfeng/article/details/105181297)
Binder跨进程同通信的底层原理-详解