Binder介绍
Linux内核的基本知识:
1.进程隔离/虚拟地址空间
在操作系统中为了保护某些进程互不干扰,就设计了一个叫进程隔离的技术,而这个技术就是为了避免进程A可以操作进程B的数据的情况下所实现的。进程的隔离实现,它用到了虚拟地址空间,进程A的虚拟地址空间和进程B的虚拟地址空间其实是不同的,这样就防止了进程A的数据可以写到进程B里面。操作系统当中,不同进程之间他的数据是不共享的,所以说对于每个进程来说,它其实认为自己独享操作系统,其实是虚拟的一个空间而已。如果要一个进程同另一个进程进行通信,则需要某种进程间通讯才能完成。在android里面使用binder机制来完成。
2.系统调用,用户不能直接访问内核空间
在linux内核当中,有一个特别重要的概念叫系统调用,我们对内核有一种保护机制,来告诉应用程序你只可以访问某些许可的资源,不许可的资源你是不能够访问的。这也就将Linux分成了内核层和用户空间。用户可以通过系统调用,在用户空间访问内核的某些程序。
3.binder驱动
在android系统当中,它是运行在内核当中,它负责各个用户进程,通过binder通讯的内核来进行交互的一个模块。驱动程序一般指的是设备的驱动程序,它是可以使计算机与设备通讯的特殊程序,其实也是一种软件,但是他又相当于硬件的接口,操作系统可以通过这个接口去控制硬件设备。
Binder通信机制介绍
1.为什么使用binder
android使用的Linux内核拥有着非常多的跨进程通信机制,android中使用binder跨进程通讯主要基于以下两点:
1)性能,相对于传统的socket通信方式更加的高效
2)安全,传统的通讯方式没有对通信双方的身份做出严格的验证(比如ip可人为进行修改),只有上层协议才会进行架构,而binder从协议本身就支持对通讯双方进行身份校验,这也是android权限模型的基础。
2.binder通信模型
通信录(电话基站):binder驱动(类似于电话基站),Servicesmanager(类似于通讯录)
可以将binder通讯双方看做是服务端进程和客户端进程,由于进程隔离的存在,我们是没有办法通过手段在客户端进程访问到服务端进程的。
android系统中两个运行在用户空间进程要通讯必须借助内核的帮助,而这个运行在内核当中的程序就是binder驱动,他的功能类似于我们的电话基站。而Servicesmanager类似于我们的通讯录。
3.binder通信机制原理
通讯的步骤:
第一步:Servicesmanager进程建立,Servicesmanager相当于通讯录,向驱动提出申请为Servicesmanager,内核驱动同意以后,Servicesmanager负责管理所有的服务进程。
第二步:A进程想要与B进程通讯,首先要将自己的联系方式在Servicesmanager当中注册,Servicesmanager当中会建立一个表,对维护各个服务进程的名字和代理对象。
第三步:开始通讯,client先通过Servicesmanager查询服务的代理对象,Servicesmanager返回服务的代理对象给client。

跨进程通讯:;例如client 要调用 server的add方法
第一步:server将自己注册当Servicesmanager表当中,会告诉Servicesmanager,sever端有一个object对象,且可以执行一个add方法的操作。
第二步:client端向Servicesmanager查询有add方法的object对象,并将object的代理对象返回给client。进程之间的通讯,他的数据都会在内核空间里,这时候,驱动会在数据流的时候做一些转换,它并不会给client端返回一个真正的server端的object对象,因为这是无法进行操作的,而是返回一个object的代理对象,这个代理对象里面包含了一个add方法,这个add方法是一个控方法,它里面什么都没有,没有实际的逻辑功能。他只能将参数包装好之后,交给内核驱动来实现。当驱动收到client发给它的object代理对象的add方法,会根据Servicesmanager表当中的记录,使用真正的object对象替换代理对象,然后通知server端去调用它的add方法。
第三步:server端调用完add方法后,会将结果返回给驱动,驱动最后返回给client,这样binder驱动作为进程间通讯的中介就完成了。

到底什么是binder
1)通常意义下,binder指的是一种跨进程的通讯机制
2)对于server进程来说,binder指的是binder本地对象/对于client来说,binder指的是binder代理对象
3)对于传输过程而言,binder是可以进行跨进程传递的对象,binder驱动会对具有跨进程传递能力的对象做特殊处理,会自动完成代理对象和服务端对象的转换
Linux内核的基本知识:
1.进程隔离/虚拟地址空间
在操作系统中为了保护某些进程互不干扰,就设计了一个叫进程隔离的技术,而这个技术就是为了避免进程A可以操作进程B的数据的情况下所实现的。进程的隔离实现,它用到了虚拟地址空间,进程A的虚拟地址空间和进程B的虚拟地址空间其实是不同的,这样就防止了进程A的数据可以写到进程B里面。操作系统当中,不同进程之间他的数据是不共享的,所以说对于每个进程来说,它其实认为自己独享操作系统,其实是虚拟的一个空间而已。如果要一个进程同另一个进程进行通信,则需要某种进程间通讯才能完成。在android里面使用binder机制来完成。
2.系统调用,用户不能直接访问内核空间
在linux内核当中,有一个特别重要的概念叫系统调用,我们对内核有一种保护机制,来告诉应用程序你只可以访问某些许可的资源,不许可的资源你是不能够访问的。这也就将Linux分成了内核层和用户空间。用户可以通过系统调用,在用户空间访问内核的某些程序。
3.binder驱动
在android系统当中,它是运行在内核当中,它负责各个用户进程,通过binder通讯的内核来进行交互的一个模块。驱动程序一般指的是设备的驱动程序,它是可以使计算机与设备通讯的特殊程序,其实也是一种软件,但是他又相当于硬件的接口,操作系统可以通过这个接口去控制硬件设备。
Binder通信机制介绍
1.为什么使用binder
android使用的Linux内核拥有着非常多的跨进程通信机制,android中使用binder跨进程通讯主要基于以下两点:
1)性能,相对于传统的socket通信方式更加的高效
2)安全,传统的通讯方式没有对通信双方的身份做出严格的验证(比如ip可人为进行修改),只有上层协议才会进行架构,而binder从协议本身就支持对通讯双方进行身份校验,这也是android权限模型的基础。
2.binder通信模型
通信录(电话基站):binder驱动(类似于电话基站),Servicesmanager(类似于通讯录)
可以将binder通讯双方看做是服务端进程和客户端进程,由于进程隔离的存在,我们是没有办法通过手段在客户端进程访问到服务端进程的。
android系统中两个运行在用户空间进程要通讯必须借助内核的帮助,而这个运行在内核当中的程序就是binder驱动,他的功能类似于我们的电话基站。而Servicesmanager类似于我们的通讯录。
3.binder通信机制原理
通讯的步骤:
第一步:Servicesmanager进程建立,Servicesmanager相当于通讯录,向驱动提出申请为Servicesmanager,内核驱动同意以后,Servicesmanager负责管理所有的服务进程。
第二步:A进程想要与B进程通讯,首先要将自己的联系方式在Servicesmanager当中注册,Servicesmanager当中会建立一个表,对维护各个服务进程的名字和代理对象。
第三步:开始通讯,client先通过Servicesmanager查询服务的代理对象,Servicesmanager返回服务的代理对象给client。
跨进程通讯:;例如client 要调用 server的add方法
第一步:server将自己注册当Servicesmanager表当中,会告诉Servicesmanager,sever端有一个object对象,且可以执行一个add方法的操作。
第二步:client端向Servicesmanager查询有add方法的object对象,并将object的代理对象返回给client。进程之间的通讯,他的数据都会在内核空间里,这时候,驱动会在数据流的时候做一些转换,它并不会给client端返回一个真正的server端的object对象,因为这是无法进行操作的,而是返回一个object的代理对象,这个代理对象里面包含了一个add方法,这个add方法是一个控方法,它里面什么都没有,没有实际的逻辑功能。他只能将参数包装好之后,交给内核驱动来实现。当驱动收到client发给它的object代理对象的add方法,会根据Servicesmanager表当中的记录,使用真正的object对象替换代理对象,然后通知server端去调用它的add方法。
第三步:server端调用完add方法后,会将结果返回给驱动,驱动最后返回给client,这样binder驱动作为进程间通讯的中介就完成了。
到底什么是binder
1)通常意义下,binder指的是一种跨进程的通讯机制
2)对于server进程来说,binder指的是binder本地对象/对于client来说,binder指的是binder代理对象
3)对于传输过程而言,binder是可以进行跨进程传递的对象,binder驱动会对具有跨进程传递能力的对象做特殊处理,会自动完成代理对象和服务端对象的转换