参考自:https://blog.youkuaiyun.com/carson_ho/article/details/73560642
一,Linux内核的基础知识
1,进程隔离/虚拟地址空间
为了保证 安全性 & 独立性,一个进程不能直接操作或者访问另一个进程,即Android的进程是相互独立、隔离的
2,系统调用(用户空间和内核空间)
进程间,用户空间的数据不可共享,所以用户空间 = 不可共享空间
进程间,内核空间的数据可共享,所以内核空间 = 可共享空间
所有进程共用1个内核空间
进程内 用户空间 & 内核空间 进行交互 需通过 系统调用,主要通过函数:
copy_from_user():将用户空间的数据拷贝到内核空间
copy_to_user():将内核空间的数据拷贝到用户空间
3,binder驱动连接进程
通过binder创建的接收缓存区
,分别映射
到内核缓存区和接收进程的用户空间,从而建立进程间连接
二,Binder机制 在Android中的具体实现原理
Client进程、Server进程 & Service Manager 进程(用户空间)之间的交互 都必须通过Binder(内核空间)驱动(使用 open 和 ioctl文件操作函数),而非直接交互
1,注册服务
注册服务后,Binder驱动持有 Server进程创建的Binder实体
Binder binder = new Stub();
// 步骤1:创建Binder对象 ->>分析1
// 步骤2:创建 IInterface 接口类 的匿名类
// 创建前,需要预先定义 继承了IInterface 接口的接口 -->分析3
IInterface plus = new IPlus(){
// 确定Client进程需要调用的方法
public int add(int a,int b) {
return a+b;
}
// 实现IInterface接口中唯一的方法
public IBinder asBinder(){
return null ;
}
};
// 步骤3
binder.attachInterface(plus,"add two int");
// 1. 将(add two int,plus)作为(key,value)对存入到Binder对象中的一个Map<String,IInterface>对象中
// 2. 之后,Binder对象 可根据add two int通过queryLocalIInterface()获得对应IInterface对象(即plus)的引用,可依靠该引用完成对请求方法的调用
// 分析完毕,跳出
<-- 分析1:Stub类 -->
public class