PCIe-Error Detection(一)
下表为PCIe协议中给出的错误:
一、可纠正错误(Correctable Errors,8种)
检错机制
错误名称 | 检测层级 | 触发条件 |
---|---|---|
Receiver Error | Physical | 接收端均衡器(EQ)监测到眼图闭合/信号失真 |
Bad TLP | Link | LCRC校验失败 或 序列号不连续 |
Bad DLLP | Link | DLLP类型非法(如无效流控包)或控制字段错误 |
Replay Number Rollover | Link | 重放计数器达到最大值(0x3FF) |
Replay Timer Timeout | Link | 未收到ACK响应时间超过16μs(PCIe 3.0+) |
Advisory Non-Fatal | Transaction | TLP保留位非零、长度字段轻微异常(未导致功能失效) |
Corrected Internal | Device | 内部ECC/奇偶校验纠正缓存或寄存器错误 |
Header Log Overflow | Transaction | AER包头日志寄存器溢出(日志深度不足) |
解决方案
graph LRA[物理层错误] --> B[触发LTSSM重训练]C[链路层错误] --> D[NAK响应 + 重放缓冲区重发]E[事务层错误] --> F[丢弃TLP + 更新AER日志]G[设备内部错误] --> H[静默更新DevStatus寄存器]
二、不可纠正非致命错误(Uncorrectable Non-Fatal,10种)
检错机制
错误名称 | 检测层级 | 触发条件 |
---|---|---|
Poisoned TLP Received | Transaction | TLP头部EP位=1(发送端标记数据无效) |
ECRC Check Failed | Transaction | 端到端CRC校验不匹配 |
Unsupported Request | Transaction | 非法地址空间访问/不支持的TLP类型(如向RO BAR写入) |
Completion Timeout | Transaction | Requester等待完成包超时(默认50ms) |
Completer Abort | Transaction | Completer内部故障无法处理请求 |
Unexpected Completion | Transaction | 完成包与未完成请求无映射关系 |
ACS Violation | Transaction | 违反访问控制规则(如Endpoint间禁止通信) |
MC Blocked TLP | Transaction | 多播包被交换机路由过滤 |
AtomicOps Egress Blocked | Transaction | 原子操作(AtomicOp)超出设备处理能力 |
TLP Prefix Blocked | Transaction | 收到设备不支持的前缀类型(如IDE/TS前缀) |
解决方案
- 通用处理流:
- 立即中止当前事务
- 向Root Complex发送 ERR_NONFATAL 消息
- 更新AER状态寄存器(Uncorrectable Error Status)
- 软件策略:驱动重试请求/资源释放/日志告警
三、不可纠正致命错误(Uncorrectable Fatal,7种)
检错机制
错误名称 | 检测层级 | 触发条件 |
---|---|---|
Uncorrectable Internal | Device | 不可恢复的内部硬件失效(如核心逻辑崩溃) |
Surprise Down | Link | 物理链路意外断开(LTSSM从L0直接跳至Detect) |
Receiver Overflow | Transaction | 接收缓冲区溢出(信用计数失效) |
DLL Protocol Error | Link | 数据链路层状态机违例(如ACK/NAK序列混乱) |
Flow Control Protocol | Transaction | 流控信用计数器异常(负值/死锁) |
Malformed TLP | Transaction | TLP格式严重违规(如长度=0但含负载) |
Receiver Overflow | Transaction | 接收队列过载导致数据丢失 |
解决方案
graph TBA[链路层协议错误] --> B[强制链路复位 LTSSM→Detect]C[事务层协议错误] --> D[立即丢弃包 + 触发ERR_FATAL]E[设备级灾难错误] --> F[Function Level Reset FLR]G[物理链路崩溃] --> H[OS热插拔协议重枚举]
四、纠正机制解析
1. 物理层自主恢复(LTSSM状态机)
- 错误场景:Receiver Error/Surprise Down
- 动作:
L0 → Recovery → Config.Lanenum → Loopback(测试) → 重新协商速率/通道数
2. 链路层重传协议(重放缓冲区)
- 触发条件:Bad TLP/Replay Timer Timeout
- 重传逻辑:
if (收到NAK || 超时未响应) {从Replay Buffer提取历史TLP重新发送;序列号SEQ_NUM维持不变; // 防止接收端重复处理 }
3. AER高级错误报告流程
-
关键寄存器:
寄存器 作用 Uncorrectable Error Status 记录非致命/致命错误位图 Header Log Register 保存错误TLP包头(前4 DW) Root Error Status RC汇总总线错误 -
软件处理:
1. 读取AER寄存器定位错误源; 2. 清空错误标志位; 3. 决策:重试/复位/禁用设备。
⚠️ 重要原则:致命错误发生后,设备必须通过FLR(Function Level Reset)复位,避免错误状态残留。FLR操作通过设置PCI配置空间Device Control Register的Initiate Function Reset位实现。
FLR(Function Level Reset,功能级复位)是PCIe协议中一种针对多功能设备(Multi-Function Device)的精细化复位机制,允许仅复位特定功能模块(Function)而不影响设备其他功能或链路状态。以下从定义、触发条件及使用方法三方面详细解析:
4.FLR的定义与核心特性
-
精准复位范围
- 仅复位目标Function的内部状态、寄存器及逻辑电路,不改变以下内容:
- Sticky Bits(如熔断器配置等需断电才能重置的寄存器)
- 硬件初始化寄存器(由芯片引脚或EEPROM固化的值)
- 链路相关寄存器(如ASPM控制、流量控制参数)
- 保持PCIe链路活跃状态,其他Function可继续通信。
- 仅复位目标Function的内部状态、寄存器及逻辑电路,不改变以下内容:
-
强制时间约束
- 规范要求FLR操作必须在 100ms内完成,超时视为失败。
-
安全隔离设计
- 复位期间丢弃所有传入TLP(事务层包),避免残留错误状态污染。
- 复位后需清除敏感信息(如加密密钥),防止数据泄露。
4.1FLR的触发条件
FLR主要用于解决设备内部功能模块级故障,典型场景包括:
触发场景 | 具体案例 |
---|---|
不可纠正的硬件错误 | 核心逻辑崩溃、缓存ECC不可纠正错误(如Uncorrectable Internal Error ) |
协议层致命错误 | 畸形TLP(Malformed TLP )、流控协议死锁(Flow Control Protocol Error ) |
软件栈重建需求 | 驱动异常需重置Function状态(如虚拟机热迁移前的资源清理) |
安全隔离要求 | 多租户场景下,确保前一用户数据不残留至新租户 |
💡 与传统复位的区别:
- 全局复位(Cold/Warm/Hot Reset):影响整个设备或链路,中断所有通信;
- FLR:精准靶向故障模块,最小化业务中断。
4.2 FLR的使用方法
步骤1:确认设备支持FLR
# 通过lspci检查设备能力(Capabilities寄存器bit28)
lspci -vvv -s <BDF> | grep "FLReset+"
# 输出示例: Capabilities: [60] Express (v2) FLReset+
步骤2:执行FLR复位流程
sequenceDiagramparticipant OS as 操作系统participant Dev as 目标设备OS->>Dev: 写Device Control Register (0x08) bit15=1Note right of Dev: 进入FLR状态(100ms内完成)Dev-->>Dev: 清空内部状态/敏感数据Dev-->>OS: 复位完成(状态寄存器更新)OS->>Dev: 重新配置Function(BAR/MSI-X等)
关键操作细节:
- 暂停访问目标Function
- 复位前需确保无待处理事务(轮询
Device Status Register
的Transactions Pending
位直至清零)。
- 复位前需确保无待处理事务(轮询
- 触发FLR
// 伪代码:置位FLR触发位 pci_write_word(bdf, 0x08, pci_read_word(bdf, 0x08) | 0x8000);
- 等待复位完成
- 至少等待 100ms(规范要求)。
- 重新初始化Function
- 配置BAR空间、MSI/MSI-X中断、DMA引擎等。
4.3 注意事项
- 复位超时处理
- 若100ms后无响应,需升级至热复位(Hot Reset)或冷复位(Cold Reset)。
- 驱动兼容性
- 驱动程序需保存关键上下文(如DMA映射),复位后重建I/O队列。
- 虚拟化环境适配
- 虚拟机监控器(Hypervisor)需拦截FLR请求,确保物理设备状态同步。
4.4 FLR的核心价值
维度 | 传统复位 | FLR |
---|---|---|
复位粒度 | 设备/链路级 | Function级🔍 |
业务影响 | 全功能中断 | 仅故障模块暂停 |
恢复速度 | 慢(≥1s) | 快(≤100ms)⚡ |
适用场景 | 全局灾难性故障 | 局部模块错误/安全隔离 |
在数据中心与高可用系统中,FLR是实现故障隔离与快速自愈的关键技术。结合AER(高级错误报告)日志自动触发FLR,可显著提升系统可靠性。
相关文章:

PCIe-Error Detection(一)
下表为PCIe协议中给出的错误: 一、可纠正错误(Correctable Errors,8种) 检错机制 错误名称检测层级触发条件Receiver ErrorPhysical接收端均衡器(EQ)监测到…...

向量空间的练习题目
1.考虑 中的向量x1 和x2 求每一向量的长度 令x3x1x2,求x3的长度,它的长度与x1和x2的和有什么关系? 2.重复练习1,取向量 3.令C为复数集合,定义C上的加法为 (abi)(cdi)(ac)(bd)i 并定义标量乘法为对所有实数a (abi) a bi 证明&…...

Leetcode 2123. 使矩阵中的 1 互不相邻的最小操作数
1.题目基本信息 1.1.题目描述 给你一个 下标从 0 开始 的矩阵 grid。每次操作,你可以把 grid 中的 一个 1 变成 0 。 如果一个矩阵中,没有 1 与其它的 1 四连通(也就是说所有 1 在上下左右四个方向上不能与其他 1 相邻)&#x…...

MySQL高可用集群
https://dev.mysql.com/doc/mysql-shell/8.4/en/mysql-innodb-cluster.html 1 什么是MySQL高可用集群 MySQL高可用集群:MySQL InnoDB ClusterInnoDB Cluster是MySQL官方实现高可用读写分离的架构方案,包含以下组件 MySQL Group Replication:简…...

day14 leetcode-hot100-27(链表6)
21. 合并两个有序链表 - 力扣(LeetCode) 1. 暴力法 思路 创建一个空节点,用来组装这两个链表,谁小谁就是下一个节点。 知识 创建空节点:ListNode n1 new ListNode(-1); 具体代码 /*** Definition for singly-l…...

YOLOv5 :训练自己的数据集
- **🍨 本文为[🔗365天深度学习训练营](https://mp.weixin.qq.com/s/rnFa-IeY93EpjVu0yzzjkw) 中的学习记录博客** - **🍖 原作者:[K同学啊](https://mtyjkh.blog.csdn.net/)** 我们接着上一篇文章配置完YOLOv5需要的环境后&#…...

flutter项目迁移空安全
重中之重 备份好项目文件,甚至连已经加载好的flutter库也可以备份。环境包升级 2.1 不要直接换成flutter:3.0以上的版本,这样做既有基本的库兼容问题,又有空安全下的语法问题(整个项目中需要增加 late、?、!的语法错误,一片报错的…...
vue element日期范围选择器只能选择指定天数内的
<el-date-pickerv-model"dateRange"type"daterange"range-separator"至"start-placeholder"开始日期"end-placeholder"结束日期"format"yyyy-MM-dd"value-format"yyyy-MM-dd"clearable:picker-optio…...
从 AMQP 到 RabbitMQ:核心组件设计与工作原理(二)
五、RabbitMQ 工作原理全揭秘 在深入了解了 RabbitMQ 的核心组件之后,接下来让我们深入探究 RabbitMQ 的工作原理,揭开其在消息生产、投递、消费以及可靠性保障等方面的神秘面纱。 5.1 消息生产与投递流程 建立连接与信道:生产者首先通过 …...

MySql(十二)
目录 MySql约束 1.添加主键约束 语法格式 1)创建一个带主键的表 查看表结构 2)创建表的时候指定主键名称 查看表结构 3)创建一个表然后,然后再使用alter为列添加主键 查看表结构 4)为表添加数据 1---正常数据 2---主键…...

51c视觉~3D~合集3
我自己的原文哦~ https://blog.51cto.com/whaosoft/13954440 #SceneTracker 在4D时空中追踪万物!国防科大提出首个长时场景流估计方法 本篇分享 TPAMI 2025 论文SceneTracker: Long-term Scene Flow Estimation Network,国防科大提出首…...
windows11安装编译QtMvvm
windows11安装编译QtMvvm 1 从github下载代码2 官方的Download/Installtion3 自行构建编译QtMvvm遇到的问题3.1 `qmake`问题执行命令报错原因分析qmake报错:找不到编译器 cl解决方案3.2 `make qmake_all`问题执行命令报错原因分析make命令未识别解决方案3.3 缺少`perl`问题执行…...

【2025年电工杯数学建模竞赛A题】光伏电站发电功率日前预测问题+完整思路+paper+源码
本人7年数学建模竞赛经验,历史获奖率百分之百。团队成员都是拿过全国一等奖的硕博,有需要数模竞赛帮助的可以私信我 本题主要涉及数据预测,数据分析,机器学习,时间序列等知识 1.问题背景与问题描述 2.解题思路分析 …...

OpenCv高阶(十九)——dlib关键点定位
文章目录 一、什么是人脸关键点定位?二、关键点模型的下载及关键信息的理解三、dlib关键点定位的简单实现(1)导入必要的库(2)从指定路径读取图像文件(3)创建dlib的正面人脸检测器对象࿰…...

BUUCTF之[ACTF2020 新生赛]BackupFile
打开环境就一句话 找出源文件! 结合题目名字:BackupFile 先用dirsearct扫描网站文件 发现一个index.php.bak ,拼接url下载 打开发现php代码 <?php include_once "flag.php";if(isset($_GET[key])) {$key $_GET[key];if(!is_numeric($key)) {exit…...

头歌之动手学人工智能-Pytorch 之autograd
目录 第1关:Variable 任务描述 编程要求 测试说明 没有伟大的愿望,就没有伟大的天才。——巴尔扎克开始你的任务吧,祝你成功! 第2关:Variable 属性 任务描述 编程要求 测试说明 真正的科学家应当是个幻想家&a…...
OIer常用的软件
前言 现在许多软件的官网多不好找,所以我今天就将常用的一些软件官网地址翻了出来,并简单介绍了他的用法。 正文 1.DEV-C DEV-C 用途:c编译软件,是OIer的生涯之路的必备软件 2.Katex KATex 用途:展现公式的软件&…...
Centos7.x内网环境Jenkins前端打包环境配置
Centos7.x内网环境Jenkins前端打包环境配置 参考地址: https://www.cnblogs.com/guangdelw/p/18763336 https://2048.csdn.net/682c1be8606a8318e857d687.html 前言:环境描述和目标 最近公司新接了一个项目,要求是:需要再桌面…...

Kafka集成Flume/Spark/Flink(大数据)/SpringBoot
Kafka集成Flume Flume生产者 ③、安装Flume,上传apache-flume的压缩包.tar.gz到Linux系统的software,并解压到/opt/module目录下,并修改其名称为flume Flume消费者 Kafka集成Spark 生产者 object SparkKafkaProducer{def main(args:Array[S…...

Scratch节日 | 拯救屈原 | 端午节
端午节快乐! 这款特别为端午节打造的Scratch游戏 《拯救屈原》,将带你走进古代中国,感受历史与文化的魅力! 🏮 游戏介绍 扮演勇敢的探险者,穿越时空回到古代,解锁谜题,完成任务&…...

rabbitmq Direct交换机简介
在实际开发中,需求可能变得复杂,如消息的收发和处理。以支付系统为例,成功支付后需要改变订单状态并通知用户,而失败则不需要。为处理这种情况,提出了使用Direct交换机,它可以根据规则将消息路由到指定队列…...

Git实战--基于已有分支克隆进行项目开发的完整流程
Git克隆项目开发流程 ✅ 一、完整流程概述✅ 二、详细操作步骤Step 1:克隆仓库(如果尚未克隆)Step 2:获取远程分支信息并切换到 feature/ 获取所有远程分支Step 3:创建并切换到你的新分支Step 4:开始开发新…...
MapReduce(期末速成版)
起初在B站看3分钟的速成视频,感觉很多细节没听懂。 具体例子解析(文件内容去重) 对于两个输入文件,即文件A 和文件B,请编写MapReduce 程序,对两个文件进行合并,并剔除 其中重复的内容,得到一个新的输出文件…...
鸿蒙OSUniApp 移动端直播流播放实战:打造符合鸿蒙设计风格的播放器#三方框架 #Uniapp
UniApp 移动端直播流播放实战:打造符合鸿蒙设计风格的播放器 在移动互联网时代,直播已经成为一种主流的内容形式。本文将详细介绍如何使用 UniApp 框架开发一个优雅的直播流播放器,并融入鸿蒙系统的设计理念,实现一个既美观又实用…...

C3、C2f、C3K2、C2PSA的具体结构
YOLOV5 C3 Bottleneck C2f...

2_MCU开发环境搭建-配置MDK兼容Keil4和C51
MCU开发环境搭建-配置MDK兼容Keil4和C51 一、概述 本文以MDK-ARM V5.36版本基础介绍DMK-ARM工程兼容Keil4和C51的配置。 注:在阅读本文前,请先安装和配置完成MDK-ARM(Keil5)。 二、工具包下载 链接: https://pan.baidu.com/s/1Tu2tDD6zRra4xb_PuA1Wsw 提取码: 81pp 三、…...

通过远程桌面连接Windows实例提示“出现身份验证错误,无法连接到本地安全机构”错误怎么办?
本文介绍通过远程桌面连接Windows实例提示“出现身份验证错误无法连接到本地安全机构”错误的解决方案。 问题现象 通过本地电脑内的远程桌面连接Windows实例提示“出现身份验证错误,无法连接到本地安全机构”错误。 问题原因 导致该问题的可能原因如下&#x…...

百度golang研发一面面经
输入一个网址,到显示界面,中间的过程是怎样的 IP 报文段的结构是什么 Innodb 的底层结构 知道几种设计模式 工厂模式 简单工厂模式:根据传入类型参数判断创建哪种类型对象工厂方法模式:由子类决定实例化哪个类抽象工厂模式&#…...

TC3xx学习笔记-启动过程详解(一)
文章目录 前言Firmware启动过程BMHD Check流程ABM启动Internal Flash启动Bootloader ModeProcessing in case no valid BMHD foundProcessing in case no Boot Mode configured by SSW 总结 前言 之前介绍过UCB BMHD的使用,它在启动过程中起着重要的作用࿰…...

Scratch节日 | 六一儿童节抓糖果
六一儿童节怎么能没有糖果?这款 六一儿童节抓糖果 小游戏,让你变身小猫,开启一场甜蜜大作战! 🎮 游戏玩法 帮助小猫收集所有丢失的糖果,收集越多分数越高! 小心虫子一样的“坏糖果”ÿ…...