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