• 9.11 Binder系统_分层


    1、Binder系统过程分析,情景分析

    server提供服务

    (1)addService(服务名称,xxx)执行后会导致binder驱动在server的内核空间为服务创建一个binder_node结构体,并且会在service_manager内核空间创建一个binder_ref,其node参数指向server内核空间的binder_node,desc参数等于1,根据addService的次数递增,并且在service_manager的用户空间中的svclist链表上新建一个svcinfo结构体,其name参数等于服务名字,handle参数等于内核空间中binder_ref.desc=1

    (2)addService(服务名称2,xxx)执行后会导致binder驱动在server的内核空间为服务2创建一个binder_node结构体,并且会在service_manager内核空间创建一个binder_ref,其node参数指向server内核空间的新binder_node,desc参数等于2,根据addService的次数递增,并且在service_manager的用户空间中的svclist链表上新建一个svcinfo结构体,其name参数等于服务名字2,handle参数等于内核空间中binder_ref.desc=2

    (5)根据收到的ptr和cookie分辨client想使用哪个服务,根据client提交的数据分辨client想使用哪个服务里的函数

    service_manager管理服务

    ()

    ()

    ()

    client使用服务

    (3)getService(“服务名称2”)发给service_manager,在svclist中找到名字相同的srvinfo,得到handle=2,service_manager根据handle=2找到对应的binder_ref,在client内核态创建client进程的binder_ref,其node指向service_manager中找到的binder_ref的node,其实就是指向server进程中对应服务的binder_node,client进程的binder_ref.desc =1,desc的值根据getService的调用递增,把desc=1从内核空间返回给用户空间作为getService的返回值

    (4)使用服务构造数据,向handle=1使用ioctl发送数据,进入client的内核态后根据handle=1找到client中对应的binder_ref,进而找到server进程中对应的binder_node,然后找打proc,其表示为server进程,并且把client构造的数据以及server进程中对应的binder_node的ptr和cookie传给server

    binder系统分层:

    第一层是服务层

    C++中实现的服务端:

    test_client.cpp中是使用sayhello或者sayhello_to,不关心其实现,实现由BnHelloService.cpp来实现sayhello和sayhello_to做正真的事情

    Java中实现的服务端:

    TestClient.java中是使用sayhello或者sayhello_to,不关心其实现,实现由HelloService.java来实现sayhello和sayhello_to做正真的事情

    第二层是RPC(远程调用)

    C++中实现的RPC:

    BpHelloService.cpp中实现sayhello和sayhello_to(构造数据、发送数据(remote()->transact()来发送))

    BnHelloService.cpp的onTransact根据收到的数据调用sayhello或者sayhello_to

    Java中实现的RPC:

    IHelloService.java中Stub.Proxy中实现sayhello和sayhello_to(构造数据、发送数据(mRmote.transact))

    IHelloService.java中Stub.onTransact接受数据并分析数据调用函数

    第三层是IPC(进程间通信)

    C++中实现IPC:

    怎么发数据?

    remote()得到一个Bpbinder对象,最终调用IPCThreadState::self()->transact来发送数据 

    怎么收数据?

    IPC_ThreadState::self()->joinThreadPool()它是一个循环,会调用ioctl读数据

    怎么调用到该服务的onTransact函数

    在addService("hello",new BnHelloService)注册内核的时候新建的Binder_node.cookie指向这个BnHelloService

    server收到数据后取出cookie,转换为binder指针,调用他的transact函数,其又会调用onTransact,其就是派生类BnHelloService实现的函数

    Java中怎么实现IPC

    怎么发数据?

    调用IPCThreadState::self()->transact来发送数据,同时上层是用Java写的,而这里是用的c++,这里面会涉及到JNI过程

    怎么收数据?

    IPC_ThreadState::self()->joinThreadPool()它是一个循环,会调用ioctl读数据,其也设计到JNI

    怎么调用到该服务的onTransact函数

    如果使用C++来实现服务,除了IPC层外,其它两层都需要自己来实现;如果使用Java,仅需要实现服务层

  • 相关阅读:
    JSP实验四
    servlet应用
    SWPU电子邮件页面
    Java Web基础
    软件工程课程总结
    Beta-星期五
    个人作业-Alpha项目测试
    第三次作业
    学期总结-西北师范大学-18计师班助教牛百泉
    Java学习计划
  • 原文地址:https://www.cnblogs.com/liusiluandzhangkun/p/9157392.html
Copyright © 2020-2023  润新知