9.1 Binder系统_C程序示例_框架分析和编写程序

IPC : Inter-Process Communication, 进程间通信

A进程把数据原原本本的发给B,这就是IPC


RPC : Remote Procedure Call, 远程过程调用

A进程如果想调用其无权限调用的led_open函数,而B进程可以调用:A进程封装数据发送给B;B进程取出数据调用led_open函数,这个过程就是RPC,其中A进程发数据给B的过程也是IPC,即RPC利用IPC来完成

进程间通信其实质也是需要三要素:源、目的、数据,这里源是进程A,目的怎么确定呢,进程B向ServiceManager注册服务,进程A向ServiceManager查询服务得到Handler,这个Handler指向进程B;数据就是个buf

android系统中的binder设计四个要素:client(进程A)、server(进程B)、ServiceManager(让A知道向谁发数据)、binder驱动(给前三者提供获取数据的接口)

RPC远程过程调用可以简单的理解为进程A想调用进程B的函数,那么

(1)调用哪一个函数

对server的函数编号,client编号给server

(2)传给它什么参数

再放在协商好的buf中,通过IPC传输

(3)返回值

B进程通过IPC发送返回值给进程A

ServiceManager所做的事情:

(1)open驱动

(2)while(1)

 {

   读驱动获取数据,没数据的时候休眠 

   解析数据

   (根据获得的数据调用,比如server注册服务的时候提供的注册数据、client获取服务的数据信息)

    1、注册服务,在链表中记录服务名

    2、查询链表中是否有所需的服务,返回“server进程”的handle

 }

server所做的事情:

(1)open驱动

(2)注册服务:向ServiceManager发送服务名

(3)while(1)

  {

    读驱动获得client发送的数据,没有数据则休眠

    解析数据

    调用对应的函数

  }

client所做的事情:

(1)open驱动

(2)获取服务:向ServiceManager查询服务,获得一个handle

(3)向handle发数据

frameworks\native\cmds\servicemanager   //系统自带用C语言实现的binder应用程序
service_manager.c :
a. binder_open
b. binder_become_context_manager
c. binder_loop(bs, svcmgr_handler);
c.1 res = ioctl(bs->fd, BINDER_WRITE_READ, &bwr);
c.2 binder_parse
// 解析
// 处理 : svcmgr_handler
SVC_MGR_GET_SERVICE/SVC_MGR_CHECK_SERVICE : 获取服务
SVC_MGR_ADD_SERVICE : 注册服务
// 回复

bctest.c  //半成品
注册服务的过程:
a. binder_open
b. binder_call(bs, &msg, &reply, 0, SVC_MGR_ADD_SERVICE)
// 含有服务的名字
// 它会含有servicemanager回复的数据
// 0表示servicemanager
// code: 表示要调用servicemanager中的"addservice函数"


获取服务的过程:
a. binder_open
b. binder_call(bs, &msg, &reply, target, SVC_MGR_CHECK_SERVICE)
// 含有服务的名字
// 它会含有servicemanager回复的数据, 表示提供服务的进程
// 0表示servicemanager
// code: 表示要调用servicemanager中的"getservice函数"

binder.c (封装好的C函数)

binder_call分析


源码下载方法

第一次:
git clone https://github.com/weidongshan/APP_0003_Binder_C_App.git

更新:
git pull origin

取出指定版本:
git checkout v1 // v1, 未查错, 不能编译
git checkout v2 // v2, 可以编译了, 未验证是否能正常运行
git checkout v3 // OK


上机测试:
a. 烧写非android系统, 比如QT
b. 重新编译内核让它支持NFS, 更新板上内核
make menuconfig
File systems --->
[*] Network File Systems --->
<*> NFS client support
[*] NFS client support for NFS version 3
[*] NFS client support for the NFSv3 ACL protocol extension
[*] NFS client support for NFS version 4
[*] NFS client support for NFSv4.1 (EXPERIMENTAL)
[*] Root file system on NFS
[*] Use the legacy NFS DNS resolver
[*] Use the new idmapper upcall routine

make zImage

c. mount nfs, 运行service_manager, test_server, test_client

mount -t nfs -o nolock 192.168.1.123:/work /mnt
./service_manager &
./test_server &
./test_client hello
./test_client hello weidongshan

猜你喜欢

转载自www.cnblogs.com/liusiluandzhangkun/p/9134327.html
9.1
今日推荐