BAT大咖助力Android面试6-Binder面试详解

本文深入探讨了Linux内核基础知识,特别是关于进程隔离和系统调用的概念。接着详细介绍了Binder机制在Android中的实现原理,包括服务的注册、获取和使用过程。最后,讨论了Binder相对于其他进程通信方式的优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考自: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 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值