zoukankan      html  css  js  c++  java
  • Binder相关

    Binder分析

        需了解C/S还有管理这些的ServiceManager。

        简单来讲你(client)有个包裹(parcel)让快递员(proxy)送到公司(server),

       公司(server)接到包裹(parcel)后检查是否是自己的,是的话解开包裹,找相应的部门(corresponding method)处理。然后告诉你(client)。

        ProcessState一个进程只能有一个。

    1. 首先打开/dev/binder设备,可以与binder交互了。
    2. Fd使用mmap使binder分配一块内存来接收。
    3. getContextObject函数返回一个IBinder指针。

     BpBinder与BBBinder

           BpBinder是client端创建的用于消息发送的代理,而BBinder是server端用于接收消息的通道。

    1. IServiceManager中调用asInerface的时候回创建BpBinder。
    2. 这两个类都是有IBinder派生出来的。
    3. BpBinder是客户端用来与Server交互的代理类,p即为Proxy的意思。
    4. BBinder是与proxy相对的一端,如果说Bpbinder代表客户端BBinder则是服务端。
    5. BpBinder与BBinder 是一一对应的。Binder系统通过handler来表示对应的BBinder。
    6. BnServicexxx是由BBinder派生,BpServicexxx是由BpBinder派生。
    7. 可以认为是Binder的一个道具。
    8. BpBinder构造函数传的参数handle的值是0(NULL),0代表ServiceManager所对应的BBinder。
    9. 在addService函数中把请求数据打包成data后传给BpBinder的transact函数。
      此函数由IPCThreadState的tanscat来完成。
      此函数中利用BC_消息码从应用程序发往Binder设备的,而回应请求时BR_开头的消息码。发送消息后会等待回应。
    10. IPCThreadState发送binder的数据(请求),然后等待回应。

    每个IPCThreadState中都有一个mIn,mOut,其中mIn是用来接收来自Binder设备的数据的,相反mOut是存储发往Binder设备的数据。

          

    Vold (Volume Daemon) & RILD(Radio Interface Layer Daemon)

        Vold:

           管理外部存储设备的后台进程。SD卡的插拔检查,SD卡挂载,卸载,格式化

           工作流程:

    1. 从kernel项NM(Netlink Manager)发送uevent消息。
    2. NM转发给VolumeManager模块。
    3. VolumeManager通过CommandListener发送给MountService。
    4. MountService发送指令给VOLD。

    Netlink与Uevent:

           Netlink:用户空间与Kernel通讯机制。

           Uevent:设备发送变化是发送的消息(字符串)。存在uevent文件。

    RILD:

        注释:多处理器(AP[Application Processor] & BP[Baseband Processor])

             AP是用来跑OS的,BP是用来辅助射频无线通讯相关工作。

        工作:

           RILD是运行在AP上,通过RILD使AP与BP通讯发送AT指令来完成。

                             

        Dial拨号:

           Phone应用提供了以个PhoneUtils类

           PhoneUtils.java

               调用Phone.dial(number); Phone对象是GSMPhone的代理PhoneProxy。

           GSMPhone.java

               调用GsmCallTrack.dial();

           GsmCallTrack.java

               构造一个GsmConnetion对象,调用RIL的dial(cm.dial())函数。

           RIL.java

               RIL是rild socket的唯一客户端。

               RIL的构造函数中封装了两个线程

                  mSenderThread:用来向Rild发送消息。

         mReceiverThread:用来从Rild中接收消息,还与rild进行socket连接。  

                    dial();

                        发送请求到Rild中

           Rild.cpp

       收到数据时由eventLoop调用对应的任务处理函数处理(processCommandsCallback函数);

        processCommandsCallback:

        将从socket中read数据到缓冲区中,处理命令找出执行对应命令的函数。Rild中打电话的处理函数是dispatchDial(Ril.c)。

           Ril.c

                  创建RIL_Dial对象(存储打电话所需要的一些参数)

          调用RIL_RadioFunctions的onRequest函数,即向RefRil库发送请求。

           Reference_Ril.c

                  发送AT指令。通知处理完成到java中的RIL的RILReceiver处理。

  • 相关阅读:
    初学git(一):创建本地“仓库”
    git常用命令
    Linux学习(一):从图形界面进入命令行及命令行进入图形界面
    继承与派生
    数据类型和表达式
    UDP
    网络与通信
    枚举类型
    结构体
    第一个随笔
  • 原文地址:https://www.cnblogs.com/hongguang-kim/p/4884793.html
Copyright © 2011-2022 走看看