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

chromium通信系统-ipcz系统(四)-ipcz-分层、和mojo的关系以及handle

在只有mojo的情况下, 进程间通信都是靠unix 域套接字来完成了,由于这种方式比较低效,并且不够灵活,后来引入了ipcz。 但是系统中基本上使用mojo做进程间通信,想要一步到位迁移到ipcz系统是比较困难的。 所以chrome团队采用了一种折中的方法,利用原来mojo的channel进行socket通信,作为控制消息和唤醒机制。 使用ipcz 来实现共享内存和路由机制。另外由于chrome是一个面向多操作系统的任务,对于不同操作系统使用不同的代码实现,这样就要求抽取出操作系统相关的实现。这样使得现有代码非常混乱。另外ipcz系统希望减少耦合,尽量少的暴露实现细节,以及方便序列化,使用handle(句柄)代理不同层的对象。

ipcz主要有四个模块:
1、ipcz上层:third_party/ipcz 目录。 handle 为IpczHandle。 实现Node、NodeLink、RouterLink、Portal、NodeConnector、Router、Parcle 等对象。架空mojo的Node 和Port
2、ipcz driver层:mojo/core/ipcz_driver目录。handle 为 IpczDriverHandle。 实现Transport,ipcz层和mojo层的粘合剂,利用mojo层的通信能力服务ipcz层。序列化传输能力。
3、mojo 层:mojo/core目录。handle 为 MojoHandle。 实现Channel,进程间通信能力。
4、Platform层/mojo/public/cpp/platform目录。 handle 为PlatformHandle。 系统层面的实现,主要是对Socket文件描述的包装。

下面我们具体分析一下每一层handle的实现。

ipcz 层 IpczHandle实现

third_party/ipcz/src/ipcz/api_object.h

class APIObject : public RefCounted {public:enum ObjectType {kNode,kPortal,kBox,kTransport,kParcel,};static APIObject* FromHandle(IpczHandle handle) {return reinterpret_cast<APIObject*>(static_cast<uintptr_t>(handle));}// Takes ownership of an APIObject from an existing `handle`.static Ref<APIObject> TakeFromHandle(IpczHandle handle) {return AdoptRef(reinterpret_cast<APIObject*>(static_cast<uintptr_t>(handle)));}// Returns an IpczHandle which can be used to reference this object. The// reference is not owned by the caller.IpczHandle handle() const { return reinterpret_cast<uintptr_t>(this); }// Releases ownership of a Ref<APIObject> to produce a new IpczHandle which// implicilty owns the released reference.static IpczHandle ReleaseAsHandle(Ref<APIObject> object) {return static_cast<IpczHandle>(reinterpret_cast<uintptr_t>(object.release()));}
......  
}

ipcz层对应的对象基类为APIObject,APIObject 提供四个方法,FromHandle() 和 TakeFromHandle() 方法用于将IpczHandle() 转化为具体对象。handle() 和 ReleaseAsHandle() 方法用于将对象转成IpczHandle句柄。这里我们还可以看到系统里有5种类型的APIObject,分别是:

  • kNode 代表IPCZ Node(节点)对象
  • kPortal 代表ipcz Portal(端口)对象
  • kBox 用于其他可传输的ipcz对象
  • kTransport 代表ipcz Transport(传输点)对象
  • kParcel 代表ipcz Parcel(消息)对象

ipcz driver 层 IpczDriverHandle实现

typedef uintptr_t IpczDriverHandle;

mojo/core/ipcz_driver/object.h

// Common base class for objects managed by Mojo's ipcz driver.
class MOJO_SYSTEM_IMPL_EXPORT ObjectBase: public base::RefCountedThreadSafe<ObjectBase> {public:REQUIRE_ADOPTION_FOR_REFCOUNTED_TYPE();enum Type : uint32_t {// An ipcz transport endpoint.kTransport,// A wrapped shared memory region.kSharedBuffer,// An active mapping for a shared memory region. These objects are not// serializable and cannot be transmitted over a Transport.kSharedBufferMapping,// A PlatformHandle which can be transmitted as-is by the platform's Channel// implementation, out-of-band from message data. This is the only type of// driver object which can be emitted by the driver's Serialize(), and it's// the only type accepted by its Transmit(). This type is unused on Windows,// where all platform handles are encoded as inline message data during// serialization.kTransmissiblePlatformHandle,// A PlatformHandle which may or may not be transmissible by the platform's// Channel implementation, but which can at least be transformed into// something transmissible during serialization.kWrappedPlatformHandle,// A DataPipe instance used to emulate Mojo data pipes over ipcz portals.kDataPipe,// A MojoTrap instance used to emulate a Mojo trap. These objects are not// serializable and cannot be transmitted over a Transport.kMojoTrap,// An Invitation instance used to emulate Mojo process invitations. These// objects are not serializable and cannot be transmitted over a Transport.kInvitation,};explicit ObjectBase(Type type);Type type() const { return type_; }IpczDriverHandle handle() const {return reinterpret_cast<IpczDriverHandle>(this);}static ObjectBase* FromHandle(IpczDriverHandle handle) {return reinterpret_cast<ObjectBase*>(handle);}static IpczDriverHandle ReleaseAsHandle(scoped_refptr<ObjectBase> object) {return reinterpret_cast<IpczDriverHandle>(object.release());}static scoped_refptr<ObjectBase> TakeFromHandle(IpczDriverHandle handle) {scoped_refptr<ObjectBase> object(FromHandle(handle));if (object) {// We're inheriting a ref previously owned by `handle`, so drop the extra// ref we just added.object->Release();}return object;}......
// Computes the number of bytes and platform handles required to serialize// this object for transmission through `transmitter`. Returns false if the// object cannot be serialized or transmitted as such.virtual bool GetSerializedDimensions(Transport& transmitter,size_t& num_bytes,size_t& num_handles);// Attempts to serialize this object into `data` and `handles` which are// already sufficiently sized according to GetSerializedDimensions(). Returns// false if serialization fails.virtual bool Serialize(Transport& transmitter,base::span<uint8_t> data,base::span<PlatformHandle> handles);

ipcz driver层对应的对象基类为ObjectBase,ObjectBase 提供的方法包括: type方法返回对象的类型,FromHandle() 和 TakeFromHandle() 方法用于将IpczHandle() 转化为具体对象。handle() 和 ReleaseAsHandle() 方法用于将对象转成IpczHandle句柄。GetSerializedDimensions方法用来序列化过程中返回需要的内存空间和hanlde空间。 Serialize函数用于跨进程序列化传输。

这里我们还可以看到系统里有8种类型的ObjectBase,分别是:

  • kTransport 代表传输点对象
  • kSharedBuffer 代表共享内存(端口)对象
  • kSharedBufferMapping 映射后的共享内存对象
  • kTransmissiblePlatformHandle 可传输的PlatformHandle对象
  • kWrappedPlatformHandle 包装的PlatformHandle对象
  • kDataPipe 数据管道
  • kMojoTrap Trap监听对象
  • kInvitation 链接邀请对象。

Mojo层 MojoHandle实现

typedef uintptr_t MojoHandle;

mojo层名没有对应的对象。可以和ipcz driver handle 和 ipcz handle强转。

Platform层 PlatformHandle实现

class COMPONENT_EXPORT(MOJO_CPP_PLATFORM) PlatformHandle {public:enum class Type {kNone,
#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_FUCHSIA)kHandle,
#elif BUILDFLAG(IS_APPLE)kMachSend,kMachReceive,
#endif
#if BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA)kFd,
#endif};private:Type type_ = Type::kNone;#if BUILDFLAG(IS_WIN)base::win::ScopedHandle handle_;
#elif BUILDFLAG(IS_FUCHSIA)zx::handle handle_;
#elif BUILDFLAG(IS_APPLE)base::mac::ScopedMachSendRight mach_send_;base::mac::ScopedMachReceiveRight mach_receive_;
#endif#if BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA)base::ScopedFD fd_;
#endif
};

对于linux系统, type为kFd, fd_变量保存文件描述符。

相关文章:

chromium通信系统-ipcz系统(四)-ipcz-分层、和mojo的关系以及handle

在只有mojo的情况下&#xff0c; 进程间通信都是靠unix 域套接字来完成了&#xff0c;由于这种方式比较低效&#xff0c;并且不够灵活&#xff0c;后来引入了ipcz。 但是系统中基本上使用mojo做进程间通信&#xff0c;想要一步到位迁移到ipcz系统是比较困难的。 所以chrome团队…...

推荐一些研发人员经常用到的免费API接口

快递物流订阅与推送&#xff08;含物流轨迹&#xff09;&#xff1a;【物流订阅与推送、H5物流轨迹、单号识别】支持单号的订阅与推送&#xff0c;订阅国内物流信息&#xff0c;当信息有变化时&#xff0c;推送到您的回调地址。地图轨迹支持在地图中展示包裹运输轨迹。包括顺丰…...

高薪资是跳出来的,好工作是面出来的~

听人劝、吃饱饭,奉劝各位小伙伴,不要订阅该文所属专栏。 如需要项目实战或者是体系化资源,文末名片加V! 作者:哈哥撩编程,工作十余年, 从事过全栈研发、产品经理等工作,目前在公司担任研发部门CTO。荣誉:2022年度博客之星Top4、2023年度超级个体得主、谷歌与亚马逊开发…...

记QListWidget中QPushButton QSS样式失效的“bug”

一、场景 有一个QListWidget的列表&#xff1b;里面存放了若干QListWidgetItem&#xff1b;每个QListWidgetItem与一个自定义类对象绑定——通过QListWidget的setItemWidget()实现。自定义对象继承于QWidget&#xff0c;且内含QPushButton。 二、bug描述 在该QListWidget的外…...

python提取通话记录中的时间信息

您需要安装适合中文的SpaCy模型。您可以通过运行 pip install spacypython -m spacy download zh_core_web_sm来安装和下载所需的模型。 import spacy# 加载中文模型 nlp spacy.load(zh_core_web_sm)# 示例电话记录文本 text """ Agent: 今天我们解决一下这…...

DSShop移动商城网店系统 反序列化RCE漏洞复现

0x01 产品简介 DSShop是长沙德尚网络科技有限公司推出的一款单店铺移动商城网店系统,能够帮助企业和个人快速构建手机移动商城,并减少二次开发带来的成本。 以其丰富的营销功能,精细化的用户运营,解决电商引流、推广难题,帮助企业打造生态级B2C盈利模式商业平台。完备的电商…...

docker搭建node环境开发服务器

docker搭建node环境开发服务器 本文章是我自己搭建node环境开发服务器的过程记录&#xff0c;不一定完全适用所有人。根据个人情况&#xff0c;按需取用。 命名项目路径 为了方便cd到项目路径&#xff0c;将项目路径重命名&#xff0c;方便输入。 vim /etc/profile # 修改p…...

传统制造业企业如何实现数字化转型?

传统制造企业的数字化转型涉及利用数字技术来提高效率、生产力和整体业务流程。以下是实现制造业数字化转型的关键步骤和策略&#xff1a; 1.当前流程的评估&#xff1a; 确定可以从数字化转型中受益的领域。这可能包括生产流程、供应链管理、库存控制和客户关系。 评估技术集…...

面试:说一下深拷贝,浅拷贝,引用拷贝吧;Object类中的clone是哪种呢?

目录 深拷贝、浅拷贝、引用拷贝Object类的clone()方法 深拷贝、浅拷贝、引用拷贝 ● 浅拷贝&#xff1a; 对基本数据类型进行值传递&#xff1b; 对引用类型&#xff0c;复制了一份引用类型的变量 里面存储的内存地址一样 指向的对象也一样。 ● 深拷贝&#xff1a;对基本数据…...

接口压测指南

接口压测指南 一、 为什么需要进行接口压测二 、接口压测的目标是什么三、 用什么工具进行接口压测四、 接口压测核心指标4.1 JMeter的报告模板4.2 ApiPost报告模板 五、 接口慢如何排查5.1 大体排查思路5.2 排查工具5.3 压测经验 一、 为什么需要进行接口压测 突然有一天领导…...

计算机辅助药物设计AIDD-小分子-蛋白质|分子生成|蛋白质配体相互作用预测

文章目录 计算机辅助药物设计AIDD【小分子专题】AIDD概述及药物综合数据库学习机器学习辅助药物设计图神经网络辅助药物设计自然语言处理辅助药物设计药物设计与分子生成 计算机辅助药物设计【蛋白质专题】蛋白质数据结构激酶-Kinase相似性学习基于序列的蛋白质属性预测基于结构…...

深度学习-yolo目标检测-机器学习-计算机视觉-python学习路线(呕心沥血出品-绝对精品-附资源链接)

学习路线 1. 计算机视觉基础知识 图像处理基础:了解图像的基本处理技术,如滤波、边缘检测、直方图等。数字图像处理:熟悉数字图像的表示、颜色模型、图像增强等基本概念。opencv课程链接:Python for Computer Vision with OpenCV and Deep Learning资料推荐: 书籍:《数字…...

ubuntu2204 防火墙ufw限制某ip对某端口的访问

公司内部有个ip为10.10.10.1的网关&#xff0c;每天定时端口扫描&#xff0c;然后扫描发送的数据包http server解析不了&#xff0c;日志里就会记录这个错误&#xff0c;有点烦&#xff0c; 用防火墙过滤一下 ubuntu的防火墙命令是 ufw&#xff0c; 跟ufo挺像的&#xff0c;也…...

常见代码优化案例记录

1. 使用StringBuilder优化字符串拼接&#xff1a; // 不优化的写法 String result ""; for (int i 0; i < 1000; i) {result i; }// 优化的写法 StringBuilder resultBuilder new StringBuilder(); for (int i 0; i < 1000; i) {resultBuilder.append(i)…...

【android开发-04】android中activity的生命周期介绍

1&#xff0c;返回栈 android中使用任务task来管理activity&#xff0c;一个任务就是一组存放在栈里的活动的集合&#xff0c;这个栈被称为返回栈。栈是一种先进先出的数据结构。当我们启动一个新的活动&#xff0c;他会在返回栈中人栈&#xff0c;并处以栈顶的位置&#xff0…...

java后端技术演变杂谈(未完结)

1.0版本javaWeb&#xff1a;原始servletjspjsbc 早期的jsp&#xff1a;htmljava&#xff0c;页面先在后端被解析&#xff0c;里面的java代码动态渲染完成后&#xff0c;成为纯html&#xff0c;再通过服务器发送给浏览器显示。 缺点&#xff1a; 服务器压力很大&#xff0c;因为…...

UDS 诊断报文格式

文章目录 网络层目的N_PDU 格式诊断报文的分类&#xff1a;单帧、多帧 网络层目的 N_PDU(network protocol data unit)&#xff0c;即网络层协议数据单元 网络层最重要的目的就是把数据转换成符合标准的单一数据帧&#xff08;符合can总线规范的&#xff09;&#xff0c;从而…...

kafka的详细安装部署

introduce Kafka是一个分布式流处理平台&#xff0c;主要用于处理高吞吐量的实时数据流。Kafka最初由LinkedIn公司开发&#xff0c;现在由Apache Software Foundation维护和开发。 Kafka的核心是一个分布式发布-订阅消息系统&#xff0c;它可以处理大量的消息流&#xff0c;并…...

【数据分享】2015-2023年我国区县逐月二手房房价数据(Excel/Shp格式)

房价是一个城市发展程度的重要体现&#xff0c;一个城市的房价越高通常代表这个城市越发达&#xff0c;对于人口的吸引力越大&#xff01;因此&#xff0c;房价数据是我们在各项城市研究中都非常常用的数据&#xff01;之前我们分享过2015-2023年我国地级市逐月房价数据&#x…...

PTA 7-226 sdut-C语言实验-矩阵输出(数组移位)

输入N个整数&#xff0c;输出由这些整数组成的n行矩阵。 输入格式: 第一行输入一个正整数N&#xff08;N<20&#xff09;&#xff0c;表示后面要输入的整数个数。 下面依次输入N个整数。 输出格式: 以输入的整数为基础&#xff0c;输出有规律的N行数据。 输入样例: 在…...

React Native在HarmonyOS 5.0阅读类应用开发中的实践

一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强&#xff0c;React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 &#xff08;1&#xff09;使用React Native…...

Spring Boot面试题精选汇总

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...

【C语言练习】080. 使用C语言实现简单的数据库操作

080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...

ardupilot 开发环境eclipse 中import 缺少C++

目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...

如何在最短时间内提升打ctf(web)的水平?

刚刚刷完2遍 bugku 的 web 题&#xff0c;前来答题。 每个人对刷题理解是不同&#xff0c;有的人是看了writeup就等于刷了&#xff0c;有的人是收藏了writeup就等于刷了&#xff0c;有的人是跟着writeup做了一遍就等于刷了&#xff0c;还有的人是独立思考做了一遍就等于刷了。…...

大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计

随着大语言模型&#xff08;LLM&#xff09;参数规模的增长&#xff0c;推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长&#xff0c;而KV缓存的内存消耗可能高达数十GB&#xff08;例如Llama2-7B处理100K token时需50GB内存&a…...

【从零学习JVM|第三篇】类的生命周期(高频面试题)

前言&#xff1a; 在Java编程中&#xff0c;类的生命周期是指类从被加载到内存中开始&#xff0c;到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期&#xff0c;让读者对此有深刻印象。 目录 ​…...

第7篇:中间件全链路监控与 SQL 性能分析实践

7.1 章节导读 在构建数据库中间件的过程中&#xff0c;可观测性 和 性能分析 是保障系统稳定性与可维护性的核心能力。 特别是在复杂分布式场景中&#xff0c;必须做到&#xff1a; &#x1f50d; 追踪每一条 SQL 的生命周期&#xff08;从入口到数据库执行&#xff09;&#…...

为什么要创建 Vue 实例

核心原因:Vue 需要一个「控制中心」来驱动整个应用 你可以把 Vue 实例想象成你应用的**「大脑」或「引擎」。它负责协调模板、数据、逻辑和行为,将它们变成一个活的、可交互的应用**。没有这个实例,你的代码只是一堆静态的 HTML、JavaScript 变量和函数,无法「活」起来。 …...

深入理解Optional:处理空指针异常

1. 使用Optional处理可能为空的集合 在Java开发中&#xff0c;集合判空是一个常见但容易出错的场景。传统方式虽然可行&#xff0c;但存在一些潜在问题&#xff1a; // 传统判空方式 if (!CollectionUtils.isEmpty(userInfoList)) {for (UserInfo userInfo : userInfoList) {…...