当前位置: 首页 > article >正文

【Android FrameWork(四)】- binder service_manager ServiceManager

文章目录

  • 前言
  • 源码分析
    • 1.Binder
    • 2.ServiceManager的启动
    • 3.service_manager
  • 拓展知识
  • 总结


前言

ServiceManager是Android系统为开发者提供的一个服务大管家,当开机之后,由内核态进入用户态之后,会启动system_server进程,在该进程里面会对AMS,PKMS,PMS等等进行创建。然后添加到ServiceManager中。SystemServer算是一个大管家,他整合了系统的各种服务,监控着我们服务,管理服务的周期。而ServiceManager只有一个功能就是提供binder通信,让应用可以获取到系统提供的服务。


源码分析

1.Binder

Binder是Android特有的一种通信方式。Android Binder的前身是OpenBinder,后来在OpenBinder的基础上开发了Android Binder。
Android基于Linux所以支持Linux原生的IPC通信机制:共享内存、Pipe、Socket。Binder是Android特有的。

性能上:稳定性: 安全:
Binder :  一次拷贝  c/s架构 客户端和服务端 稳定  内核层校验系统来保证通信安全
共享内存:0次 不稳定会有同步问题和并发死锁问题 自定义协议
管道pipe:需要两次拷贝 单管道 效率低只能读或者只能写 自定义协议
Socket:两次拷贝 c/s架构 不好的地方消耗性能握手和挥手 自定义协议

1.binder_init 注册了Binder驱动, poll,unlocked_ioctl compat_ioctl mmap open flush release。
2.binder_open 创建了binder_proc以及初始化进程信息,todo,wait队列,并且把proc->node添加到binder_procs。
3.binder_mmap 开辟内核空间(128k),同时开辟物理内存空间(128k),然后把内核空间和物理空间进行映射,使他们2个指向同一个内存地址。这里我们看到开辟的内存大小为1页也就是4k,这么小根本不够用,其实他是在数据传递的时候按需开辟内存的,我们等讲到数据传递的时候再来看 如何开辟。
4.binder_ioctl 对binder设备进行读写操作,我们上边的代码中只带入了service_manager.c的binder_open调用的时候传递的BINDER_VERSION校验。后边我们会再进来了解的。

2.ServiceManager的启动

1.调用binder_open 打开Binder驱动,设置大小为128k。
2.调用binder_become_context_manager,设置自己成为Binder设备的上下文管理者
3.调用binder_loop让binder进入loop状态,并且等待客户端请求并处理,处理完成之后会把数据写入readbuf,进行svcmgr_handler回调。
注意:Binder的ioctl函数会阻塞。

int main(int argc, char** argv)
{
    struct binder_state *bs;
    union selinux_callback cb;
    char *driver;

    if (argc > 1) {
        driver = argv[1];
    } else {
        driver = "/dev/binder";
    }

    bs = binder_open(driver, 128*1024);//调用binder_open 打开binder驱动 传递大小为128*1024也就是128k
  //………………

    if (binder_become_context_manager(bs)) {//设置自己成为binder设备的上下文管理者
    }    
    //………………
    //调用binder_loop 让binder进入loop状态,等待客户端连接,并且传入回调函数svcmgr_handler
    binder_loop(bs, svcmgr_handler);

    return 0;
}

3.service_manager

1,bind_open :打开了binder驱动 映射了内存空间 大小是128k
2,调binder_becom_context_manager 设置 让自己成为binder设备的上下文管理者
3,调用binder_loop 让service_manager进入死循环状态,binder设备进入loop的状态 ioctl(BINDER_WRITE_READ)
4,binder_parse客户端数据进行解析,并且进行回调 svcmgr_handler

拓展知识

  • ServiceManager.rc比我们的zygote更先执行,这里执行文件的大小顺序:core-> main->late_start)

  • Binder传统ipc怎么进行通信的?
    系统里进程之间是相互隔离的,a进程无法直接访问b进程,每个进程里分为用户空间和内核空间

  • 性能上:稳定性: 安全:
    Binder : 一次拷贝 c/s架构 客户端和服务端 稳定 内核层校验系统来保证通信安全
    共享内存:0次 不稳定会有同步问题和并发死锁问题 自定义协议
    管道pipe:需要两次拷贝 单管道 效率低只能读或者只能写 自定义协议
    Socket:两次拷贝 c/s架构 不好的地方消耗性能握手和挥手 自定义协议

总结


http://www.kler.cn/a/14189.html

相关文章:

  • 【Linux命令行与Shell脚本编程】第五章 理解 Shell 父子关系 后台进程 协程
  • 计算机类大学生竞赛经验分享
  • JavaSE 09 File 类 IO 流 - Part 01
  • 搜索引擎找外贸客户
  • 【产品经理】系统上线自查清单
  • TCP协议的相关特性(续)
  • GDB调试gdb
  • 光照的个人推导过程与GL实现
  • WTI纽约原油CFD是什么?交易技巧有哪些?
  • webpack5搭建react框架-配置优化
  • 入阵曲(C++)(前缀和)
  • 【C++】模板(二)
  • python算法中的字符串算法(详解)
  • 十、v-model的基本使用
  • 2023年全国最新道路运输从业人员精选真题及答案62
  • 1. VBA概述
  • ONLYOFFICE协作空间是什么?
  • celery简单入门
  • 数据库锁表原因、排查、解决
  • 【C++ 十八】C++ map/ multimap容器