Android FrameWork (四)
binder &service_manager && ServiceManager
知识回顾:
init
ZygoteInit
Systemserver
源码分析:
会比较麻烦的一个模块:
横跨我们应用层- framework-驱动层 java- native-内核
client binder server之间的关系图:
client_binder_server关系图.png
SystemServer.java
ActivityManagerService.java
SystemServiceManager.java
ServiceManager.java
关系图:
暂存
ServiceManager.rc:
service_manager.c:
总结:
1,bind_open :打开了binder驱动 对Binder_version校验 映射了内存空间 大小是128k
2,调binder_becom_context_manager 设置 让自己成为binder设备的上下文管理者
3,调用binder_loop 让service_manager进入死循环状态,binder设备进入loop的状态 ioctl(BINDER_WRITE_READ)
4,binder_parse客户端数据进行解析,并且进行回调 svcmgr_handler处理
binder.c
总结:
1,binder_init: 函数 注册binder驱动(mmap open flush release)
2,binder_open: 创建binder_proc,并且初始化进程信息,pid todo wait
把binder_proc 添加到binder_procs
3,binder_mmap: 开辟内核空间128k 同时开辟物理内存 把内核空间和物理空间进行映射,让他们两个指向同一个地址
4,binder_ioctl: 对设备进行读写操作
servicemanager/binder.c
#######总结:
一个串联关系图:
binder_service_manager关系图.png
补充前提知识:
Binder传统ipc怎么进行通信的?
系统里进程之间是相互隔离的,a进程无法直接访问b进程,每个进程里分为用户空间和内核空间
截屏2023-04-13 下午4.29.01.png
sp:StrongPointer.h. 智能指针
拓展知识:
-
性能上:稳定性: 安全:
Binder : 一次拷贝 c/s架构 客户端和服务端 稳定 内核层校验系统来保证通信安全
共享内存:0次 不稳定会有同步问题和并发死锁问题 自定义协议
管道pipe:需要两次拷贝 单管道 效率低只能读或者只能写 自定义协议
Socket:两次拷贝 c/s架构 不好的地方消耗性能握手和挥手 自定义协议 -
(拓展知识:ServiceManager.rc比我们的zygote更先执行,这里执行文件的大小顺序:core-> main->late_start)
面试题:
1,binder是什么?原理是什么?
binder是一个虚拟的硬件设备,它是一个驱动程序,也是Android特有的一种通信方式,它的好处是一次拷贝效率高,把我们的用户空间,内核空间,物理内存都映射在了一个地址,这样它就少了一次拷贝,也可以参考前期讲的集中通信方式管道 进行讲讲区别,也可以讲讲几个函数方法比如binder_open binder_mmap binder_ioctl几个函数进行讲解一下。
2,binder是怎么进行工作的?
这个话题比较大,参考流程图进行分析。以命令流的方式进行讲解 比如 client binder server之间的关系图进行讲解,如果更专业的方式就是代码的调用流程图更加的专业。
3,binder是给我们的每个应用分配的内存是多少?如果不够用了怎么办?
ProcessState.cpp:中会设置常量大小
binder_vm_size(1M-8k). 的大小。默认给我们每个应用是这些
service_manager 比较特殊是128k
如果不够用了怎么办?我们可以用其它方式的ipc机制,比如说共享内存,socket,可以展开讲讲几种的区别
4,binder的线程数是多少?
16个
5,其它?
网友评论