美文网首页
进程间通讯——Binder

进程间通讯——Binder

作者: 修塔寻千里 | 来源:发表于2020-02-01 21:40 被阅读0次

    Binder主要涉及以下四个组成元素:

    • Binder驱动
    • Service Manger
    • Binder Client
    • Binder Server
      Binder的本质就是进程1希望与进程2进行交互,它们之间必须借助Binder驱动来实现通讯,Service Manner用于提供进程的地址信息。

    Binder驱动

    Binder驱动是一个标准的Linux驱动,具体而言,Binder Driver会把自己注册成一个misc device,并向上层提供一个/dev/binder结点——Binder结点并不对应真实的硬件设备,Binder驱动运行于内核态,可以提供open(),ioctl(),mmap()等常用的文件操作。
    使用流程:

    1、打开Binder驱动

    层次进程在访问Binder驱动时,首先需要打开/dev/binder结点,这个操作最终实现的是binder_open()方法。

    2、内存映射

    对于应用程序而言,通过mmap()返回值得到一个内存地址(虚拟地址),这个地址通过虚拟内存转换(分段、分页)后,最终会指向物理内存的某个位置。
    对于Binder驱动而言,它有一个指针指向某个虚拟内存地址,而经过虚拟内存转换后,它和应用程序中指向的物理内存处于同一个位置。
    这时Binder和应用程序就拥有了若干共用的物理内存块,当两个进程共同指向相同的物理地址即可实现进程间的数据共享,且Binder驱动只用了一次复制。


    Binder内存映射

    3、binder_ioctl

    这是Binder驱动实现业务的重要方法,Binder并不提供read()和write()等文件操作,最终由binder_ioctl来实现。

    ServiceManger

    ServiceManger的功能可以类比为互联网中“DNS”服务器,“IP地址”为0,SM是一个标准的Binder Server,其他Binder Server向其注册,Binder Client向其请求并查询服务的ID。
    ServiceManger内部维护着一个svclist列表,用于存储所有的Server相关信息(以svcinfo为数据结构),查询和注册都是基于这个表展开的。

    参考资料

    • 深入理解Android内核设计思想. 林学森。

    相关文章

      网友评论

          本文标题:进程间通讯——Binder

          本文链接:https://www.haomeiwen.com/subject/caovthtx.html