【luckymoney源码】【rc-form 源码】【爱易语言源码】binder驱动源码_binder驱动源码详解

时间:2024-11-08 11:06:42 编辑:空间源码选择 来源:南昌到庐山源码

1.Android进阶——Android跨进程通讯机制之Binder、驱动驱动IBinder、源码源码Parcel、详解
2.Carson带你学Android:全面剖析Binder跨进程通信原理
3.AndroidFramework 之启动 ServiceManager
4.framework之binder机制
5.你对Framework 底层中的驱动驱动 Binder机制原理了解多少?
6.Framework层的Binder(源码分析篇)

binder驱动源码_binder驱动源码详解

Android进阶——Android跨进程通讯机制之Binder、IBinder、源码源码Parcel、详解luckymoney源码

       前言:

       Binder机制是驱动驱动Android系统提供的跨进程通讯机制,这篇文章会从基础概念知识开始介绍,源码源码引出Binder机制,详解并归纳其在Linux系统中的驱动驱动优缺点。接着分析Binder的源码源码通信模型和原理,重点介绍AIDL实现原理,详解以及AMS的驱动驱动Binder体系。文章将穿插介绍IBinder、源码源码Binder、详解Parcel等关键组件,旨在为读者提供易于理解的阅读体验,不涉及Framework层的深度原理,适用于具备AIDL使用基础的读者。

       基础概念:

       本文将从Linux相关基础概念出发,介绍进程隔离、用户空间与内核空间、系统调用与内核态/用户态,以及内核模块/驱动,帮助读者理解Binder驱动出现的原因。

       一、进程隔离

       为了保证安全,Linux系统中的进程不能操作其他进程的数据。通过虚拟内存机制,每个进程拥有独立的线性连续内存空间。操作系统将虚拟内存空间映射到物理内存,rc-form 源码实现进程间的隔离。然而,进程间的数据通讯是不可避免的,因此需要跨进程通信机制。

       二、用户空间与内核空间

       用户空间表示进程运行在特定操作模式中,无权接触物理内存或设备。内核空间则是独立于应用程序,可以访问受保护的内存空间和底层硬件设备。用户进程通过系统调用与内核空间进行交互。

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

       系统调用是用户空间访问内核空间的唯一方式。在Linux系统中,通过四层环的概念,安全边界得以实现,其中1号环持有最高权限,3号环持有最低权限。用户进程需通过系统调用实现跨权限访问。

       四、内核模块与驱动

       内核模块/驱动通过系统调用实现用户空间与内核空间之间的通信。在Android系统中,Binder驱动作为运行在内核空间的模块,负责各个用户进程间的通讯,实现了进程间的高效、安全通信。

       五、总结

       将前面的概念综合理解,可以更好地消化知识点:进程隔离导致内存隔离、进程间通信需求、系统调用与内核模块/驱动的爱易语言源码使用。Binder驱动正是内核模块/驱动中的关键组件,用于实现Android系统的跨进程通信。

       为什么要用Binder:

       Binder机制相较于Linux系统提供的其他跨进程通信方式,如管道、消息队列、信号量、内存共享、套接字等,具有传输性能好、安全性强等优势。

       Binder通信模型与原理:

       模型包括服务端注册、客户端获取服务、通信过程。服务端通过Binder驱动在ServiceManager中注册,客户端通过Binder驱动获取并进行通信。

       Binder对象与驱动:

       Binder驱动对具有跨进程传递能力的对象进行特殊处理,自动完成代理对象与本地对象的转换,保存了每个跨越进程的Binder对象的相关信息。

       Java层的Binder与AIDL:

       Binder类和BinderProxy类继承自IBinder,具备跨进程传输能力。IBinder是远程对象的基本接口,用于高性能的远程调用。AIDL生成的Stub类继承自Binder,实现了远程服务与客户端的交互。

       AIDL实现流程:

       服务端实现Stub接口,客户端通过bindService回调获取AIDL接口。调用Stub.asInterface获取BinderProxy对象,进而调用add方法。AIDL原理包括Stub类、asInterface方法、付费下载php源码add方法的实现,以及数据传输过程。

       AMS的Binder体系:

       AMS作为Android核心服务,负责组件启动、切换、调度及应用进程管理。Binder体系在其中发挥关键作用,实现高效、安全的进程间通信。

       结语:

       本文简要介绍了Binder机制的基本原理,旨在提供易于理解的入门知识。未来将深入探讨Framework层的详细原理。鼓励读者通过手写远程Service实现跨进程通信,以加深对AIDL和Binder的理解。

Carson带你学Android:全面剖析Binder跨进程通信原理

        从而全方位地介绍 Binder ,希望你们会喜欢。

        在本文的讲解中,按照 大角度 -> 小角度去分析 Binder ,即:

        从而全方位地介绍 Binder ,希望你们会喜欢。

        在讲解 Binder 前,我们先了解一些 Linux 的基础知识

        具体请看文章: 操作系统:图文详解 内存映射

        Binder 跨进程通信机制 模型 基于 Client - Server 模式

        此处重点讲解 Binder 驱动作用中的跨进程通信的原理:

        原因:

        所以,原理图可表示为以下:

        所以,在进行跨进程通信时,开发者只需自定义 Client & Server 进程 并 显式使用上述3个步骤,最终借助 Android 的基本架构功能就可完成进程间通信

        注册服务后, Binder 驱动持有 Server 进程创建的 Binder 实体

        此时, Client 进程与 Server 进程已经建立了连接

        Client 进程 根据获取到的 Service 信息( Binder 代理对象),通过 Binder 驱动 建立与 该 Service 所在 Server 进程通信的链路,并开始使用服务

        步骤1: Client 进程 将参数(整数a和b)发送到 Server 进程

        步骤2: Server 进程根据 Client 进要求 调用 目标方法(即加法函数)

        步骤3: Server 进程 将目标方法的扫描领取红包源码结果(即加法后的结果)返回给 Client 进程

        对比 Linux ( Android 基于 Linux )上的其他进程通信方式(管道、消息队列、共享内存、

        信号量、 Socket ), Binder 机制的优点有:

        特别地,对于从模型结构组成的Binder驱动来说:

        不定期分享关于安卓开发的干货,追求短、平、快,但却不缺深度

AndroidFramework 之启动 ServiceManager

        本文源码基于 Android ,涉及相关源码如下。

        ServiceManagaer 是 Binder 的守护进程,在 Binder 机制中起着重要的作用。本文将从源码的角度对其进行分析,整体流程如下:

        时序图如下。

        先来看看 ServiceManager 是如何启动的:

        在 Zygote 一文中说过, init 进程启动的第二阶段会解析 init.rc 文件。

        在这之后会触发 trigger init 。

        结合 init.rc 看看 action init 做了什么。

        当触发 trigger init 后,会启动 servicemanager 服务,其声明如下。

        对应的执行文件为 /system/bin/servicemanager ,在编译前位于 frameworks/native/cmds/servicemanager 下,来看看 Android.bp 。

        其对应的源码为 service_manager.c 和 binder.c ,入口函数 main() 位于 servicemanager.c 。

        启动完 ServiceManager 后会打开 Binder 驱动。

        在 main() 中首先调用 binder_open() 。

        binder_open() 主要做了如下事情:

        给结构体 binder_state 分配内存。

        系统调用 open() 打开 /dev/binder ,如果打开驱动失败,则执行 fail_open 释放内存。

        简单的解释一下什么是系统调用?

        由于需要限制不同的程序之间的访问能力,防止程序获取别的程序的内存数据, CPU 划分出两个权限等级,用户态和 内核态。

        所有的用户程序都是运行在用户态,但有时需要做一些内核态的事情,而唯一可以做这些事情的就是操作系统,所以程序需要向操作系统发起请求,以程序的名字来执行这些操作。这时就需要一个从用户态切换到内核态但不能控制内核态中执行的机制,这种机制就是 系统调用。

        系统调用 ioctl() 传入 BINDER_VERSION 命令获取 Binder 驱动版本,对比版本是否一致,不一致则执行 fail_open 释放内存。

        系统调用 mmap() 映射 kb 的内存空间,即把 Binder 驱动文件的 kb 映射到内存空间供 ServiceManager 使用,内存映射失败则执行 fail_map ,关闭 fd 并释放内存。

        ServiceManager 进程 mmap 的内存大小可以通过 adb shell 命令查看。

        可以看到内存映射地址为 0xff ~ 0xf ,差为 0x 即十进制的 kb 。

        打开 Binder 驱动后会将 ServiceManager 设置为上下文管理者。

        调用 binder_become_context_manager() 。

        android 新增 BINDER_SET_CONTEXT_MGR_EXT 命令来设置安全的上下文管理者,如果设置失败,则使用原有的 BINDER_SET_CONTEXT_MGR 命令来设置上下文管理者,两者区别在于是否携带参数。

        最后会进入循环,从 Binder 驱动读取和解析数据。

        调用 binder_loop() 进入循环,不断地通过系统调用 ioctl() 从 Binder 驱动读取数据,并通过 binder_parse() 进行数据解析。

        注意这里调用 binder_loop() 传入的 svcmgr_handler() ,后面会使用到。

        binder_write() 会封装 struct binder_write_read ,并通过系统调用 ioctl() 将对应的命令传递给 Binder 驱动。

        binder_parse() 用来解析从 Binder 驱动读取到的数据,然后根据不同的命令执行对应的操作。

        因为 cmd 命令可能有多个,所以通过 while 循环每次处理一个 cmd 命令,多 cmd 的结构大致如下图所示。

        这里重点看下 BR_TRANSACTION 命令。

        BR_TRANSACTION 是 Binder 驱动向 Server 端发送请求数据。

        binder_transaction_data 的结构如下,其表明了 transcation 传输的具体语义,语义码记录在 code 中,不同语义码携带的数据是不同的,这些数据由 data 指定。

        在解析完 binder_transaction_data 的具体语义后,会调用前面传给 binder_loop() 的 svcmgr_handler() ,其实就是 switch case 语义码做不同的事情。

        ServiceManager 的功能其实很简单:

        至此 ServiceManager 就分析完了。

framework之binder机制

       Android 中的 Binder 是一个关键的进程间通信(IPC)机制,用于实现系统服务和应用程序之间的通信。Binder 由 Binder 驱动程序管理,支持跨进程数据交换。通过 AIDL(Android Interface Definition Language)定义接口,开发者可以创建服务提供者和客户端进行 IPC 通信。本文将详细解析 Binder 的组成、机制、优势以及与 AIDL 的关系。

       Binder 机制的组成:

       1. **binder接口**:定义远程服务接口,没有具体实现,用于服务调用,如 AIDL 文件中的接口。

       2. **IBinder接口**:实现 binder 接口,服务的具体实现。

       3. **servicemanager**:服务的管理器,客户端和服务端通过它获取和注册服务。

       4. **binder驱动程序**:关键组件,实现跨进程通信。示例代码展示了如何通过 Binder 驱动程序在不同进程间进行数据交换。

       为什么要使用 Binder?

       Binder 提供了高效、安全的跨进程通信方式,适合 Android 系统。相比其他方式,如共享内存、Socket、管道和信号量,Binder 在效率、安全性、易用性方面表现更优。例如,Binder 只需拷贝一次,效率接近共享内存,且采用传统的 C/S 结构。

       Binder 实现机制解析:

       1. **Linux 内存概念**:虚拟内存、用户空间、内核空间和 MMap。虚拟内存提供大容量的内存空间,隔离进程间的数据访问,实现内存共享和惰性加载,同时内核通过 MMap 实现文件和设备的内存映射。

       2. **binder 原理**:采用 C/S 架构,涉及 Client、Server、ServiceManager 和 Binder 驱动。ServiceManager 是整个机制的核心,负责服务的注册与获取。Client 和 Server 通过 ServiceManager 与 Binder 驱动交互,实现 IPC。

       AIDL 与 Binder 关系概述:

       AIDL 用于定义跨进程接口,而 Binder 则是实现这些接口的底层驱动,负责进程间的数据传输。在 Android 开发中,通过 AIDL 定义接口,借助 Binder 实现服务的提供与调用,简化了 IPC 通信的复杂性。

       本文详细介绍了 Binder 的机制、组成、实现方式以及与 AIDL 的关系,为开发者提供了深入理解 Android 进程间通信机制的框架。

你对Framework 底层中的 Binder机制原理了解多少?

       Binder 是一种高效、方便、安全的进程间通信方式,用于 Android 中的系统服务和应用程序间的交互。其通信模型涉及四方:Binder 驱动层、Client 端、Service 端和 ServiceManager。Client 端和 Service 端通过 ServiceManager 作为上下文管理者来注册和获取服务。

       Client 和 Service 通过 binder_open 打开驱动,根据返回的文件描述符进行内存映射,分配缓冲区,并启动 binder 线程。ServiceManager 的主要功能是注册和获取服务,通过 binder_open 打开驱动,注册为大管家,并进入 binder_loop 循环处理请求。

       Service 注册时,首先启动 binder 机制,注册线程,然后初始化服务,最后通过 ServiceManager 注册。ServiceManager 获取服务的 Binder 代理对象,通过 defaultServiceManager 和 getStrongProxyForHandle(0) 方法实现。

       Client 获取服务同样通过 ServiceManager 的代理对象实现。Binder 驱动层在处理请求时,根据 handle 值封装 BinderProxy 对象,完成注册过程。

       IPC 通信流程涉及 Proxy、Binder、Parcel 和 BpBinder。从应用层的 Proxy 的 transact 函数开始,传递到 Java 层的 BinderProxy,再到 Native 层的 BpBinder 的 transact。BpBinder 的 transact 实际上是调用 IPCThreadState 的 transact 函数,通过 handle 值找到 Binder 实体对象。

       Service 端的通信涉及 Binder 线程、getAndExecuteCommand 和 executeCommand。在执行命令时,通过 onTransact 函数处理请求,然后发送 BC_REPLY 响应。Binder 对象在 Parcel 中通过 readStrongBinder/writeStrongBinder 存储,存储原理是 flat_binder_object。

       OneWay 是异步调用机制,不需要等待返回结果。系统服务常使用 OneWay,如 Activity 启动。Framework 中使用管道、Socket、共享内存和信号进行进程间通信,这些机制各有特点,用于不同场景。

       对于 Android Framework 的深入理解,不仅包括底层原理,还应理解如何在实际开发中运用。为了帮助开发者更深入地掌握 Framework 底层原理,《Android Framework核心笔记》及相关学习资料提供了全面的指导。这些资源涵盖了 Handler、Binder、Zygote、AMS、PMS、WMS 等关键组件的实现细节,是提升 Android 开发能力的宝贵资源。

Framework层的Binder(源码分析篇)

       本文以android-.0.0_r的AOSP分支为基础,解析framework层的Binder工作原理。

       从ServiceManager的getService方法入手,其核心代码是通过getIServiceManager().getService(name)获取服务。首先,ServiceManager的实现与进程中的ProcessState密切相关,ProcessState是单例,负责打开和映射Binder驱动。构造函数中,它会初始化驱动、验证版本并设置线程数,接着进行binder映射。

       在ProcessState的getContextObject方法中,调用native函数android_util_Binder.cpp中的getContextObject()。这个函数通过handle 0(ServiceManager的handle)获取BpBinder对象,然后通过javaObjectForIBinder函数将其转换为Java中的类型。

       进一步分析,BpBinder与java层的Binder之间存在对应关系,通过BinderProxy NativeData创建单例的BinderProxy。然后,每个服务的BinderProxy实例化和计数处理都在这个过程中完成。ServiceManagerNative.asInterface方法简化了getIServiceManager的调用,通过调用asInterface实例化ServiceManagerProxy。

       IServiceManager接口通过AIDL生成,其代理类ServiceManagerProxy实际上是不必要的。aidl文件在编译时生成对应java代码,用于binder通信。通过aidl文件,我们可以看到如queryLocalInterface等方法的实现细节。

       在Parcel的协助下,客户端与服务端进行数据传递,通过序列化和反序列化进行交互。在transact函数中,对Parcel大小进行检查,避免数据传输过大导致的问题。最后,客户端与binder驱动的通信过程涉及了Transaction数据的写入、等待响应、数据处理和内存回收等步骤。

       总的来说,framework层的Binder工作涉及服务管理、数据转换、通信协议和内存管理等环节,理解这些有助于深入掌握Binder的工作机制。