学习笔记,整理中;
需要多看几遍
面:
什么时候用到多进程?
多进程优点在哪里?
Binder有什么优势
Binder是如何做到一次拷贝的
MMAP的原理讲解
------------------------------------------------------------------------------------------------------------------------
自己思路整理:
1、内核层 binder_init ;binder_open;binder_mmap
2、SM binder_open;binder_become_context_manager();binder_loop()
------------------------------------------------------------------------------------------------------------------------
摘要:
binder 是什么?
- 进程间通信机制
- 也是一个驱动
- Binder.java --> 实现 Ibinder --- 跨进程的能力
自己创建的进程:webVIew 视频播放、音乐、大图浏览、推送、
系统服务:打电话,闹钟等等
优点
内存 --- 一个app ,6G,8G,16G
风险隔离 --- 每一个进程,单独的一个app
管道、信号量、socket 、共享内存等等
binder 小于 共享内存 优于其他IPC 进程间通信
线程共享区域 --- 麻烦 -- 同步
身份识别 --- PID 多少 --- 不靠谱
系统分配 UID --- 更安全 -- linux ---组id 用户id
系统服务 -- 实名 --- getsystemservice(context.activity)
匿名:
进程1 A;进程2B
new B().test();
进程之间的内存隔离
虚拟内存 --- 物理内存
拷贝了两次 -- 传统的ipc
虚拟内存 -- 地球仪
物理内存 -- 地球
用户空间 --- 直接操作文件吗??
内存条 --- 物理内存
磁盘 -- 物理内存 --- 文件 -
mmap --- 能够让虚拟内存和指定物理内存直接联系起来
mmap 驱动里面具体怎么实现
共享内存 --- 怎么实现无需拷贝??
binder驱动启动?
linux 一切皆文件 ---
misc 设备 --- 没有硬件 --- 内存 --- 注册简单
syscall --- jni
流程 --- c,c++ 这个代码干什么?
mmap --- xxxxx
ioctl --- binder_ioctl
binder_init
1. 分配内存
2. 初始化设备
3. 放入链表 binder_devices
binder_open
1. 创建binder_proc对象
2. 当前进程信息,proc
3. filp->private_data = proc;
4. 添加到binder_procs链表中
binder_mmap
struct vm_struct *area; --- 内核的虚拟内存
vma --- 进程的虚拟内存 --- 4M 驱动定的,1M-8k --- intent 异步 同步
虚拟内存 放入一个东西
用户空间 = 虚拟内存地址 + 偏移值
分配4kb的物理内存 --- 内核的虚拟空间
默认 同步
tf_oneway
binder_mmap
1. 通过用户空间的虚拟内存大小 --- 分配一块内核的虚拟内存
2. 分配了一块物理内存 --- 4KB
3. 把这块物理内
4. 存分别映射到 用户空间的虚拟内存和内核的虚拟内存
1M
binder_ioctl
读写操作 --- BINDER_WRITE_READ --- ioctl(BINDER_WRITE_READ)
数据头 ---
有效数据 --- 拷贝一次 --- 后面讲解
binder 的jni注册
目的:java 和 native 能够互相调用 --- 系统 --- jni
service_manager 大管家 注册 ,获取
流程
重点 --- 无关紧要 细节
--------------------------------------------------------------------------------
native java 可以通信
大管家 ---
.exe
node
sm注册完成
1. 打开驱动,内存映射(设置大小 128K)
2. 设置 SM 为大管家 --- sm 作用 为了管理系统服务
1. 创建 binder_node 结构体对象
2. proc --》 binder_node
3. 创建 work 和 todo --》类似 messageQueue
3. BC_ENTER_LOOPER 命令
1. 写入状态Loop
2. 去读数据:binder_thread_read:ret = wait_event_freezable_exclusive(proc->wait, binder_has_proc_work(proc, thread)); 进入等待
sm获取 --- native这块 ---
获取sm的情况:native 的服务注册和获取的时候都会走这个
1. 注册服务到sm
2. 通过sm去获取服务 ---java
也是服务端
1. ProcessState::self()->getContextObject(NULL)、
1. ProcessState::self()
1. 打开驱动:binder
2. 设置线程最大数目:15个
3. mmap -- 设置共享内存大小 --- (1M-8K) 普通服务的大小
2. getContextObject
1. 创建一个BpBinder --- 客户端的对象
2. interface_cast
1. new BpServiceManager(new BpBinder) ==》 new Proxy(binder==BinderProxy)
2. remote.transact -->远程调用
3. remote == BpBinder
3. java 层 --- ServiceManager.addService
1. new ServiceManagerProxy(new BinderProxy)
2. mRemote == BinderProxy
3. BinderProxy.mObject == BpBinder
4. mRemote.transact == BpBinder.transact
AIDL
普通类之间的调用 --- 提供接口
AMS --- ActivityManagerNative
BpBinder -- native 的方法
政府机构 --- 买车 上牌 --- 流程很复杂 (AIDL -- 黄牛,中介)
讲解 AIDL 生成的代码 --- 字节跳动的面试题
java 类 想要拥有跨进程能力 --- 继承Binder
Activity ---
同步的情况 --- transcat 调用后 会挂起 -- 一般都是同步
```
ServiceManager.addService 服务的注册
ServiceManager.getService 服务的获取
```
多看,多做笔记,多总结,先放过细节,
AIDL
---------------------------------------------------------------------------------------------------------
内容: