关于Binder的基本概念
来源:互联网 发布:大连 软件招聘会 编辑:程序博客网 时间:2024/06/01 09:24
android binder 的实质是一个信号传递工具。
Android binder的原型是linux的openBinder;
Binder原本是IPC工具(即进程间通讯工具),但是在Android中它主要用于支持RPC(远程过程调用),使得当前进程调用另一进程的函数时就像调用自身函数一样轻松、简单。
在linux系统中,一个4GB的虚拟地址空间,其中3GB是用户空间,剩余的1G是内核空间(可以通过内核设定修改)。
进程具有各自独立的地址空间,单独运行。
一个独立空间的进程如何向另一个进程传递数据呢?
虽然各进程拥有各自独立的用户空间,但内核空间是共享的。显然要通过两个进程共享的内核空间。
从内核的角度看,进程不过是一个作业单位,虽然各进程的用户空间相互独立,但运行在内核空间中的数据、代码都是彼此共享的。
例如,使用相机拍照后,将其显示在桌面上。在这一过程中主要涉及两个进程,一个进程用来驱动相机,另一个进程用来将照片
显示在出来。在Android中,其实现方式并不是相机驱动进程通过内核空间显示请求传递给负责画面输出的进程(即通过内核空间相互交换信息,实现IPC).
而是相机驱动进程通过Binder进行进程间的RPC操作来调用负责画面输出的进程中的函数,从而将照片输出显示在手机桌面上。
各个进程的用户空间是无法共享的,Binder使用运行在内核空间中的抽象驱动程序Binder(IPC)Driver来实现进程间通讯。
2.通过使用用户空间无法访问的内核来空间交换数据,来解决IPC间的安全问题;
IPC数据包含函数调用相关的内容,它由待调服务号、待调函数名、Binder协议(BINDER PROTOCOL)构成。
Android中用服务号来标记运行中的各个服务。
服务客户端通过调用ioct1()将BinderIPC数据传递给BinderDriver,
而后BinderDriver将其传递给指定的ServiceServer。在这一过程中,BinderDriver会根据IPC数据中的Binder协议决定是否传递数据。
根据传递方向。Binder协议分为两种:一种是从IPC层传递给BinderDriver的 “BC_ ”命令;另一种是从BinderDriver传递给IPC的“BR_”命令
IPC数据接收端在接收到IPC数据后,会向ipc数据的发送端发送一些与IPC数据相关的应答数据;
在Android系统中,有一个名称为ContextManager的特殊进程,他为每个服务分配一个称为Handle(用作BinderIPC的目的地址)的编号,
并且提供五福的添加、检索等管理功能(ContextManager自身的Handle值被设置为0)。
BinderDriver会根据IPC数据中的Handle查找ServiceServer,这一过程可以理解为Binder寻址。
为了顺利实现Binder寻址,ServiceServer A必须先把自身服务的访问信息注册到ContextManager,在服务注册过程中,ServiceServer会向BinderDriver传送IPC数据
BinderDriver会生成一个Binder节点,用来表示ServiceServer中的服务A ;传到ContextManager中,ContextManager会根据IPC数据中的服务名称与Binder节点编号完成注册;
注册在ContextManager中的服务就可以被其他进程使用了;
客户端是如何通过服务名称知道目标服务的Handle的呢(服务检索)?
客户端是通过与ContextManager的IPC通讯获取目标服务的Handle的;
通过以上的说明可以理解什么服务要进行注册,而且一个系统中服务是唯一的;
为什么要进行注册?
答:因为需要在ContextManager内注册才能被调用(服务不是针对某个程序的,而是针对整个系统的);
为什么系统中只有一个服务?
答:因为服务在系统当中只能处理一个IPC信息,
对于一个ServiceServer只有以下几种状态:
待机(准备接受从BinderDriver来的IPC)
|
接收IPC信息
|
等待返回应答(待机)
|
接收应答
|
待机(继续准备接受从BinderDriver)
可以判断,对于ServiceServer只有接收一个IPC信息的能力,那自然也就是一个系统中某种服务是唯一的;
Android binder的原型是linux的openBinder;
Binder原本是IPC工具(即进程间通讯工具),但是在Android中它主要用于支持RPC(远程过程调用),使得当前进程调用另一进程的函数时就像调用自身函数一样轻松、简单。
在linux系统中,一个4GB的虚拟地址空间,其中3GB是用户空间,剩余的1G是内核空间(可以通过内核设定修改)。
进程具有各自独立的地址空间,单独运行。
一个独立空间的进程如何向另一个进程传递数据呢?
虽然各进程拥有各自独立的用户空间,但内核空间是共享的。显然要通过两个进程共享的内核空间。
从内核的角度看,进程不过是一个作业单位,虽然各进程的用户空间相互独立,但运行在内核空间中的数据、代码都是彼此共享的。
例如,使用相机拍照后,将其显示在桌面上。在这一过程中主要涉及两个进程,一个进程用来驱动相机,另一个进程用来将照片
显示在出来。在Android中,其实现方式并不是相机驱动进程通过内核空间显示请求传递给负责画面输出的进程(即通过内核空间相互交换信息,实现IPC).
而是相机驱动进程通过Binder进行进程间的RPC操作来调用负责画面输出的进程中的函数,从而将照片输出显示在手机桌面上。
各个进程的用户空间是无法共享的,Binder使用运行在内核空间中的抽象驱动程序Binder(IPC)Driver来实现进程间通讯。
使用BinderDriver实现进程间通讯的原因如下:
1.采用Linux中优秀的内存管理技术,爱通过内核空间传递数据时能够确保数据的可靠性;2.通过使用用户空间无法访问的内核来空间交换数据,来解决IPC间的安全问题;
要调用其他进程的函数,就需要发送Binder IPC数据到BinderDriver中。
BinderIPC数据是BinderDriver操作的IPC数据单位,其中包含调用其他进程函数的信息。IPC数据包含函数调用相关的内容,它由待调服务号、待调函数名、Binder协议(BINDER PROTOCOL)构成。
Android中用服务号来标记运行中的各个服务。
服务客户端通过调用ioct1()将BinderIPC数据传递给BinderDriver,
而后BinderDriver将其传递给指定的ServiceServer。在这一过程中,BinderDriver会根据IPC数据中的Binder协议决定是否传递数据。
根据传递方向。Binder协议分为两种:一种是从IPC层传递给BinderDriver的 “BC_ ”命令;另一种是从BinderDriver传递给IPC的“BR_”命令
IPC数据接收端在接收到IPC数据后,会向ipc数据的发送端发送一些与IPC数据相关的应答数据;
在Android系统中,有一个名称为ContextManager的特殊进程,他为每个服务分配一个称为Handle(用作BinderIPC的目的地址)的编号,
并且提供五福的添加、检索等管理功能(ContextManager自身的Handle值被设置为0)。
BinderDriver会根据IPC数据中的Handle查找ServiceServer,这一过程可以理解为Binder寻址。
为了顺利实现Binder寻址,ServiceServer A必须先把自身服务的访问信息注册到ContextManager,在服务注册过程中,ServiceServer会向BinderDriver传送IPC数据
BinderDriver会生成一个Binder节点,用来表示ServiceServer中的服务A ;传到ContextManager中,ContextManager会根据IPC数据中的服务名称与Binder节点编号完成注册;
注册在ContextManager中的服务就可以被其他进程使用了;
客户端是如何通过服务名称知道目标服务的Handle的呢(服务检索)?
客户端是通过与ContextManager的IPC通讯获取目标服务的Handle的;
通过以上的说明可以理解什么服务要进行注册,而且一个系统中服务是唯一的;
为什么要进行注册?
答:因为需要在ContextManager内注册才能被调用(服务不是针对某个程序的,而是针对整个系统的);
为什么系统中只有一个服务?
答:因为服务在系统当中只能处理一个IPC信息,
对于一个ServiceServer只有以下几种状态:
待机(准备接受从BinderDriver来的IPC)
|
接收IPC信息
|
等待返回应答(待机)
|
接收应答
|
待机(继续准备接受从BinderDriver)
可以判断,对于ServiceServer只有接收一个IPC信息的能力,那自然也就是一个系统中某种服务是唯一的;
0 0
- 关于Binder的基本概念
- Binder基本概念流程学习
- Binder基本概念流程学习
- Binder基本概念流程学习
- Binder基本概念流程学习
- Binder基本概念流程学习
- Binder基本概念流程学习
- 关于SVM的基本概念
- 关于Solr的基本概念
- 关于通讯的基本概念
- 关于Service的基本概念
- 关于binder
- Android笔记 - Binder之基本概念
- Android Binder基本概念流程学习
- 关于BinderPool Binder连接池的愚见
- 关于Binder机制的简单认识
- 一个关于binder的debug技巧
- 关于Android中的BInder机制的笔记
- Eclipse导入Maven项目
- 集合遍历操作:Collection及Iterator接口
- 第一次面试前端的心路历程
- mybatis映射器三(insert,update,delete)
- linux操作系统下安装jdk环境
- 关于Binder的基本概念
- 如何简单粗暴的干掉2345主页
- 人工智能(AI)资料大全
- 高仿微信通讯录,解决SideBarView下标越界问题
- 开源项目之Android框架(Query)
- JS深度克隆
- 传感器——MPU6050
- 初探box-decoration-break
- Linux Centos apache 图片不显示解决办法