在cameraservice启动时粗略看了一些binder,这里就binder机制进行进一步学习。
一.分类
Binder任意一个进程无法同时使用dev/binder和dev/vndbinder,是目前android binder sdk的限制,因为两者都是共用Binder SDK

  1. /dev/binder System分区 AIDL
  2. vndBinder Vendor分区  AIDL
  3. hwBinder 可以跨System和Vendor分区使用 使用hwservicemanager,libhwbinder代码,HIDL

二、优势
对比其他IPC方式,binder机制显然很有优势:
高效:一次拷贝
安全:pid/uid区分 进程id和用户应用id
CS架构
Binder

Binder
三.通信流程:

1)首先服务端需要向ServiceManager进行服务注册,ServiceManager有一个全局的service列表svcinfo,用来缓存所有服务的handler和name。

2)客户端与服务端通信,需要拿到服务端的对象,由于进程隔离,客户端拿到的其实是服务端的代理,也可以理解为引用。客户端通过ServiceManager从svcinfo中查找服务,ServiceManager返回服务的代理。

3)拿到服务对象后,我们需要向服务发送请求,实现我们需要的功能。通过 BinderProxy 将我们的请求参数发送给 内核,通过共享内存的方式使用内核方法 copy_from_user() 将我们的参数先拷贝到内核空间,这时我们的客户端进入等待状态。然后 Binder 驱动向服务端的 todo 队列里面插入一条事务,执行完之后把执行结果通过 copy_to_user() 将内核的结果拷贝到用户空间(这里只是执行了拷贝命令,并没有拷贝数据,binder只进行一次拷贝),唤醒等待的客户端并把结果响应回来,这样就完成了一次通讯。

四、代码分析

五、问题记录

1.serviceManager启动,mmap申请128K内存,用户空间申请1M-8K内存:提高小龙,backing store保护页,内核本身的保护页

相关文章: