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

PCI 总线学习笔记(五)

PCI 总线学习系列,参考自
技术大牛博客: PCIe 扫盲系列博文连载目录篇
书籍:王齐老师的《PCI Express 体系结构导读》


下面的文章中加入了自己的一些理解和实际使用中遇到的一些场景,供日后查询和回忆使用

PCI 总线定义了两类配置请求, 一类是 Type 00h 配置请求, 另一类是 Type 01h 配置请求。 PCI 总线使用这些配置请求访问 PCI 总线树上的设备配置空间, 包括 PCI 桥和 PCI Agent 设备的配置空间。

  • Type 00h 配置请求:用于访问与 HOST 主桥或者 PCI 桥直接相连的 PCI Agent 设备或者 PCI 桥(仅能传递给目标设备,而不会被进一步转发)
  • Type 01h 配置请求: HOST 主桥或者 PCI 桥使用 Type 01h 配置请求, 需要至少穿越一个 PCI 桥, 访问没有与其直接相连的 PCI Agent 设备或者 PCI 桥(配置请求可以被进一步转发)

1、Type 01h 和Type 00h 配置请求

  在 PCI 总线中, 只有 PCI 桥能够接收 Type 01h 配置请求。Type 01h 配置请求不能直接发向最终的 PCI Agent 设备, 而只能由 PCI 桥将其转换为 Type 01h 继续发向其他 PCI 桥, 或者转换为 Type 00h 配置请求发向 PCI Agent 设备。

  以 x86 系统为例,在地址周期中, HOST 主桥使用配置读写总线事务, 将 CONFIG_ADDRESS 寄存器的内容复制到 PCI 总线的 AD [31∶0] 信号线中。 CONFIG_ADDRESS 寄存器与 Type 01h 配置请求的对应关系如下图所示
在这里插入图片描述

  从上图中可以发现, CONFIG_ADDRESS 寄存器的内容基本上是原封不动地复制到 PCI 总线的AD [31∶0] 信号线上的。 其中 CONFIG_ADDRESS 的 Enable 位不被复制, 而 AD 总线的第 0 位必须为 1, 表示当前配置请求是 Type 01h。

  当 PCI 总线接收到 Type01 配置请求时, 将寻找合适的 PCI 桥接收这个配置信息。 如果这个配置请求是直接发向 PCI 桥下的与之直接相连的 PCI 设备时, PCI 桥将接收这个 Type 01 配置请求,并将其转换为 Type 00h 配置请求; 否则 PCI 桥将当前 Type 01h 配置请求原封不动地传递给下一级 PCI 总线。

  如果 HOST 主桥或者 PCI 桥发起的是 Type 00h 配置请求, CONFIG_ADDRESS 寄存器与 AD [31∶0] 的转换如下图所示:
在这里插入图片描述

  此时处理器对 CONFIG_DATA 寄存器进行读写时, 处理器将 CONFIG_ADDRESS 寄存器中的 Function Number 和 Register Number 字段复制到 PCI 的 AD 总线的第10 ~2 位; 将 AD 总线的第 1~0 位赋值为 0b00。 PCI 总线在配置请求总线事务的地址周期根据 AD [1∶0] 判断当前配置请求是 Type 00h 还是 Type 01h。

如果 AD [1∶0] 等于 0b 00 表示是 Type 00h 配置请求, 如果 AD [1∶0] 等于 0b 01 表示是 Type 01h 配置请求

  而 AD [31∶11] 与 CONFIG_ADDRESS 的 Device Number 字段有关, 在 Type 00h 配置请求的地址周期中, AD [31∶11] 位有且只有一位为 1, 其中 AD [31∶11] 的每一位选通一个 PCI 设备的配置空间。 PCI 设备配置空间的片选信号是 IDSEL, 因此 AD[31∶ 11] 将与 PCI 设备的 IDSEL 信号对应相连

从这里可以知道, PCI 协议中的设备号,是由 PCI 设备的 IDSEL 信号线,与 PCI 总线上的地址线 AD[0 : 31] 的硬件连接关系确定的

1.1、总结

  上面讲解的东西,更多的是为了理解 PCI 协议,真正在 PCI 总线驱动开发上用到的不多。比较常用的就是配置 HOST 主桥发出的到底是 Type 00h 还是 Type 01h 配置请求。

  有些板卡,硬件上已经配置好 HOST 发出的到底是 Type 00h 还是 Type 01h 配置请求,我们无需关心。有些板卡更灵活,需要我们手动在软件上去配置,例如:当访问的 bus 号为当前 PCI 控制器起始 bus 号 + 1 时,使用 Type 00h 配置请求;否则就是 Type 01h 配置请求。了解了底层的原理,这里我们具体场景具体分析就行,不必拘泥。

1.2 代码实例

以 rk3568 为例:

static void __iomem *rk_pcie_ecam_map_bus(struct pci_bus *bus, unsigned int devfn, int where)
{
....../*  如果访问的是 root bus,使用 Type 00h,不需要转发;否则使用  Type 01h*/if (pci_is_root_bus(bus->parent))atu_type = PCIE_ATU_TYPE_CFG0;elseatu_type = PCIE_ATU_TYPE_CFG1;
......
}

以 Linux 源码中,dw IP 核代码为例:

static int dw_pcie_rd_other_conf(struct pcie_port *pp, struct pci_bus *bus,u32 devfn, int where, int size, u32 *val)
{
......if (bus->parent->number == pp->root_bus_nr) {type = PCIE_ATU_TYPE_CFG0;cpu_addr = pp->cfg0_base;cfg_size = pp->cfg0_size;va_cfg_base = pp->va_cfg0_base;} else {type = PCIE_ATU_TYPE_CFG1;cpu_addr = pp->cfg1_base;cfg_size = pp->cfg1_size;va_cfg_base = pp->va_cfg1_base;}
......
}

2、PCI 总线配置请求的转换原则

  当 CONFIG_ADDRESS 寄存器的 Enable 位为 1, 系统软件访问 CONFIG_DATA 寄存器时,HOST 主桥可以产生两类 PCI 总线配置读写总线事务, 分别为 Type 00h 和 Type 01h 配置读写总线事务。 在配置读写总线事务的地址周期和数据周期中,CONFIG_ADDRESS 和 CONFIG_DATA 寄存器中的数据将被放置到 PCI 总线的 AD 总线上。 其中 Type 00h 和 Type 01h 配置读写总线事务映射到 AD 总线的数据并不相同。

  其中 Type 00h 配置请求可以直接读取 PCI Agent 设备的配置空间, 而 Type 01h 配置请求在通过 PCI 桥时, 最终将被转换为 Type 00h 配置请求, 并读取 PCI Agent 设备的配置寄存器。 本节重点讲述 PCI 桥如何将 Type 01h 配置请求转换为 Type 00h 配置请求。

  首先 Type 00h 配置请求不会被转换成 Type 01h 配置请求, 因为 Type 00h 配置请求是发向最终 PCI Agent 设备, 这些 PCI Agent 设备不会转发这些配置请求。当 CONFIG_ADDRESS 寄存器的 Bus Number 字段为 0 时, 处理器对 CONFIG_DATA 寄存器操作时, HOST 主桥将直接产生 Type 00h 配置请求, 挂接在 PCI 总线 0 上的某个设备将通过 ID 译码接收这个 Type 00h 配置请求, 并对配置寄存器进行读写操作。 如果 PCI 总线上没有设备接收这个 Type 00h 配置请求, 将引发 Master Abort, 详情见 PCI 总线规范, 本节对此不做进一步说明。

  如果 CONFIG_ADDRESS 寄存器的 Bus Number 字段为 n ( n≠ 0), 即访问的 PCI 设备不是直接挂接在 PCI 总线 0 上的, 此时 HOST 主桥对 CONFIG_DATA 寄存器操作时, 将产生Type 01h 配置请求, PCI 总线 0 将遍历所有在这条总线上的 PCI 桥, 确定由哪个 PCI 桥接收这个 Type 01h 配置请求。如果 n 大于或等于某个 PCI 桥的 Secondary Bus Number 寄存器, 而且小于或等于 Subordinate Bus number 寄存器, 那么这个 PCI 桥将接收在当前 PCI 总线上的 Type 01 配置请求,并采用以下规则进行递归处理:

  1. 开始。
  2. 遍历当前 PCI 总线的所有 PCI 桥。
  3. 如果 n 等于某个 PCI 桥的 Secondary Bus Number 寄存器, 说明这个 Type 01 配置请求的目标设备直接连接在该 PCI 桥的 Secondary bus 上。 此时 PCI 桥将 Type 01 配置请求转换为 Type 00h 配置请求, 并将这个配置请求发送到 PCI 桥的 Secondary Bus 上, Secondary Bus 上的某个设备将响应这个 Type 00h 配置请求, 并与 HOST 主桥进行配置信息的交换,转 (5) 。
  4. 如果 n 大于 PCI 桥的 Secondary Bus Number 寄存器, 而且小于或等于 PCI 桥的 Subordinate Bus number 寄存器, 说明这个 Type 01 配置请求的目标设备不与该 PCI 桥的 Secondary Bus 直接相连, 但是由这个 PCI 桥下游总线上的某个 PCI 桥管理。 此时 PCI 桥将首先认领这个 Type 01 配置请求, 并将其转发到 Secondary Bus, 转 (2)。
  5. 结束。

3、PCI 总线树 Bus 号的初始化

参考 PCI 总线学习笔记(三)

4、PCI 总线 Device 号的分配

  一条 PCI 总线会挂接各种各样的 PCI 设备, 而每一个 PCI 设备在 PCI 总线下具有唯一的设备号。 系统软件通过总线号和设备号定位一个 PCI 设备之后, 才能访问这个 PCI 设备的配置寄存器。

  PCI 设备的 IDSEL 信号与 PCI 总线的 AD [31∶ 0] 信号的连接关系决定了该设备在这条 PCI 总线的设备号。 如上文所述, 每一个 PCI 设备都使用独立的 IDSEL 信号, 该信号将与 PCI 总线的 AD [31∶ 0] 信号连接, IDSEL 信号的含义见第 PCI 总线学习笔记(一)。

  在此我们简要回顾 PCI 的配置读写事务使用的时序。 如下图所示, PCI 总线事务由一个地址周期加若干个数据周期组成。 在进行配置读写请求总线事务时, C / BE# 信号线的值在地址周期中为 0x1010 或者为 0x1011, 表示当前总线事务为配置读或者配置写请求。 此时出现在 AD [31∶ 0] 总线上的值并不是目标设备的 PCI 总线地址, 而是目标设备的 ID 号, 这与 PCI 总线进行 I / O 或者存储器请求时不同, 因为 PCI 总线使用 ID 号而不是 PCI 总线地址对配置空间进行访问。
在这里插入图片描述
  如图 2-12 所示, 在配置读写总线事务的地址周期中, AD [10∶ 0] 信号已经被 Function Number 和 Register Number 使用, 因此 PCI 设备的 IDSEL 只能与 AD [31∶ 11] 信号连接。认真的读者一定可以发现在 CONFIG_ADDRESS 寄存器中 Device Number 字段一共有 5 位可以表示 32 个设备, 而 AD [31∶ 11] 只有 21 位, 显然在这两者之间无法建立一一对应的映射关系。 因此在一条 PCI 总线上如果有 21 个以上的 PCI 设备, 那么总是有几个设备无法与 AD [31∶ 11] 信号线连接, 从而 PCI 总线无法访问这些设备。 因为 PCI 总线在配置请求的地址周期中, 只能使用第 31 ~ 11 这些 AD 信号, 所以在一条总线上最多也只能挂接 21 个 PCI 设备。 这 21 个设备可能是从 0 到 20, 也可能是从 11 到 31 排列。 从而系统软件在遍历 PCI 总线时, 还是需要从 0 到 31 遍历整条 PCI 总线。

在这里插入图片描述

  在实际的应用中, 一条 PCI 总线能够挂接 21 个设备已经足够了, 实际上由于 PCI 总线的负载能力有限, 即便在总线频率为 33 MHz 的情况下, 在一条 PCI 总线中最多也只能挂接 10 个负载, 一条 PCI 总线所能挂接的负载详见表 1-1。 AD 信号线与 PCI 设备 IDSEL 线的连接关系如图 2-14 所示
在这里插入图片描述

  PCI 总线推荐了一种 Device Number 字段与 AD [31∶ 16] 之间的映射关系。 其中 PCI 设备 0 与 Device Number 字段的 0b00000 对应; PCI 设备 1 与 Device Number 字段的 0b00001 对应, 并以此类推, PCI 设备 15 与 Device Number 字段的 0b01111 对应。

  在这种映射关系之下, 一条 PCI 总线中, 与信号线 AD16 相连的 PCI 设备的设备号为 0;与信号线 AD17 相连的 PCI 设备的设备号为 1; 以此类推, 与信号线 AD31 相连的 PCI 设备的设备号为 15。 在 Type 00h 配置请求中, 设备号并没有像 Function Number 和 Register Number 那样以编码的形式出现在 AD 总线上, 而是与 AD 信号一一对应, 如图 2-12 所示。

  这里有一个原则需要读者注意, 就是对 PCI 设备的配置寄存器进行访问时, 一定要有确定的 Bus Number、 Device Number、 Function Number 和 Register Number, 这 “四元组” 缺一不可。 在 Type 00h 配置请求中, Device Number 由 AD [31∶ 11] 信号线与 PCI 设备 IDSEL 信号的连接关系确定; Function Number 保存在 AD [10∶ 8] 字段中; 而 Register Number 保存在 AD [7∶ 2] 字段中; 在 Type 01h 配置请求中, 也有完整的四元组信息。

相关文章:

PCI 总线学习笔记(五)

PCI 总线学习系列,参考自 技术大牛博客: PCIe 扫盲系列博文连载目录篇 书籍:王齐老师的《PCI Express 体系结构导读》 下面的文章中加入了自己的一些理解和实际使用中遇到的一些场景,供日后查询和回忆使用 PCI 总线定义了两类配置…...

PyTorch与CUDA的关系

文章目录 前言一、如何查看PyTorch和torchvision的版本1.1 查看PyTorch版本1.2 查看torchvision版本二、如何确认PyTorch和torchvision是否支持CUDA加速2.1 检查PyTorch是否支持CUDA2.2 查看当前可用的GPU设备2.3 检查torchvision是否支持CUDA三、CUDA版本的秘密:为什么PyTorc…...

网络中断事件进行根因分析(RCA)

网络中断事件的根因分析(RCA)详解 根因分析(Root Cause Analysis, RCA)是网络运维中用于定位和解决故障的核心方法,目标是找到问题的根本原因,避免重复发生。以下是完整的RCA流程和方法: 1. RC…...

Mac中 “XX”文件已损坏,无法打开 解决方案

前言 Mac中打开软件 出现“XX”文件已损坏,无法打开的提示 怎么处理? 操作总结 1、查看当前 Gatekeeper 是否启用 spctl --status2、完全关闭 Gatekeeper(允许安装任何来源应用) sudo spctl --master-disable3、打开“系统设…...

如何通过python连接hive,并对里面的表进行增删改查操作

要通过Python连接Hive并对其中的表进行增删改查操作,可以使用pyhive库。下面是一个简单的示例代码,演示如何连接Hive并执行一些操作: from pyhive import hive# 建立连接 conn hive.connect(hostyour_hive_host, port10000, authNOSASL)# 创…...

对Mac文字双击或三击鼠标左键没有任何反应

目录 项目场景: 问题描述 原因分析: 解决方案: 项目场景: 在使用Mac系统的时候,使用Apple无线鼠标,双击左键能够选取某个单词或词语,三击左键能够选取某一行,(百度、…...

【维护窗口内最值+单调队列/优先队列】Leetcode 239. 滑动窗口最大值

题目要求 给定一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。滑动窗口每次只向右移动一位。要求返回滑动窗口中的最大值。 示例 1 输入:nums [1,3,-1,-3,5,3,6,7], k 3 输出:[3,3,5,5,6,7] 解释&#…...

【Leetcode 每日一题】2845. 统计趣味子数组的数目

问题背景 给你一个下标从 0 0 0 开始的整数数组 n u m s nums nums,以及整数 m o d u l o modulo modulo 和整数 k k k。 请你找出并统计数组中 趣味子数组 的数目。 如果 子数组 n u m s [ l . . r ] nums[l..r] nums[l..r] 满足下述条件,则称其为…...

SDC命令详解:使用get_cells命令进行查询

相关阅读 SDC命令详解https://blog.csdn.net/weixin_45791458/category_12931432.html?spm1001.2014.3001.5482 get_cells命令用于创建一个单元对象集合,关于设计对象和集合的更详细介绍,可以参考下面的博客。 Synopsys:设计对象https://c…...

正则表达式及其游戏中应用

一、正则表达式基础知识 ✅ 什么是正则表达式? 正则表达式是一种用来匹配字符串的规则表达式,常用于搜索、验证、替换等文本处理场景。 比如你想找出玩家输入中的邮箱、命令、作弊码……正则就特别好用。 📚 常见语法速查表: …...

如何在 MinGW 和 Visual Studio (MSVC) 之间共享 DLL

如何在 MinGW 和 Visual Studio (MSVC) 之间共享 DLL ✅ .dll.a 和 .lib 是什么? 1. .dll.a(MinGW 下的 import library) 作用:链接时告诉编译器如何调用 DLL 中的函数。谁用它:MinGW 编译器(如 g&#x…...

【HTTP/2和HTTP/3的应用现状:看不见的革命】

HTTP/2和HTTP/3的应用现状:看不见的革命 实际上,HTTP/2和HTTP/3已经被众多著名网站广泛采用,只是这场革命对普通用户来说是"无形"的。让我们揭开这个技术变革的真相。 著名网站的HTTP/2和HTTP/3采用情况 #mermaid-svg-MtfrNDo5DG…...

ts中null类型--结合在vue中的使用、tsconfig.json

总结 TypeScript 中的 null 是一个独立的类型,用于明确表示“无值”或“空值”。在实际开发中,常通过联合类型(如 string | null)或与 ref 结合使用,确保代码的类型安全和可读性。 详情解释 在 TypeScript 中,null 是一个独立的类型,表示 null 值本身。以下是一些关于…...

Hadoop生态圈框架部署 - Windows上部署Hadoop

文章目录 前言一、下载Hadoop安装包及bin目录1. 下载Hadoop安装包2. 下载Hadoop的bin目录 二、安装Hadoop1. 解压Hadoop安装包2. 解压Hadoop的Windows工具包 三、配置Hadoop1. 配置Hadoop环境变量1.1 打开系统属性设置1.2 配置环境变量1.3 验证环境变量是否配置成功 2. 修改Had…...

深度学习笔记22-RNN心脏病预测(Tensorflow)

🍨 本文为🔗365天深度学习训练营中的学习记录博客🍖 原作者:K同学啊 一、前期准备 1.导入数据 import tensorflow as tf import pandas as pd import numpy as np dfpd.read_csv("E:/heart.csv") df 2.检查数据是否有…...

面试踩过的坑

1、 “”和equals 的区别 “”是运算符,如果是基本数据类型,则比较存储的值;如果是引用数据类型,则比较所指向对象的地址值。equals是Object的方法,比较的是所指向的对象的地址值,一般情况下,重…...

【机器学习速记】面试重点/期末考试

自用,有错误欢迎评论区指出 目录 一、机器学习基础概念 二、机器学习类型分类 三、经典算法与原理 1. 线性模型 2. 决策树 3. SVM(支持向量机) 4. K近邻(KNN) 5. 贝叶斯分类 6. 集成学习 四、模型评价指标 五、模型泛化能力与调参 六、特征工程与数据预处理 七、维…...

Cursor如何手动添加多个大模型?

笔者在前面的文章Cursor接入API: deepseekV3(免费)_cursor api-CSDN博客中介绍了如何添加deepseek到Cursor中,如果要添加其他大模型,比如阿里的通义千问qwen-max-2025-01-25等,方法一样,在官方网站找到模型名称和base_url&#xf…...

FerretDB:基于PostgreSQL的MongoDB替代产品

FerretDB 是一种基于NoSQL的分布式数据库,它旨在通过优化存储和查询机制来提供卓越的性能和可靠性。它支持水平扩展和高并发访问,并提供灵活的数据模型,使开发人员能够轻松地存储和检索各种类型的数据。 Stars 数10,057Forks 数439 主要特点…...

JDBC 批处理与事务处理:提升数据操作效率与一致性的密钥

目录 一. JDBC批量添加数据 1. 什么是批量添加数据 2. 实现数据的批量添加 a. 方式一:不分块 二. JDBC事务处理 1. 什么是事务 2. JDBC事务处理实现 三. 总结 前言 本文来讲解JDBC的批处理和事务处理 这对数据的安全性和准确性以及高效率提供很好的办法 话不…...

vue2实现Blod文件流下载

实现思路: 动态创建一个a标签,模拟点击打开链接,实现下载 downLoad() { //调用下载接口Export({Id: id}).then(res > {this.showLoading false;if (res && res.data && res.data.returnCode -1) {this.msgError(res.d…...

js数据结构之栈

JavaScript数据结构 一、什么是数据结构? 数据结构是向相互之间存在一种或者多种特定关系的数据组成的集合, 采用合适的数据结构能给开发者提高开发和储存效率.比如我们在学习Es6中的我们新接触的到的(Set, map), 在合适的时候使用它们能帮助我们更快的的解决问题. 我们每个在…...

[Windows] 卡巴斯基Kaspersky 21.21.7.384 免费版

卡巴斯基免费版从界面到功能和使用体验来说,简洁、高效、严苛、轻巧,可以“弥补”火绒杀毒能力不强,同时也不会像 Microsoft Defender 误报。 链接1:https://pan.xunlei.com/s/VOOhFEeznr_4W6s7-XT8IwN-A1?pwdztn4# 链接2&…...

【HFP】蓝牙HFP协议中音频连接转移与拨号功能的深度解析

目录 一、核心功能矩阵 二、音频连接向 HF 转移 2.1 转移概述 2.2 前提条件 2.3 适用情况 2.4 转移流程 2.5 注意事项 2.6 示例图 三、音频连接向 AG 转移 3.1 转移概述 3.2 前提条件 3.3 特殊情况处理 3.4 转移流程 3.5 注意事项 3.6 示例图 四、通过HF提供号…...

Android学习总结之Glide篇(缓存和生命周期)

一、Glide缓存 1. 内存缓存 内存缓存主要包含活动资源缓存与 LRU 内存缓存这两个级别。 活动资源缓存(Active Resources) 作用:用于存放当前正在被显示的图片资源。当某张图片正展示在 ImageView 上时,它会被纳入活动资源缓存…...

Python 快速获取Excel工作表名称

文章目录 前言准备工作Python 获取Excel中所有工作表的名称Python 获取Excel中隐藏工作表的名称 前言 在数据分析与办公自动化领域,通过Python处理Excel文件已成为必备技能。通过获取工作表名称,我们可以: 快速了解文件结构自动化处理多工作…...

基于Docker的Flask项目部署完整指南

基于Docker的Flask项目部署完整指南 项目结构与文件说明 TextWeb/ ├── .dockerignore # Docker构建忽略配置 ├── Dockerfile # Docker镜像构建文件 ├── requirements.txt # Python依赖清单 └── WebServer/└── main.py # Fl…...

分布式定时任务(xxl-job)

简介 什么是XXL-JOB 详细的文档类容可以看下面这个链接进入readme xxl-job简介以及下载地址 XXL-JOB是一个分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展 在Java Spring Cloud微服务架构中,使用独立的定时任务调度中心&…...

PostgreSQL使用LIKE右模糊没有走索引分析验证

建表&数据初始化可参考PostgreSQL 分区表——范围分区SQL实践 背景: 给t_common_work_order_log的handle_user_name新建索引后,使用LIKE右模糊匹配查询时,发现走的全表扫描 CREATE INDEX order_log_handle_user_name_index ON t_commo…...

Jenkins流水线管理工具

文章目录 前言: DevOps时代的自动化核心 —Jenkins一、Jenkins是什么?二、Linux安装Jenkinswar包方式安装依赖环境下载 Jenkins WAR 包启动 Jenkins 服务启动日志验证配置插件镜像源 docker镜像方式安装依赖环境拉取 Jenkins 镜像运行 Jenkins 容器获取初…...

2025年保安员证考试题库及答案

一、单选题 96、手指出血,为达到止血作用,应该压住()。 A.出血手指的尖端 B.出血手指根部前后两侧 C.出血手指根部左右两侧 D.腕部的桡动脉、尺动脉 答案:C 97、下列选项中对干粉灭火器使用方法叙述错误的是&…...

观测云数据在Grafana展示的最佳实践

背景 在当今的数据驱动世界中,组织越来越依赖于实时数据来做出决策。数据可视化是理解和分析这些数据的关键工具,它帮助用户将复杂的数据集转换成直观的图表和仪表板,从而更容易识别趋势、模式和异常。Grafana,作为一个功能强大的…...

点云从入门到精通技术详解100篇-基于二次误差和高斯混合模型的点云配准算法

目录 知识储备 结合二次误差度量与高斯混合模型的点云配准 算法核心创新点: 关键参数说明: 性能优化建议: 前言 国内外研究现状 全局配准算法的国内外研究 局部配准算法的国内外研究 2 点云配准相关概念与方法 2.1 什么是点云配准 2.2 点云的获取及点云主要数据…...

shell命令一

&> /dev/null yum -y install vsftpd &> /dev/null&> /dev/null &>:将命令的**标准输出(stdout)和标准错误(stderr)**同时重定向。/dev/null:Linux中的“黑洞”设备&#xf…...

MySQL性能常用优化技巧总结

1. 索引优化 创建合适的索引 -- 为常用查询条件创建索引 ALTER TABLE users ADD INDEX idx_email (email); ALTER TABLE orders ADD INDEX idx_customer_date (customer_id, order_date);避免索引失效的情况 -- 避免在索引列上使用函数 SELECT * FROM users WHERE DATE(crea…...

在 Spring Boot 中实现 WebSockets

什么是 WebSockets? WebSockets 是一种基于 TCP 的全双工通信协议,允许客户端和服务器之间建立持久的双向连接,用于实时数据交换。相较于传统的 HTTP 请求-响应模型,WebSockets 提供了低延迟、高效率的通信方式,特别适…...

stone 3d v3.3.0版本发布,含时间线和连接器等新功能

1.新加了时间线(timeline)编辑器,可以类似blender一样给对象制作动画 2.新加了度量(metrics)系统,通过scene对象检测器中的useMetrics属性来启用或禁用,启用时所选物体将显示三维度量数据 新加了…...

Parasoft C++Test软件单元测试_对函数打桩的详细介绍

系列文章目录 Parasoft C++Test软件静态分析:操作指南(编码规范、质量度量)、常见问题及处理 Parasoft C++Test软件单元测试:操作指南、实例讲解、常见问题及处理 Parasoft C++Test软件集成测试:操作指南、实例讲解、常见问题及处理 进阶扩展:自动生成静态分析文档、自动…...

Safety Estimands与Efficacy Estimands的差异剖析

1. 研究目标差异 1.1 安全性估计目标 1.1.1 关注潜在风险 安全性估计目标着重于治疗可能引发的不良事件(AE)、严重不良事件(SAE)或实验室指标异常,如化疗药物导致中性粒细胞减少症的发生率,这些指标直接关联到患者治疗过程中的健康风险。 这些潜在风险的评估对于确保治…...

HTML 详解:从基础结构到语义标签

目录 一、HTML 是什么&#xff1f;二、HTML 的基本结构✅ 简要说明&#xff1a; 三、常见 HTML 标签讲解3.1 标题标签 <h1> ~ <h6>3.2 段落和换行3.3 超链接3.4 图像插入3.5 列表无序列表&#xff1a;有序列表&#xff1a; 3.6 表格结构 四、HTML 语义化标签详解五…...

联合索引`ABC`,使用`B=... AND C=... AND A=...`会走索引吗?

在MySQL中&#xff0c;联合索引ABC的查询使用B... AND C... AND A...时&#xff0c;是否使用索引取决于查询条件的顺序和优化器的处理。 一、索引使用原理 最左前缀原则 联合索引的底层存储和查询优化遵循最左前缀匹配原则&#xff0c;即查询条件必须从索引的最左侧列开始连续匹…...

HTML 模板技术与服务端渲染

HTML 模板技术与服务端渲染 引言 在现代前端开发生态中&#xff0c;HTML模板技术与服务端渲染(SSR)构成了连接前后端的重要桥梁。当单页应用(SPA)因其客户端渲染特性而面临首屏加载速度慢、白屏时间长和SEO不友好等问题时&#xff0c;服务端渲染技术提供了一种优雅的解决方案…...

MySQL的MVCC【学习笔记】

MVCC 事务的隔离级别分为四种&#xff0c;其中Read Committed和Repeatable Read隔离级别&#xff0c;部分实现就是通过MVCC&#xff08;Multi-Version Concurrency Control&#xff0c;多版本并发控制&#xff09; 版本链 版本链是通过undo日志实现的&#xff0c; 事务每次修改…...

linux安装单节点Elasticsearch(es),安装可视化工具kibana

真的&#xff0c;我安装个es和kibana&#xff0c;找了好多帖子&#xff0c;问了好几遍ai才安装成功&#xff0c;在这里记录一下&#xff0c;我相信&#xff0c;跟着我的步骤走&#xff0c;99%会成功&#xff1b; 为了让大家直观的看到安装过程&#xff0c;我把我服务器的es和ki…...

(Go Gin)上手Go Gin 基于Go语言开发的Web框架,本文介绍了各种路由的配置信息;包含各场景下请求参数的基本传入接收

1. 路由 gin 框架中采用的路优酷是基于httprouter做的 HttpRouter 是一个高性能的 HTTP 请求路由器&#xff0c;适用于 Go 语言。它的设计目标是提供高效的路由匹配和低内存占用&#xff0c;特别适合需要高性能和简单路由的应用场景。 主要特点 显式匹配&#xff1a;与其他路由…...

纯HTMLCSS静态网站——元神

《原神》主题网页介绍 以对该网页的详细介绍 网页整体结构 头部&#xff08;header&#xff09;&#xff1a;包含网站的 logo 和导航栏。logo 部分展示了 “原神” 字样&#xff0c;点击可返回首页。导航栏提供了多个页面链接&#xff0c;包括首页、音乐、视频、壁纸、世界、…...

嵌入式开发:基础知识介绍

一、嵌入式系统 1、介绍 以提高对象体系智能性、控制力和人机交互能力为目的&#xff0c;通过相互作用和内在指标评价的&#xff0c;嵌入到对象体系中的专用计算机系统。 2、分类 按其形态的差异&#xff0c;一般可将嵌入式系统分为&#xff1a;芯片级&#xff08;MCU、SoC&am…...

华为VRP系统简介配置TELNET远程登录!

1.华为 VRP 系统概述 1.1 什么是 VRP VRP&#xff08;Versatile Routing Platform 华为数通设备操作系统&#xff09;是华为公司数据通信产品的通用操作系统平台&#xff0c;从低端到核心的全系列路由器、以太网交换机、业务网关等产品的软件核心引擎。 1.2 VRP 的功能 统一…...

【高频考点精讲】CSS accent-color属性:如何快速自定义表单控件的颜色?

用CSS accent-color属性3分钟搞定表单控件换肤,原来这么简单! 前几天有个学员问我,checkbox和radio这些表单控件默认样式太丑了,有没有什么办法能快速改颜色?" 我一看这问题就乐了——这不正是CSS accent-color属性的拿手好戏吗?今天咱们就来好好聊聊这个被低估的C…...

【Git】连接github时的疑难杂症(DNS解析失败)

大家好&#xff0c;我是jstart千语。最近在将项目推送到github的时候&#xff0c;突然github就拒绝访问了&#xff0c;即使挂了VPN&#xff0c;网页也进不去&#xff0c;通过git也不能把代码推送上去。 即使后面看别人的一些解决方案&#xff0c;比如取消代理啊、更换ssh的方式…...