Binder框架(二) ServiceManager初始化

0、总体流程四部

开机由init进程解析init.rc文件启动servicemanager.rc。启动会调用main.cpp的main函数
main函数里面主要做了以下几件事 :

1.1 打开/dev/binder设备;

1.2 通过mmap映射设备的内存空间到ServiceManager进程中。

1.3 设置ServiceManager为context manager。

1.4 ServiceManager服务进入循环,等待接收数据来进行处理

int main(int argc, char** argv) {if (argc > 2) {LOG(FATAL) << "usage: " << argv[0] << " [binder driver]";}const char* driver = argc == 2 ? argv[1] : "/dev/binder";//1.打开/dev/binder设备;2.并且通过mmap映射设备的内存空间到SM进程中sp<ProcessState> ps = ProcessState::initWithDriver(driver);ps->setThreadPoolMaxThreadCount(0);ps->setCallRestriction(ProcessState::CallRestriction::FATAL_IF_NOT_ONEWAY);sp<ServiceManager> manager = sp<ServiceManager>::make(std::make_unique<Access>());if (!manager->addService("manager", manager, false /*allowIsolated*/, IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT).isOk()) {LOG(ERROR) << "Could not self register servicemanager";}//3. 设置SM为context managerIPCThreadState::self()->setTheContextObject(manager);ps->becomeContextManager();//4. 进入循环,等待接收数据来进行处理sp<Looper> looper = Looper::prepare(false /*allowNonCallbacks*/);BinderCallback::setupTo(looper);ClientCallbackCallback::setupTo(looper, manager);while(true) {looper->pollAll(-1);}return EXIT_FAILURE;}

 

1、打开设备

相关构造ProcessState()-------->open_driver(driver)、 mmap()

 ProcessState::ProcessState(const char *driver): mDriverName(String8(driver)), mDriverFD(open_driver(driver))  //***open_driver(driver)......, mCallRestriction(CallRestriction::NONE){if (mDriverFD >= 0) {//***mVMStart = mmap(nullptr, BINDER_VM_SIZE, PROT_READ, MAP_PRIVATE | MAP_NORESERVE, mDriverFD, 0);if (mVMStart == MAP_FAILED) {ALOGE("Using %s failed: unable to mmap transaction memory.\n",                 close(mDriverFD);......}}}

open_driver()打开设备文件,主要是通过ioctl()向binder驱动查询并设置了一些信息,比如:

版本:BINDER_VERSION, 设置最大线程 BINDER_SET_MAX_THREADS 等等。

static int open_driver(const char *driver)
380  {
381      int fd = open(driver, O_RDWR | O_CLOEXEC);
382      if (fd >= 0) {
383          int vers = 0;
384          status_t result = ioctl(fd, BINDER_VERSION, &vers);
385          //...
396          size_t maxThreads = DEFAULT_MAX_BINDER_THREADS;
397          result = ioctl(fd, BINDER_SET_MAX_THREADS, &maxThreads);
398          //...
401          uint32_t enable = DEFAULT_ENABLE_ONEWAY_SPAM_DETECTION;
402          result = ioctl(fd, BINDER_ENABLE_ONEWAY_SPAM_DETECTION, &enable);
403
406      } else {
407          ALOGW("Opening '%s' failed: %s\n", driver, strerror(errno));
408      }
409      return fd;
410  }

 

2、从binder设备的内存空间映射到SM进程里

//kernel/drivers/android/binder.c
static int binder_mmap(struct file *filp, struct vm_area_struct *vma){int ret;struct binder_proc *proc = filp->private_data;if(proc->tsk != current->group_leader)return -EINVAL;if((vma->vm_end - vma->vm_start) > SZ_4M)vma->vm_end = vma->vm_start +SZ_4M;...if(vma->vm_flags & FORBIDDEN_MMAP_FLAGS){ret = -EPERM;failure_string = "bad vm_flags"goto err_bad_arg;}vma->vm_flags |= VM_DONTCOPY | VM_MIXEDMAP;vma->vm_flags &= ~VM_MAYWRITE;vma->vm_ops = &binder_vm_ops;vma->vm_private_data = proc;ret = binder_alloc_mmap_handler(&proc->alloc, vma);if(ret)return ret;return 0;
}

3、设置为context manager

 创建manager,并且把自己设置到SM中

 sp<ServiceManager> manager = sp<ServiceManager>::make(std::make_unique<Access>());if (!manager->addService("manager", manager, false /*allowIsolated*/, IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT).isOk()) {LOG(ERROR) << "Could not self register servicemanager";}
Status ServiceManager::addService(const std::string& name, const sp<IBinder>& binder) { 
mNameToService[name] = Service {.binder = binder,.allowIsolated = allowIsolated,.dumpPriority = dumpPriority,.debugPid = ctx.debugPid,};

 ioctl()通过BINDER_SET_CONTEXT_MGR命令,将SM设置到binder驱动中

//frameworks/native/libs/binder/ProcessState.cpp
bool ProcessState::becomeContextManager()
{AutoMutex _l(mLock);flat_binder_object obj {.flags = FLAT_BINDER_FLAG_TXN_SECURITY_CTX,};......int unused = 0;result = ioctl(mDriverFD, BINDER_SET_CONTEXT_MGR, &unused);return result == 0;
}

 

4、 设置SM循环

    //frameworks/native/cmds/servicemanager/main.cppint main(int argc, char** argv) {......sp<Looper> looper = Looper::prepare(false /*allowNonCallbacks*/);BinderCallback::setupTo(looper);ClientCallbackCallback::setupTo(looper, manager);while(true) {looper->pollAll(-1);}// should not be reachedreturn EXIT_FAILURE;}

 

 5、流程图

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/46670.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

气象水文耦合模式WRF-Hydro建模、编译及运行流程、依赖库准备、案例实践等

目录 第一部分 WRF-Hydro模型功能及运行流程、依赖库准备 第二部分 WRF-Hydro模式编译、离线运行及案例实践 第三部分 结合多案例进行模式数据制备及实践应用 第四部分 模式耦合编译及运行、总结 更多应用 WRF-Hydro模型是一个分布式水文模型&#xff0c;‌它基于WRF‌陆面…

数据库启动报ORA-600 6711故障分析处理---惜分飞

几个月以前的一个数据库故障,今天拿出来在win上重新分析,数据库启动报ORA-600 6711错 C:\Users\XFF>SQLPLUS / AS SYSDBA SQL*Plus: Release 12.1.0.2.0 Production on 星期日 7月 14 16:17:32 2024 Copyright (c) 1982, 2014, Oracle. All rights reserved. 已连接到空…

LabVIEW扬尘控制系统

设计了一套基于LabVIEW的扬尘控制系统&#xff0c;通过监测TsP&#xff08;总悬浮颗粒物&#xff09;浓度、风向和摄像头视频&#xff0c;实现对环境的综合监控和扬尘控制。系统可以自动判断扬尘位置&#xff0c;并驱动抑尘设备进行抑尘。硬件选用NI cDAQ-9178数据采集模块、Om…

linux高级编程(网络)(www,http,URL)

数据的封包和拆包 封包&#xff1a; 应用层数据&#xff08;例如HTTP请求&#xff09;被传递给传输层。传输层&#xff08;TCP&#xff09;在数据前添加TCP头部&#xff08;包含端口号、序列号等&#xff09;。网络层&#xff08;IP&#xff09;在TCP段前添加IP头部&#xff…

数据库:基本操作

SQL struct query language 关系型数据库 非关系 芒果db ddl data defination language 建表 dml 新增 修改 删除一行 data modifty dql 查询 data query language 查询 select 数据库 sun solaris gnu 1、分类&#xff1a; 大型 中型 …

Linux FFmpeg安装教程

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

DHCP服务、FTP服务

一、DHCP 1.1 DHCP是什么 DHCP&#xff08;Dynamic Host Configuration Protocol&#xff0c;动态主机配置协议&#xff09;是一种网络协议&#xff0c;用于自动分配 IP 地址和其他网络配置信息给网络中的设备 1.2 DHCP的好处 自动化: 减少了手动配置 IP 地址和网络参数的工…

Vulnhub:DC-1

1.环境搭建 靶机下载地址 将下载的靶机导入到Oracle VM VirtualBox中&#xff0c;设置仅主机模式&#xff0c;使用和kali相同的网卡 2.渗透过程 使用nmap工具进行主机发现扫描 nmap -sn 192.168.56.0/24 发现靶机ip地址&#xff0c;使用nmap工具进行靶机端口扫描 nmap -sS…

Python算法分析学习目标及能力验证

1、突破编程的关键点 不破不立&#xff0c;如何破&#xff1f;如何立&#xff1f; 人生苦短&#xff0c;我用python 目标&#xff1a;不在于多&#xff0c;而在于准&#xff1b; 验证&#xff1a;必须量化&#xff0c;否则都是虚夸。 那么目标怎么准确可量化呢&#xff1f; …

IDEA创建普通Java项目

环境准备 Java环境 运行javac查看java环境是否安装完成 开发工具Intellij IDEA 下载地址&#xff1a;https://www.jetbrains.com/idea/download/?sectionwindows 创建项目 点击新建项目 填入项目名字&#xff0c;项目路径&#xff0c;选择maven,点击下面的创建 运行项目 …

Docker的数据管理和网络通信

目录 一、Docker 的数据管理 1&#xff0e;数据卷 2&#xff0e;数据卷容器 二、端口映射 三、容器互联&#xff08;使用centos镜像&#xff09; 四、*Docker 镜像的创建 1&#xff0e;基于现有镜像创建 2&#xff0e;基于本地模板创建 3&#xff0e;基于Dockerfile 创…

BL201分布式I/O耦合器连接Profinet网络

钡铼技术的BL201分布式I/O耦合器是一个用于Profinet网络的设备&#xff0c;用于连接远程输入/输出&#xff08;I/O&#xff09;设备到控制系统&#xff0c;如可编程逻辑控制器&#xff08;PLC&#xff09;&#xff0c;能够实现分布式的I/O连接和通信。 它支持标准Profinet IO …

一文说透Springboot单元测试

你好&#xff0c;我是柳岸花开。 一、单元测试说明 1 单元测试的优点与基本原则 一个好的单元测试应该具备以下FIRST 原则和AIR原则中的任何一条&#xff1a; 单元测试的FIRST 规则 Fast 快速原则&#xff0c;测试的速度要比较快&#xff0c; Independent 独立原则&#xff0c;…

【Springboot】新增profile环境配置应用启动失败

RT 最近接手了一个新的项目&#xff0c;为了不污染别人的环境&#xff0c;我新增了一个自己的环境配置。结果&#xff0c;在启动的时候总是失败&#xff0c;就算是反复mvn clean install也是无效。 问题现象 卡住无法进行下一步 解决思路 由于之前都是能启动的&#xff0c…

随机过程基础:3.平稳过程(2)

平稳过程是指随机过程的统计特性&#xff08;如均值、方差、协方差等&#xff09;不随时间变化。我们可以在时间域或频率域上研究其性质。以下是对平稳过程的协方差函数和功率谱密度的详细讨论。 一、协方差函数 协方差函数就像是描述两个随机变量之间关系的一种“尺子”。想象…

LLM之Prompt(四)| OpenAI、微软发布Prompt技术报告

摘要 生成式人工智能 &#xff08;GenAI&#xff09; 系统正越来越多地部署在各行各业和研究机构。开发人员和用户通过使用提示或提示工程与这些系统进行交互。虽然提示是一个广泛提及且被研究的概念&#xff0c;但由于该领域的新生&#xff0c;存在相互矛盾的术语和对构成提示…

API接口的概念和接口测试的概念

一、什么是接口测试 接口测试是项目测试的一部分&#xff0c;顾名思义&#xff0c;它测试的主要对象是接口&#xff0c;是测试系统组件间接口的一种测试。接口测试主要用于检测外部系统与所测系统之间以及内部各系统之间的交互点。测试的重点是检查数据交互、传递、和控制管理过…

三级_网络技术_17_交换机及其配置

1.下面是一台三层交换机的部分路由表信息。根据表中的路由信息&#xff0c;以下描述错误的是()。 此设备启用了OSPF动态路由协议&#xff0c;并学到了E1和E2两种类型的OSPF外部路由 比设备通过动态路由协议得到缺省路由&#xff0c;下一跳是设备的TenGigabitEthernet1/15接口 …

聚类分析方法(三)

目录 五、聚类的质量评价&#xff08;一&#xff09;簇的数目估计&#xff08;二&#xff09;外部质量评价&#xff08;三&#xff09;内部质量评价 六、离群点挖掘&#xff08;一&#xff09;相关问题概述&#xff08;二&#xff09;基于距离的方法&#xff08;三&#xff09;…

泛微E-Cology WorkflowServiceXml SQL注入漏洞复现(QVD-2024-26136)

0x01 产品简介 泛微e-cology是一款由泛微网络科技开发的协同管理平台,支持人力资源、财务、行政等多功能管理和移动办公。 0x02 漏洞概述 2024年7月,泛微官方发布了新补丁,修复了一处SQL注入漏洞。经分析,攻击者无需认证即可利用该漏洞,建议受影响的客户尽快修复漏洞。…