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

鸿蒙3.1 设备管理DeviceManager

介绍

DeviceManager组件在OpenHarmony上提供账号无关的分布式设备的认证组网能力,并为开发者提供了一套用于分布式设备间监听、发现和认证的接口。

其组成及依赖如下所示:

总结

设备管理模块其实就是软总线的包皮服务。目前权限都是控制系统uid,但是根据官方介绍,后续可能开放出去。所以大致的思路就是,设备管理模块代替软总线提供设备相关的能力,软总线只开放给系统服务使用。然后设备管理模块目前主要实现了就是自己的认证逻辑,这部分主要就是使用deviceauth模块,来进行图形化的认证能力。

目录

devicemanager

foundation/distributedhardware/devicemanager
├── common                        #公共能力头文件存放目录
│   └── include
│       └── ipc
│           └── model             #ipc功能模块头文件存放目录
├── display                       #DM显示hap代码
│   └── entry
│       └── src
│           └── main
│               ├── js            #DM PIN码显示FA相关JS代码
│               └── resources     #DM PIN码显示FA相关资源配置文件目录
├── figures
├── interfaces
│   ├── inner_kits                #内部接口及实现存放目录
│   │   └── native_cpp            #内部native接口及实现存放目录
│   │       ├── include
│   │       │   ├── ipc           #ipc头文件存放目录
│   │       │   │   ├── lite      #small
│   │       │   │   └── standard  #standard
│   │       │   └── notify        #ipc回调通知头文件目录
│   │       └── src
│   │           ├── ipc           #ipc功能代码
│   │           │   ├── lite      #small
│   │           │   └── standard  #standard
│   │           └── notify        ipc回调通知功能代码
│   └── kits                      #外接口及实现存放目录
│       └── js                    #外部JS接口及实现存放目录
│           ├── include           #外部JS接口及实现欧文件存放目录
│           └── src               #外部JS接口及实现代码
├── sa_profile
├── services
│   └── devicemanagerservice      #devicemanagerservice服务实现核心代码
│       ├── include
│       │   ├── ability           #与PIN码显示FA拉起管理相关头文件
│       │   ├── auth              #devie_auth交互相关头文件
│       │   ├── ipc               #进程间通信相关头文件
│       │   │   ├── lite          #small
│       │   │   └── standard      #standard
│       │   ├── message           #消息数据解析相关头文件
│       │   ├── requestauth       #设备认证功能相关头文件
│       │   ├── softbus           #软总线相关头文件
│       │   └── timer             #定时器处理相关头文件
│       └── src
│           ├── ability           #与PIN码显示FA拉起管理相关功能代码
│           │   ├── lite          #small
│           │   └── standard      #standard
│           ├── auth              #devie_auth交互相关核心代码
│           ├── ipc               #进程间通信相功能代码
│           │   ├── lite          #small
│           │   └── standard      #standard
│           ├── message           #消息数据解析相功能代码
│           ├── requestauth       #设备认证功能代码
│           ├── softbus           #通道建立功能核心代码
│           └── timer             #timer处理代码
└── utils                         #公共能力头文件存放目├── include│   ├── cipher                #加解密功能相关头文件│   ├── ipc                   #ipc公共头文件存放目录│   │   ├── lite              #small│   │   └── standard          #standard│   └── log                   #log相关头文件存放目录└── src├── cipher                #加解密功能代码├── ipc                   #ipc公共功能代码│   ├── lite              #small│   └── standard          #standard└── log                   #log相关功能代码

接口说明

当前版本设备管理服务不具备权限管理的能力,接口中的system api仅供系统调用,后续版本会进行严格的权限管控。 接口参见interface_sdk-js仓库的 ohos.distributedHardware.deviceManager.d.ts

  • 公共接口:使用DeviceManager相关接口之前,需要通过createDeviceManager接口创建DeviceManager实例;不使用DeviceManager接口的时候需要释放对应的DeviceManager实例。

原型

描述

createDeviceManager(bundleName: string, callback: AsyncCallback): void;

以异步方法获取DeviceManager实例

release(): void;

释放DeviceManager实例

  • 系统能力接口:提供可信设备列表获取、可信设备状态监听、周边设备发现、设备认证等相关接口,该部分作为系统能力接口,仅供系统应用调用。开始设备发现、停止发现设备接口要配对使用,使用同一个subscribeId。

原型

描述

getTrustedDeviceListSync(): Array;

获取信任设备列表

on(type: 'deviceStateChange', callback: Callback<{ action: DeviceStateChangeAction, device: DeviceInfo }>): void;

设备状态变更回调

off(type: 'deviceStateChange', callback?: Callback<{ action: DeviceStateChangeAction, device: DeviceInfo }>): void;

取消设备状态变更回调

on(type: 'serviceDie', callback: () => void): void;

服务错误回调

off(type: 'serviceDie', callback?: () => void): void;

取消服务错误回调

startDeviceDiscovery(subscribeInfo: SubscribeInfo): void;

开始设备发现

stopDeviceDiscovery(subscribeId: number): void;

停止发现设备

authenticateDevice(deviceInfo: DeviceInfo, authparam: AuthParam, callback: AsyncCallback<{deviceId: string, pinTone ?: number}>): void;

设备认证接口

verifyAuthInfo(authInfo: AuthInfo, callback: AsyncCallback<{deviceId: string, level: number}>): void;

设备认证信息校验

on(type: 'deviceFound', callback: Callback<{ subscribeId: number, device: DeviceInfo }>): void;

发现设备列表回调

off(type: 'deviceFound', callback?: Callback<{ subscribeId: number, device: DeviceInfo }>): void;

取消发现设备列表回调

on(type: 'discoverFail', callback: Callback<{ subscribeId: number, reason: number }>): void;

发现设备失败回调

off(type: 'discoverFail', callback?: Callback<{ subscribeId: number, reason: number }>): void;

取消发现设备失败回调

deviceauth

/base/security/deviceauth
├── frameworks                   # 设备互信认证IPC代码
├── interfaces                   # 对外接口目录
├── test                         # 设备互信认证的接口测试用例
├── common_lib                   # C语言公共基础库
├── deps_adapter                 # 依赖组件适配器代码
│   ├── key_management_adapter   # 秘钥及算法适配层
│   └── os_adapter               # 系统能力适配层
└── services                     # 设备互信认证服务层代码├── frameworks               # 设备互信认证框架层代码├── data_manager             # 设备互信群组信息管理模块├── group_auth               # 设备群组认证服务├── group_manager            # 设备群组管理服务├── authenticators           # 认证执行模块(包括帐号无关点对点认证器)└── protocol                 # 认证协议库


接口说明

设备互信认证组件中,设备群组管理服务负责将不同业务建立的设备间可信关系抽象成一个个可信群组,对外提供统一的接口,包含群组创建、删除、查询等功能;设备群组认证服务基于已经建立过可信关系的设备群组,提供设备可信认证与端到端会话密钥协商功能。

表 1 设备群组管理服务提供的API接口(DeviceGroupManager)功能介绍

接口名

描述

const DeviceGroupManager *GetGmInstance()

获取设备群组管理的实例。

int32_t RegCallback(const char *appId, const DeviceAuthCallback *callback)

注册业务的监听回调。

int32_t CreateGroup(int32_t osAccountId, int64_t requestId, const char *appId, const char *createParams)

创建一个可信设备群组。

int32_t DeleteGroup(int32_t osAccountId, int64_t requestId, const char *appId, const char *disbandParams)

删除一个可信设备群组。

int32_t AddMemberToGroup(int32_t osAccountId, int64_t requestId, const char *appId, const char *addParams)

添加成员到指定群组ID的可信设备群组。

int32_t DeleteMemberFromGroup(int32_t osAccountId, int64_t requestId, const char *appId, const char *deleteParams);

从指定可信设备群组里删除可信成员。

int32_t ProcessData(int64_t requestId, const uint8_t *data, uint32_t dataLen)

处理绑定或者解绑的数据。

int32_t GetGroupInfo(int32_t osAccountId, const char *appId, const char *queryParams, char **returnGroupVec, uint32_t *groupNum)

查询可信设备群组信息。

表 2 设备群组认证模块提供的API接口(GroupAuthManager)功能介绍

接口名

描述

const GroupAuthManager *GetGaInstance()

获取设备群组认证的实例。

int32_t AuthDevice(int32_t osAccountId, int64_t authReqId, const char *authParams, const DeviceAuthCallback *gaCallback)

认证可信设备。

int32_t ProcessData(int64_t authReqId, const uint8_t *data, uint32_t dataLen, const DeviceAuthCallback *gaCallback)

处理认证的数据。

数据结构

设备信息

这个设备信息是从软总线中NodeBasicInfo获取到的

软总线结构

typedef struct {char networkId[NETWORK_ID_BUF_LEN];    /**< Device ID */char deviceName[DEVICE_NAME_BUF_LEN];  /**< Device name */uint16_t deviceTypeId;
} NodeBasicInfo;

/*** @brief Defines the device information returned by <b>IDiscoveryCallback</b>.**/
typedef struct {/** Device ID. Its maximum length is specified by {@link DISC_MAX_DEVICE_ID_LEN}. */char devId[DISC_MAX_DEVICE_ID_LEN];/** Account hash code. Its maximum length is specified by {@link MAX_ACCOUNT_HASH_LEN}. */char accountHash[MAX_ACCOUNT_HASH_LEN];/** Device type. For details, see {@link DeviceType}. */DeviceType devType;/** Device name. Its maximum length is specified by {@link DISC_MAX_DEVICE_NAME_LEN}. */char devName[DISC_MAX_DEVICE_NAME_LEN];/** Number of available connections */unsigned int addrNum;/** Connection information. For details, see {@link ConnectAddr}. *//** 可能是蓝牙地址,也可能是ip地址,或者br地址*/ConnectionAddr addr[CONNECTION_ADDR_MAX];/** Number of capabilities */unsigned int capabilityBitmapNum;/** Device capability bitmap.* The maximum number of capabilities in the bitmap is specified by {@link DISC_MAX_CAPABILITY_NUM}.*/unsigned int capabilityBitmap[DISC_MAX_CAPABILITY_NUM];/** Custom data. Its length is specified by {@link DISC_MAX_CUST_DATA_LEN}. */char custData[DISC_MAX_CUST_DATA_LEN];
} DeviceInfo;

设备管理内部结构

typedef struct DmDeviceInfo {char deviceId[DM_MAX_DEVICE_ID_LEN];char deviceName[DM_MAX_DEVICE_NAME_LEN];uint16_t deviceTypeId;char networkId[DM_MAX_DEVICE_ID_LEN];
} DmDeviceInfo;

部分逻辑

启动过程

设备管理启动过程中,首先注册了设备上下线的一些回调到软总线中,用来监听设备节点上下线的状态变更。

然后加载自己的插件:目前提供的插件有

adaptor插件

插件名

文件名

crypto_adapter

libdevicemanager_crypto_adapter.z.so

device_profile

libdevicemanagerext_profile.z.so

device_decision

libdevicemanagerext_decision.z.so

auth插件

插件名

文件名

pin_auth

libdevicemanagerext_pin_auth.z.so

QRcode_auth

libdevicemanager_qrcodeauth.z.so

nfc_auth

libdevicemanager_nfcauth.z.so

设备发现

认证逻辑

设备认证,目前分为账号相关和账号不相关。两套使用了不同的认证逻辑。

入口

设备管理对外提供了设备认证的入口

int32_t DeviceManagerService::AuthenticateDevice(const std::string &pkgName, int32_t authType,const std::string &deviceId, const std::string &extra)

握手过程

数据结构

DmAuthRequestContext

/*** @brief request context* */
typedef struct DmAuthRequestContext {//认证类型int32_t authType;//本地设备idstd::string localDeviceId;std::string deviceId;std::string deviceName;std::string deviceTypeId;int32_t sessionId;int32_t groupVisibility;bool cryptoSupport;std::string cryptoName;std::string cryptoVer;std::string hostPkgName;std::string targetPkgName;std::string appName;//描述std::string appDesc;//图标std::string appIcon;//app缩略图std::string appThumbnail;//tokenstd::string token;int32_t reason;std::vector<std::string> syncGroupList;
} DmAuthRequestContext;

RequestMessage

{"ITF_VER" : "1.1","MSG_TYPE": 100,"SLICE": 
}

连接状态

typedef enum AuthState {//初始化阶段,完成后会转到negotiateAUTH_REQUEST_INIT = 1,AUTH_REQUEST_NEGOTIATE,AUTH_REQUEST_NEGOTIATE_DONE,AUTH_REQUEST_REPLY,AUTH_REQUEST_INPUT,AUTH_REQUEST_JOIN,AUTH_REQUEST_NETWORK,AUTH_REQUEST_FINISH,AUTH_RESPONSE_INIT = 20,AUTH_RESPONSE_NEGOTIATE,AUTH_RESPONSE_CONFIRM,AUTH_RESPONSE_GROUP,AUTH_RESPONSE_SHOW,AUTH_RESPONSE_FINISH,
} AuthState;

client的状态转换

首先的状态是init,

从软总线中opensession之后,如果获取sessionid失败的化状态会转为AUTH_REQUEST_NEGOTIATE,并结束掉整个认证过程。

如果opensession触发成功,软总线会调用对应的OnSessionOpened回调函数,来进行进一步的处理

OnSessionOpened这里主要分了两部分,一部分是服务端的处理,另一部分是client的处理,服务端就是需要认证的远端设备

//session建立后的回调
void DmAuthManager::OnSessionOpened(int32_t sessionId, int32_t sessionSide, int32_t result) } else {LOGI("DmAuthManager::OnSessionOp

相关文章:

鸿蒙3.1 设备管理DeviceManager

介绍 DeviceManager组件在OpenHarmony上提供账号无关的分布式设备的认证组网能力,并为开发者提供了一套用于分布式设备间监听、发现和认证的接口。 其组成及依赖如下所示: 总结 设备管理模块其实就是软总线的包皮服务。目前权限都是控制系统uid,但是根据官方介绍,后续可…...

Git 目录详解

一、Git目录详解 在使用Git时&#xff0c;有几个目录和文件在Git项目中扮演着重要的角色&#xff0c;下面详细介绍一下这些目录和文件的作用 1、.git目录 .git目录是Git项目的核心&#xff0c;包含了Git的版本库和元数据等重要信息。在该目录中&#xff0c;有一些重要的子目录和…...

基于springboot+vue的武汉旅游网(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…...

步入React正殿 - React组件设计模式

目录 扩展学习资料 高阶组件 /src/components/hoc/withTooltip.js /src/components/hoc/itemA.jsx /src/components/hoc/itemB.jsx /src/App.js 函数作为子组件【Render pprops】 函数作为子组件 /src/components/rp/itemC.jsx【父组件】 /src/components/rp/withToo…...

Java 单例模式简单介绍

何为单例模式 所谓类的单例设计模式&#xff0c;就是采取一定的方法保证在整个的软件系统中&#xff0c;对某个类只能存在一个对象实例&#xff0c;并且该类只提供一个取得其对象实例的方法。 实现思路 如果我们要让类在一个虚拟机中只能产生一个对象&#xff0c;我们首先必…...

根据源码,模拟实现 RabbitMQ - 从需求分析到实现核心类(1)

目录 一、需求分析 1.1、对 Message Queue 的认识 1.2、消息队列核心概念 1.3、Broker Server 内部关键概念 1.4、Broker Server 核心 API &#xff08;重点实现&#xff09; 1.5、交换机类型 Direct 直接交换机 Fanout 扇出交换机 Topic 主题交换机 1.6、持久化 1.7…...

企业服务器数据库遭到malox勒索病毒攻击后如何解决,勒索病毒解密

网络技术的发展不仅为企业带来了更高的效率&#xff0c;还为企业带来信息安全威胁&#xff0c;其中较为常见的就是勒索病毒攻击。近期&#xff0c;我们公司收到很多企业的求助&#xff0c;企业的服务器数据库遭到了malox勒索病毒攻击&#xff0c;导致系统内部的许多重要数据被加…...

udp与can通信的选择与比较

UDP&#xff08;用户数据报协议&#xff09;和CAN&#xff08;控制器局域网&#xff09;是两种不同的通信协议&#xff0c;它们在实时传递性上有一些区别。 UDP是一种无连接的传输协议&#xff0c;它提供了简单的、不可靠的数据传输。UDP不提供可靠性保证、流控制或重传机制。…...

HoudiniVex笔记_P24_ForceBasics力基础

原视频&#xff1a;https://www.youtube.com/playlist?listPLzRzqTjuGIDhiXsP0hN3qBxAZ6lkVfGDI Bili&#xff1a;Houdini最强VEX算法教程 - VEX for Algorithmic Design_哔哩哔哩_bilibili Houdini版本&#xff1a;19.5 1、什么是Force 本章主要讲重力、弹力、速度与质量、…...

半导体退火那些事(1)

1.半导体退火的原理 半导体材料在晶体生长和制造过程中&#xff0c;由于各种原因会出现缺陷、杂质、位错等结构性缺陷&#xff0c;导致晶格不完整&#xff0c;施加电场后的电导率较低。通过退火处理&#xff0c;可以使材料得到修复&#xff0c;结晶体内部重新排列&#xff0c;…...

MapReduce介绍

目录 ​一、什么是MapReduce 二、MapReduce 的设计思想 2.1 分而治之 2.2 构建抽象模型&#xff1a;Map和Reduce 2.3 隐藏系统层细节 三、MapReduce 的框架原理 3.1 MRv1工作原理 3.1.1 MRv1架构工作原理图 3.1.1.1 流程说明 3.1.1.1.1 作业的提交 3.1.1.1.2 作业的初始化 3…...

Redis支持的主要数据结构操作命令有哪些?

Redis支持多种数据结构操作命令&#xff0c;包括以下主要命令&#xff1a; 字符串&#xff08;Strings&#xff09;&#xff1a; SET&#xff1a;设置字符串键的值。GET&#xff1a;获取指定键的值。INCR/DECR&#xff1a;对存储整数的字符串执行加一或减一操作。APPEND&#x…...

环境与能源创新专题:地级市绿色创新、碳排放与环境规制数据

数据简介&#xff1a;推动绿色发展&#xff0c;促进人与自然和谐共生是重大战略举措。绿色发展强调“绿水青山就是金山银山”&#xff0c;人与自然和谐共生重在正确处理生态环境保护与经济发展的关系。在着力于实现绿色发展的过程中&#xff0c;绿色创新是绿色发展的重要驱动因…...

设计模式之门面模式(Facade)的C++实现

1、门面模式提出 在组件的开发过程中&#xff0c;某些接口之间的依赖是比较紧密的&#xff0c;如果某个接口发生变化&#xff0c;其他的接口也会跟着发生变化&#xff0c;这样的代码违背了代码的设计原则。门面设计模式是在外部客户程序和系统程序之间添加了一层中间接口&…...

【数理知识】向量与基的内积,Matlab 代码验证

序号内容1【数理知识】向量的坐标基表示法&#xff0c;Matlab 代码验证2【数理知识】向量与基的内积&#xff0c;Matlab 代码验证 文章目录 1. 向量与基的内积2. 二维平面向量举例3. 代码验证Ref 1. 向量与基的内积 假设存在一个二维平面内的向量 a ⃗ \vec{a} a &#xff0c…...

黑客入侵:福特汽车Sync3车机存在漏洞,黑客入侵可抹除系统数据

据福特汽车公告&#xff0c;他们发现部分2021年至2022年车型的Sync3车机存在Wi-Fi漏洞&#xff0c;该漏洞可能被黑客利用来入侵并抹除车机内的系统数据。这一漏洞源于福特车系中采用的WL18xx MCP驱动程序的内存缓冲区溢位漏洞&#xff0c;其漏洞编号为CVE-2023-29468。 这一发现…...

面试热题(单词搜索)

给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 单词必须按照字母顺序&#xff0c;通过相邻的单元格内的字母构成&#xff0c;其中“相邻”单元格是那些水平相邻或垂直相…...

自定义表格组件:实现表格中有固定列的功能逻辑

目录 1&#xff0c;效果图2&#xff0c;实现思路3&#xff0c;实现方式 1&#xff0c;效果图 可以拖动纵向滑块&#xff0c;最左边一列固定住。 以同样的道理&#xff0c;可以在右面固定一列 2&#xff0c;实现思路 作为一个table组件&#xff0c;要接受父组件中的对table的…...

uni-app弹窗列表滚动, 弹框下面的内容也跟随滚动解决方案

滑动弹窗里的列表&#xff0c;弹框下面的内容也会跟着滑动&#xff0c;导致弹窗中的列表不能正常滚动 1.弹窗组件代码&#xff0c;需要在最外层的view中加入touchmove.stop.prevent"moveHandle"&#xff0c;且弹窗中需要滚动的列表要使用scroll-view标签包裹起来&…...

Django操作cookie、Django操作session、Django中的Session配置、CBV添加装饰器、中间件、csrf跨站请求

一、Django操作cookie cookie的原理cookie的工作原理是&#xff1a;由服务器产生内容&#xff0c;浏览器收到请求后保存在本地&#xff1b;当浏览器再次访问时&#xff0c;浏览器会自动带上Cookie&#xff0c;这样服务器就能通过Cookie的内容来判断这个是“谁”了。1.设置cook…...

DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径

目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...

Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具

文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...

2021-03-15 iview一些问题

1.iview 在使用tree组件时&#xff0c;发现没有set类的方法&#xff0c;只有get&#xff0c;那么要改变tree值&#xff0c;只能遍历treeData&#xff0c;递归修改treeData的checked&#xff0c;发现无法更改&#xff0c;原因在于check模式下&#xff0c;子元素的勾选状态跟父节…...

EtherNet/IP转DeviceNet协议网关详解

一&#xff0c;设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络&#xff0c;本网关连接到EtherNet/IP总线中做为从站使用&#xff0c;连接到DeviceNet总线中做为从站使用。 在自动…...

为什么要创建 Vue 实例

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

论文阅读笔记——Muffin: Testing Deep Learning Libraries via Neural Architecture Fuzzing

Muffin 论文 现有方法 CRADLE 和 LEMON&#xff0c;依赖模型推理阶段输出进行差分测试&#xff0c;但在训练阶段是不可行的&#xff0c;因为训练阶段直到最后才有固定输出&#xff0c;中间过程是不断变化的。API 库覆盖低&#xff0c;因为各个 API 都是在各种具体场景下使用。…...

libfmt: 现代C++的格式化工具库介绍与酷炫功能

libfmt: 现代C的格式化工具库介绍与酷炫功能 libfmt 是一个开源的C格式化库&#xff0c;提供了高效、安全的文本格式化功能&#xff0c;是C20中引入的std::format的基础实现。它比传统的printf和iostream更安全、更灵活、性能更好。 基本介绍 主要特点 类型安全&#xff1a…...

C++_哈希表

本篇文章是对C学习的哈希表部分的学习分享 相信一定会对你有所帮助~ 那咱们废话不多说&#xff0c;直接开始吧&#xff01; 一、基础概念 1. 哈希核心思想&#xff1a; 哈希函数的作用&#xff1a;通过此函数建立一个Key与存储位置之间的映射关系。理想目标&#xff1a;实现…...

【Ftrace 专栏】Ftrace 参考博文

ftrace、perf、bcc、bpftrace、ply、simple_perf的使用Ftrace 基本用法Linux 利用 ftrace 分析内核调用如何利用ftrace精确跟踪特定进程调度信息使用 ftrace 进行追踪延迟Linux-培训笔记-ftracehttps://www.kernel.org/doc/html/v4.18/trace/events.htmlhttps://blog.csdn.net/…...

Docker、Wsl 打包迁移环境

电脑需要开启wsl2 可以使用wsl -v 查看当前的版本 wsl -v WSL 版本&#xff1a; 2.2.4.0 内核版本&#xff1a; 5.15.153.1-2 WSLg 版本&#xff1a; 1.0.61 MSRDC 版本&#xff1a; 1.2.5326 Direct3D 版本&#xff1a; 1.611.1-81528511 DXCore 版本&#xff1a; 10.0.2609…...