Android面试官:说说你对 Binder 驱动的了解?

🤔️:简单画张图吧:

对 Binder 机制来说,它是 IPC 通信的路由器,负责实现不同进程间的数据交互,是 Binder 机制的核心;对 Linux 系统来说,它是一个字符驱动设备,运行在内核空间,向上层提供 /dev/binder 设备节点及 open、mmap、ioctl 等系统调用。

面试官:你提到了驱动设备,那先说说 Linux 的驱动设备吧

🤔️:Linux 把所有的硬件访问都抽象为对文件的读写、设置,这一"抽象"的具体实现就是驱动程序。驱动程序充当硬件和软件之间的枢纽,提供了一套标准化的调用,并将这些调用映射为实际硬件设备相关的操作,对应用程序来说隐藏了设备工作的细节。

Linux 驱动设备分为三类,分别是字符设备、块设备和网络设备。字符设备就是能够像字节流文件一样被访问的设备。对字符设备进行读/写操作时,实际硬件的 I/O 操作一般也紧接着发生。字符设备驱动程序通常都会实现 open、close、read 和 write 系统调用,比如显示屏、键盘、串口、LCD、LED 等。

块设备指通过传输数据块(一般为 512 或 1k)来访问的设备,比如硬盘、SD卡、U盘、光盘等。网络设备是能够和其他主机交换数据的设备,比如网卡、蓝牙等设备。

字符设备中有一个比较特殊的 misc 杂项设备,设备号为 10,可以自动生成设备节点。Android 的 Ashmem、Binder 都属于 misc 杂项设备。

面试官:看过 binder 驱动的 open、mmap、ioctl 方法的具体实现吗?

🤔️:它们分别对应于驱动源码 binder.c 中的 binder_open()、binder_mmap()、binder_ioctl() 方法,binder_open() 中主要是创建及初始化 binder_proc ,binder_proc 是用来存放 binder 相关数据的结构体,每个进程独有一份。

binder_mmap() 的主要工作是建立应用进程虚拟内存在内核中的一块映射,这样应用程序和内核就拥有了共享的内存空间,为后面的一次拷贝做准备。

binder 驱动并不提供常规的 read()、write() 等文件操作,全部通过 binder_ioctl() 实现,所以 binder_ioctl() 是 binder 驱动中工作量最大的一个,它承担了 binder 驱动的大部分业务。

面试官:仅 binder_ioctl() 一个方法是怎么实现大部分业务的?

🤔️:binder 机制将业务细分为不同的命令,调用 binder_ioctl() 时传入具体的命令来区分业务,比如有读写数据的 BINDER_WRITE_READ 命令、 Service Manager 专用的注册为 DNS 的命令等等。

BINDER_WRITE_READ 命令最为关键,其细分了一些子命令,比如 BC_TRANSACTION、BC_REPLY 等。BC_TRANSACTION 就是上层最常用的 IPC 调用命令了,AIDL 接口的 transact 方法就是这个命令。

面试官:binder 驱动中要实现这些业务功能,必然要用一些数据结构来存放相关数据,比如你上面说 binder_open() 方法时提到的 binder_proc,你还知道其他的结构体吗?

🤔️:知道一些,比如:

| 结构体 | 说明 |

| — | — |

| binder_proc | 描述使用 binder 的进程,当调用 binder_open 函数时会创建 |

| binder_thread | 描述使用 binder 的线程,当调用 binder_ioctl 函数时会创建 |

| binder_node | 描述 binder 实体节点,对应于一个 serve,即用户态的 BpBinder 对象 |

| binder_ref | 描述对 binder 实体节点的引用,关联到一个 binder_node |

| binder_buffer | 描述 binder 通信过程中存储数据的Buffer |

| binder_work | 描述一个 binder 任务 |

| binder_transaction | 描述一次 binder 任务相关的数据信息 |

| binder_ref_death | 描述 binder_node 即 binder server 的死亡信息 |

其中主要结构体引用关系如下:

面试官:可以,我们再来聊聊别的。

这个问题虽有些 “面试造火箭” 的无奈,可难点就是亮点、价值所在,是筛选面试者的有效手段。如果问你这个问题,你能回答多少呢?

最后


最近整理了一份《Android Binder原理学习笔记》,集合了**「Linux、C/S架构、ServiceManager、ProcessState、系统服务的注册过程、ServiceManager的启动过程、系统服务的获取过程、MediaPlayerService、JNI、Binder类的注册、AMS、JavaBBinder」**等N多技术点。

目录:

一、学习Binder前必须要了解的知识点

二、ServiceManager中的Binder机制

三、系统服务的注册过程

四、ServiceManager的启动过程

五、系统服务的获取过程

六、Java Binder的初始化

七、Java Binder中系统服务的注册过程

  • 由于篇幅原因,为了避免影响到大家的阅读体验,在此只以截图展示部分内容,有需要的小伙伴【点击我】免费领取。

部分笔记截图

一、学习Binder前必须要了解的知识点

1.Linux和Android的IPC机制种类

2.Linux和Binder的IPC通信原理

3.为什么要使用Binder

4.为什么要学习Binder?

二、ServiceManager中的Binder机制

1.基于Binder通信的C/S架构

2.MediaServer的main函数

3.每个进程唯一的ProcessState

4.ServiceManager中的Binder机制

三、系统服务的注册过程

1.从调用链角度说明MediaPlayerService是如何注册的

2.从进程角度说明MediaPlayerService是如何注册的

四、ServiceManager的启动过程

1.ServiceManager的入口函数

1.1 打开binder设备

1.2 注册成为Binder机制的上下文管理者

1.3 循环等待和处理client端发来的请求

  • 由于篇幅原因,为了避免影响到大家的阅读体验,在此只以截图展示部分内容,有需要的小伙伴【点击我】免费领取。

五、系统服务的获取过程

1.客户端MediaPlayerService请求获取服务

2.服务端ServiceManager处理请求

六、Java Binder的初始化

1.Java Binder的JNI注册

1.1 Binder类的注册

1.2 BinderInternal类的注册

七、Java Binder中系统服务的注册过程

1.将AMS注册到ServiceManager

1.1 BinderInternal.getContextObject()

1.2 ServiceManagerNative.asInterface()

1.3 getIServiceManager().addService()

2.引出JavaBBinder

3.解析JavaBBinder

4.Java Binder架构

架构师筑基包括哪些内容

我花了将近半个月时间将:深入 Java 泛型.、注解深入浅出、并发编程.、数据传输与序列化、Java 虚拟机原理、反射与类加载、高效 IO、Kotlin项目实战等等Android架构师筑基必备技能整合成了一套系统知识笔记PDF,相信看完这份文档,你将会对这些Android架构师筑基必备技能有着更深入、更系统的理解。

由于文档内容过多,为了避免影响到大家的阅读体验,在此只以截图展示部分内容

注:资料与上面思维导图一起看会更容易学习哦!每个点每个细节分支,都有对应的目录内容与知识点!



这份资料就包含了所有Android初级架构师所需的所有知识!

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

67931240)]
这份资料就包含了所有Android初级架构师所需的所有知识!

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 28
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值