Android进阶——Android跨进程通讯机制之Binder、IBinder、Parcel、AIDL-1

三、系统调用/内核态/用户态

抽象来看,操作系统中安全边界的概念就像环路的概念一样(前提是系统支持这种特性),一个环上持有一个特定的权限组,Intel 支持四层环,但是 Linux 只使用了其中的两环(0号环持有全部权限,3号环持有最少权限,1号和2号环未使用),系统进程运行在1号环,用户进程运行在3号环,如果一个用户进程需要其他高级权限,其必须从3号环过渡成0号环,过渡需要通过一个安全参数检查的网关,这种过渡被称为系统调用,在执行过程中会产生一定数量的计算开销。所以,用户空间要访问内核空间的唯一方式就是系统调用(System Call)

四、内核模块/驱动

通过系统调用,用户空间可以访问内核空间,它是怎么做到访问内核空间的呢?Linux的动态可加载内核模块机制解决了这个问题,模块是具有独立功能的程序,它可以被单独编译,但不能独立运行。这样,Android系统可以通过添加一个内核模块运行在内核空间,用户进程之间的通过这个模块作为桥梁,就可以完成通信了。在Android系统中,这个运行在内核空间的,负责各个用户进程通过Binder通信的内核模块叫做Binder驱动

五、简单的总结

将前面的所有概念连接起来理解就会非常好消化知识点:

1.Linux的虚拟内存机制导致内存的隔离,进而导致进程隔离
2.进程隔离的出现导致对内存的操作被划分为用户空间和内核空间
3.用户空间需要跨权限去访问内核空间,必须使用系统调用去实现
4.系统调用需要借助内核模块/驱动去完成

前三步决定了进程间通讯需要借助内核模块/驱动去实现,而Binder驱动就是内核模块/驱动中用来实现进程间通讯的

###为什么要用Binder
Linux提供有管道、消息队列、信号量、内存共享、套接字等跨进程方式,那为什么Android要选择Binder另起炉灶呢?

一、传输性能好

  • Socket:是一个通用接口,导致其传输效率低,开销大
  • 共享内存:虽然在传输时不需要拷贝数据,但其控制机制复杂
  • Binder:复杂数据类型传递可以复用内存,需要拷贝1次数据
  • 管道和消息队列:采用存储转发方式,至少需要拷贝2次数据,效率低

二、安全性高

  • 传统的进程:通信方式对于通信双方的身份并没有做出严格的验证,只有在上层协议上进行架设

  • Binder机制:从协议本身就支持对通信双方做身份校检,因而大大提升了安全* 性
    ###Binder通信模型
    首先在理解模型之前先熟悉这几个概念:

  • Client进程:跨进程通讯的客户端(运行在某个进程)

  • Server进程:跨进程通讯的服务端(运行在某个进程)
    Binder驱动:跨进程通讯的介质

  • ServiceManager:跨进程通讯中提供服务的注册和查询(运行在System进程)

这里只是个简单的模型而已,只需理解模型的通讯流程:

1.Server端通过Binder驱动在ServiceManager中注册
2.Client端通过Binder驱动获取ServiceManager中注册的Server端
3.Client端通过Binder驱动和Server端进行通讯
###Binder通信原理

理解完模型流程之后,开始理解模型的通讯原理:

1.Service端通过Binder驱动在ServiceManager的查找表中注册Object对象的add方法
2.Client端通过Binder驱动在ServiceManager的查找表中找到Object对象的add方法,并返回

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值