AUTOSAR进阶图解==>AUTOSAR_SWS_PDURouter - 实践

news/2025/9/19 19:06:34/文章来源:https://www.cnblogs.com/lxjshuju/p/19101520

AUTOSAR PDU Router详解文档

AUTOSAR通信架构中的核心路由模块

目录


1. 概述

PDU Router模块是AUTOSAR通信架构中的核心组件,负责在AUTOSAR软件组件之间路由I-PDU(Interaction Layer Protocol Data Units)。该模块提供了灵活的I-PDU转发机制,支持多种路由模式,包括单播、多播和网关功能。

1.1 PDU Router的作用

根据源文档描述,PDU Router模块主要提供以下功能:

1.2 核心特性

  • 静态配置:路由路径基于静态配置表,不支持动态路由
  • 通用接口:采用通用接口设计,支持任意上层和下层模块组合
  • 后构建支持:支持后构建可加载和可选择配置
  • 错误处理:提供完整的错误检测和报告机制

2. PDU Router模块架构

PDU Router模块在AUTOSAR通信架构中位于中间层,连接上层应用模块和下层通信接口模块。

在这里插入图片描述

图2-1:PDU Router模块在AUTOSAR通信架构中的位置和关系

2.1 架构层次

应用层

  • COM模块:通信管理模块,负责信号和I-PDU的转换
  • DCM模块:诊断通信管理模块,处理诊断请求和响应
  • IPduM模块:I-PDU复用器,支持I-PDU的动态复用
  • DLT模块:数据链路测试模块,提供通信测试功能

PDU Router模块

  • PDU Router引擎:核心路由引擎,执行I-PDU的路由决策和转发
  • 路由路径表:静态配置的路由规则表,定义I-PDU的路由路径
  • 缓冲区管理:管理I-PDU的缓冲存储,支持FIFO和Last-is-best策略

通信接口层

  • CAN接口(CanIf):CAN总线接口模块
  • FlexRay接口(FrIf):FlexRay总线接口模块
  • LIN接口(LinIf):LIN总线接口模块
  • 以太网接口(EthIf):以太网接口模块

传输协议层

  • CAN传输协议(CanTp):CAN总线传输协议模块
  • FlexRay传输协议(FrTp):FlexRay传输协议模块
  • LIN传输协议(LinTp):LIN传输协议模块
  • J1939传输协议(J1939Tp):J1939协议模块

2.2 接口关系

PDU Router模块通过以下接口与上下层模块交互:

2.3 代码示例

/* PDU Router模块初始化示例 */
Std_ReturnType PduR_Init(const PduR_PBConfigType* ConfigPtr)
{
Std_ReturnType result = E_OK;
/* 参数检查 */
if (ConfigPtr == NULL) {
DET_ReportError(PDUR_MODULE_ID, 0, PDUR_INIT_SID, PDUR_E_PARAM_POINTER);
return E_NOT_OK;
}
/* 初始化路由路径表 */
result = PduR_Internal_InitRoutingTable(ConfigPtr);
if (result != E_OK) {
return E_NOT_OK;
}
/* 初始化缓冲区管理器 */
result = PduR_Internal_InitBufferManager(ConfigPtr);
if (result != E_OK) {
return E_NOT_OK;
}
/* 设置模块状态为在线 */
PduR_Internal_SetModuleState(PDUR_ONLINE);
return E_OK;
}
/* 上层模块传输请求示例 */
Std_ReturnType PduR_ComTransmit(PduIdType TxPduId, const PduInfoType* PduInfoPtr)
{
Std_ReturnType result = E_OK;
PduR_RoutingPathType* routingPath;
/* 参数检查 */
if (PduInfoPtr == NULL) {
DET_ReportError(PDUR_MODULE_ID, 0, PDUR_COM_TRANSMIT_SID, PDUR_E_PARAM_POINTER);
return E_NOT_OK;
}
/* 查找路由路径 */
routingPath = PduR_Internal_GetRoutingPath(TxPduId);
if (routingPath == NULL) {
DET_ReportError(PDUR_MODULE_ID, 0, PDUR_COM_TRANSMIT_SID, PDUR_E_PDU_ID_INVALID);
return E_NOT_OK;
}
/* 执行路由转发 */
result = PduR_Internal_ForwardToDestinations(routingPath, PduInfoPtr);
return result;
}

3. PDU Router配置模型

PDU Router模块的配置采用层次化的数据结构,支持灵活的模块配置和路由规则定义。

图3-1:PDU Router配置模型的数据结构关系

3.1 主要配置类

PduR_PBConfigType

PduRGeneralType

3.2 路由配置类

PduRRoutingPathType

  • 功能:定义单个I-PDU的路由规则
  • 关键属性
    • PduRRoutingPathId:路由路径唯一标识符
    • PduRSrcPduRef:源PDU引用
    • PduRDestPduRefs[]:目标PDU引用数组
    • PduRDestTxBufferRef:目标传输缓冲区引用
    • PduRTpThreshold:传输协议阈值
    • PduRMaxPduLength:最大PDU长度
    • PduRBufferAllocation:缓冲区分配策略

PduRRoutingPathGroupType

  • 功能:路由路径组配置,用于批量管理路由路径
  • 关键属性
    • PduRRoutingPathGroupId:路由路径组标识符
    • PduRRoutingPathGroupRefs[]:路由路径引用数组
    • PduRGroupEnableAtInit:初始化时启用标志

3.3 缓冲区配置类

PduRTxBufferType

  • 功能:传输缓冲区配置,用于存储待传输的I-PDU
  • 关键属性
    • PduRTxBufferId:缓冲区唯一标识符
    • PduRTxBufferSize:缓冲区大小
    • PduRTxBufferRef:缓冲区内存引用
    • PduRTxBufferAllocation:缓冲区分配方式

3.4 代码示例

/* PDU Router配置结构定义 */
typedef struct {
PduRBswModuleType* PduRBswModules;
PduRGeneralType PduRGeneral;
PduRRoutingPathGroupType* PduRRoutingPathGroups;
PduRRoutingPathType* PduRRoutingPaths;
PduRSrcPduType* PduRSrcPdus;
PduRDestPduType* PduRDestPdus;
PduRTxBufferType* PduRTxBuffers;
PduRDefaultValueType* PduRDefaultValues;
} PduR_PBConfigType;
/* 路由路径配置结构 */
typedef struct {
uint16 PduRRoutingPathId;
PduRSrcPduType* PduRSrcPduRef;
PduRDestPduType** PduRDestPduRefs;
PduRTxBufferType* PduRDestTxBufferRef;
uint16 PduRTpThreshold;
uint16 PduRMaxPduLength;
PduR_BufferAllocationType PduRBufferAllocation;
} PduRRoutingPathType;
/* 配置初始化示例 */
void PduR_InitializeConfiguration(PduR_PBConfigType* config)
{
/* 初始化通用配置 */
config->PduRGeneral.PduRDevErrorDetect = TRUE;
config->PduRGeneral.PduRVersionInfoApi = TRUE;
config->PduRGeneral.PduRMaxRoutingPathCnt = 100;
config->PduRGeneral.PduRMaxTxBufferCnt = 50;
config->PduRGeneral.PduRMaxRoutingPathGroupCnt = 10;
/* 初始化路由路径 */
for (int i = 0; i < config->PduRGeneral.PduRMaxRoutingPathCnt; i++) {config->PduRRoutingPaths[i].PduRRoutingPathId = i;config->PduRRoutingPaths[i].PduRTpThreshold = 0;config->PduRRoutingPaths[i].PduRMaxPduLength = 4095;config->PduRRoutingPaths[i].PduRBufferAllocation = PDUR_BUFFER_ALLOCATION_DEDICATED;}/* 初始化传输缓冲区 */for (int i = 0; i < config->PduRGeneral.PduRMaxTxBufferCnt; i++) {config->PduRTxBuffers[i].PduRTxBufferId = i;config->PduRTxBuffers[i].PduRTxBufferSize = 4095;config->PduRTxBuffers[i].PduRTxBufferAllocation = PDUR_BUFFER_ALLOCATION_STATIC;}}

4. PDU Router路由流程

PDU Router模块支持多种路由场景,包括上层模块发送、通信接口网关和传输协议网关等。

在这里插入图片描述

图4-1:PDU Router模块的路由流程和交互序列

4.1 上层模块发送I-PDU流程

场景描述:COM模块向多个目标模块发送I-PDU,实现1:n路由

参与者

流程步骤

  1. 传输请求:COM模块调用PduR_ComTransmit发起传输请求
  2. 路由查询:PDU Router引擎查询路由路径表,获取目标模块列表
  3. 数据提供方式判断
    • 直接数据提供:立即调用目标模块的传输接口
    • 触发传输数据提供:先存储数据,等待目标模块请求

4.2 通信接口网关流程

场景描述:CAN接口接收I-PDU并转发到FlexRay接口,实现网关功能

参与者

  • CAN接口:源通信接口,接收I-PDU
  • PDU Router引擎:执行网关转发逻辑
  • FlexRay接口:目标通信接口,发送I-PDU

流程步骤

  1. 接收指示:CAN接口调用PduR_CanIfRxIndication通知PDU Router
  2. 目标查询:PDU Router引擎查询路由路径,确定目标模块
  3. 转发处理
    • 直接转发:立即调用目标接口的传输函数
    • FIFO缓冲:存储到FIFO队列,等待目标模块请求

4.3 传输协议网关流程

场景描述:CAN传输协议接收多帧数据并转发到FlexRay传输协议

参与者

  • CAN传输协议:源传输协议模块
  • PDU Router引擎:管理TP网关逻辑
  • FlexRay传输协议:目标传输协议模块

流程步骤

  1. 开始接收:CAN传输协议调用PduR_CanTpStartOfReception开始接收
  2. 路由查询:PDU Router引擎查询路由路径,确定目标TP模块
  3. 网关模式选择
    • 直接网关:等待完整接收后开始传输
    • 网关on-the-fly:达到阈值后开始传输

4.4 代码示例

/* 上层模块传输处理示例 */
Std_ReturnType PduR_Internal_ForwardToDestinations(PduR_RoutingPathType* routingPath,
const PduInfoType* pduInfo)
{
Std_ReturnType result = E_OK;
uint8 destCount = 0;
PduRDestPduType* destPdu;
/* 遍历所有目标PDU */
while ((destPdu = routingPath->PduRDestPduRefs[destCount]) != NULL) {
/* 根据数据提供方式处理 */
if (destPdu->PduRDestPduDataProvision == PDUR_DIRECT) {
/* 直接数据提供 */
result = PduR_Internal_TransmitDirect(destPdu, pduInfo);
} else {
/* 触发传输数据提供 */
result = PduR_Internal_StoreForTriggerTransmit(destPdu, pduInfo);
}
if (result != E_OK) {
/* 处理传输失败 */
DET_ReportError(PDUR_MODULE_ID, 0, PDUR_FORWARD_SID, PDUR_E_TRANSMIT_FAILED);
}
destCount++;
}
return result;
}
/* 通信接口接收处理示例 */
void PduR_CanIfRxIndication(PduIdType RxPduId, const PduInfoType* PduInfoPtr)
{
PduR_RoutingPathType* routingPath;
Std_ReturnType result = E_OK;
/* 查找路由路径 */
routingPath = PduR_Internal_GetRoutingPath(RxPduId);
if (routingPath == NULL) {
/* 无路由路径,丢弃I-PDU */
return;
}
/* 执行网关转发 */
result = PduR_Internal_GatewayForward(routingPath, PduInfoPtr);
if (result != E_OK) {
/* 处理网关失败 */
DET_ReportError(PDUR_MODULE_ID, 0, PDUR_GATEWAY_SID, PDUR_E_GATEWAY_FAILED);
}
}
/* 传输协议网关处理示例 */
BufReq_ReturnType PduR_CanTpStartOfReception(PduIdType RxPduId,
PduLengthType TpSduLength,
PduLengthType* RxBufferSizePtr)
{
PduR_RoutingPathType* routingPath;
BufReq_ReturnType result = BUFREQ_OK;
/* 查找路由路径 */
routingPath = PduR_Internal_GetRoutingPath(RxPduId);
if (routingPath == NULL) {
return BUFREQ_E_NOT_OK;
}
/* 分配缓冲区 */
result = PduR_Internal_AllocateBuffer(routingPath, TpSduLength, RxBufferSizePtr);
if (result == BUFREQ_OK) {
/* 开始目标TP传输 */
PduR_Internal_StartDestinationTpTransmit(routingPath, TpSduLength);
}
return result;
}

5. PDU Router状态机

PDU Router模块采用状态机设计,管理模块的生命周期和运行状态。

在这里插入图片描述

图5-1:PDU Router模块的状态转换和生命周期管理

5.1 主要状态

未初始化状态(Uninitialized)

在线运行状态(Online)

5.2 子状态

空闲状态(Idle)

  • 含义:等待处理请求的状态
  • 特征
    • 等待I-PDU传输请求
    • 等待接收指示
    • 等待管理API调用

路由处理状态(Routing)

  • 含义:处理I-PDU路由转发
  • 特征
    • 支持1:1, 1:n, n:1路由
    • 直接数据提供和触发传输
    • 多播支持
    • 传输确认处理

网关处理状态(Gateway)

  • 含义:处理通信接口间网关
  • 特征
    • 通信接口间网关
    • FIFO缓冲支持
    • 直接转发和缓冲转发
    • 错误处理

TP网关处理状态(TPGateway)

  • 含义:处理传输协议间网关
  • 特征
    • 传输协议间网关
    • 支持直接网关和on-the-fly
    • 缓冲区动态分配
    • 阈值控制传输

5.3 状态转换

初始化转换

  • UninitializedOnline:初始化完成
  • OnlineOffline:系统关闭或错误
  • OfflineUninitialized:重新初始化

运行状态转换

  • IdleRouting:收到传输请求
  • IdleGateway:收到接收指示
  • IdleTPGateway:收到TP接收指示
  • IdleManagement:收到管理API调用

5.4 代码示例

/* PDU Router状态机实现 */
typedef enum {
PDUR_STATE_UNINITIALIZED,
PDUR_STATE_ONLINE,
PDUR_STATE_OFFLINE
} PduR_ModuleStateType;
typedef enum {
PDUR_SUBSTATE_IDLE,
PDUR_SUBSTATE_ROUTING,
PDUR_SUBSTATE_GATEWAY,
PDUR_SUBSTATE_TP_GATEWAY,
PDUR_SUBSTATE_MANAGEMENT
} PduR_SubStateType;
/* 状态机处理函数 */
void PduR_MainFunction(void)
{
PduR_ModuleStateType currentState;
PduR_SubStateType currentSubState;
/* 获取当前状态 */
currentState = PduR_Internal_GetModuleState();
currentSubState = PduR_Internal_GetSubState();
switch (currentState) {
case PDUR_STATE_UNINITIALIZED:
/* 未初始化状态,等待初始化 */
break;
case PDUR_STATE_ONLINE:
/* 在线状态,处理子状态 */
PduR_Internal_ProcessSubState(currentSubState);
break;
case PDUR_STATE_OFFLINE:
/* 离线状态,等待重新初始化 */
break;
default:
/* 错误状态处理 */
DET_ReportError(PDUR_MODULE_ID, 0, PDUR_MAINFUNCTION_SID, PDUR_E_INVALID_STATE);
break;
}
}
/* 子状态处理函数 */
void PduR_Internal_ProcessSubState(PduR_SubStateType subState)
{
switch (subState) {
case PDUR_SUBSTATE_IDLE:
/* 空闲状态,检查是否有待处理请求 */
if (PduR_Internal_HasTransmitRequest()) {
PduR_Internal_SetSubState(PDUR_SUBSTATE_ROUTING);
} else if (PduR_Internal_HasRxIndication()) {
PduR_Internal_SetSubState(PDUR_SUBSTATE_GATEWAY);
} else if (PduR_Internal_HasTpRxIndication()) {
PduR_Internal_SetSubState(PDUR_SUBSTATE_TP_GATEWAY);
}
break;
case PDUR_SUBSTATE_ROUTING:
/* 路由处理状态 */
PduR_Internal_ProcessRouting();
PduR_Internal_SetSubState(PDUR_SUBSTATE_IDLE);
break;
case PDUR_SUBSTATE_GATEWAY:
/* 网关处理状态 */
PduR_Internal_ProcessGateway();
PduR_Internal_SetSubState(PDUR_SUBSTATE_IDLE);
break;
case PDUR_SUBSTATE_TP_GATEWAY:
/* TP网关处理状态 */
PduR_Internal_ProcessTpGateway();
PduR_Internal_SetSubState(PDUR_SUBSTATE_IDLE);
break;
case PDUR_SUBSTATE_MANAGEMENT:
/* 管理操作状态 */
PduR_Internal_ProcessManagement();
PduR_Internal_SetSubState(PDUR_SUBSTATE_IDLE);
break;
default:
/* 错误子状态处理 */
DET_ReportError(PDUR_MODULE_ID, 0, PDUR_PROCESS_SUBSTATE_SID, PDUR_E_INVALID_SUBSTATE);
PduR_Internal_SetSubState(PDUR_SUBSTATE_IDLE);
break;
}
}
/* 状态转换函数 */
void PduR_Internal_SetModuleState(PduR_ModuleStateType newState)
{
PduR_ModuleStateType oldState = PduR_Internal_GetModuleState();
/* 状态转换验证 */
if (PduR_Internal_IsValidStateTransition(oldState, newState)) {
PduR_Internal_ModuleState = newState;
/* 状态转换后的处理 */
switch (newState) {
case PDUR_STATE_ONLINE:
/* 进入在线状态,初始化子状态 */
PduR_Internal_SetSubState(PDUR_SUBSTATE_IDLE);
break;
case PDUR_STATE_OFFLINE:
/* 进入离线状态,清理资源 */
PduR_Internal_CleanupResources();
break;
default:
break;
}
} else {
/* 无效状态转换 */
DET_ReportError(PDUR_MODULE_ID, 0, PDUR_SET_STATE_SID, PDUR_E_INVALID_STATE_TRANSITION);
}
}

6. 总结

PDU Router模块作为AUTOSAR通信架构的核心组件,提供了灵活、高效的I-PDU路由服务。通过静态配置的路由表和状态机设计,该模块能够满足各种复杂的通信需求。

6.1 主要优势

6.2 应用场景

  • 车载网络网关:实现不同总线系统间的数据转发
  • 诊断通信:支持诊断数据的路由和转发
  • 信号路由:实现应用层信号到通信接口的路由
  • 多播通信:支持一对多的数据广播

6.3 技术特点

PDU Router模块的设计充分体现了AUTOSAR架构的模块化和标准化特点,为汽车电子系统的通信提供了可靠的基础设施。

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

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

相关文章

getDefaultMidwayLoggerConfig报错;解决方法。

getDefaultMidwayLoggerConfig报错;解决方法。 解决方案:配置环境变量:MIDWAY_LOGGER_WRITEABLE_DIR源码是:getDefaultMidwayLoggerConfig(appInfo) { var _a; const isDevelopment = (0, util_1.isDevelopmentEn…

js获取浏览器语言,以及调用谷歌翻译api翻译成相应的内容

翻译接口:https://translate.googleapis.com/translate_a/single?client=gtx&sl=(翻译前的语言)&tl=(翻译后的语言)&dt=t&q=(需要翻译的内容)调用案例: https://translate.googleapis.com/tr…

总结RocketMQ中的常见问题

总结RocketMQ中的常见问题 一、MQ 如何保证消息不丢失 1. 丢消息的关键环节跨网络环节:消息链路中1(生产者→Broker)、2(Broker 主→从)、4(Broker→消费者) 三个场景,因网络不稳定性可能导致请求丢失。 本地缓…

The 2025 ICPC Asia EC Regionals Online Contest (II)

疑似第一场没题解?那先写第二场了。 大家打得很棒,状态起来了!继续保持。 B. Rectangular Wooden Block给定 \(L\times W\times H\) 的长方体,每个 \(1\times 1\times 1\) 的小立方体有价值 \(V(i,j,k)\),选择其中…

Python实现Elman RNN与混合RNN神经网络对航空客运量、啤酒产量、电力产量时间序列数据预测可视化对比

全文链接:https://tecdat.cn/?p=43924原文出处:拓端数据部落公众号视频出处:拓端抖音号@拓端tecdat一、引言 作为长期深耕时间序列预测领域的数据科学家,我们在项目中频繁发现一个共性痛点:多数团队在选择循环神…

4G/Wi-Fi/以太网三网合一,智能融合通信实战案例集

聚焦通信技术落地痛点,4G/Wi-Fi/以太网智能多网融合方案,通过动态负载均衡与故障自愈机制,构建高可用通信链路。实战场景覆盖远程监控、智能交通等领域,技术细节与实施步骤全解析。 本文以Air8000开发板WebSocket应…

关于介绍自己的第一篇随笔

你好啊,我是张家瑞,一名普通平凡的学生。 仔细想来我的兴趣爱好也没什么特别的,也同他人一样爱打打游戏听听音乐,非常喜欢格斗游戏和卡牌游戏,若有喜欢街霸,罪恶装备,游戏王的同学可以找我打(开个玩笑),稍微…

深入解析:N32G43x Flash 驱动移植与封装实践

深入解析:N32G43x Flash 驱动移植与封装实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", &qu…

Backblaze上如何传大文件

问题 创建好一个存储桶后,直接点击上传文件即可。但是当文件很大时将会显示:第一次通过以下步骤解决 第一步:准备工作 1.安装命令行工具 (B2 CLI) pip install --upgrade b2检验安装是否成功(可选) b2 version显示:…

解题报告-老逗找基友 (friends)

老逗找基友 (friends) 题目背景 吴老逗有 \(n\) 个基友,位于平面直角坐标系的整点上。每个基友已与其最近的基友(如有多个则取编号最小)建立了双向心灵感应。但这样形成的网络可能不连通,因此吴老逗可以使用爱之魔…

Python_occ 学习记录 | 细观建模(1) - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

深入解析:uv:用 Rust 重写的极速 Python 包管理器

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Caused by: java.lang.ClassNotFoundException: org.apache.rocketmq.remoting.common.RemotingUtil

前言 启动报错,打包可以,启动报错; 针对这个问题 可以看下.ClassNotFoundException和NoClassDefFoundError:有啥区别先 org.springframework.beans.factory.BeanCreationException: Error creating bean with name …

VAE In JAX【个人记录向】

和上一篇 SAC In JAX 一样,我们用 JAX 实现 VAE,配置一样,只需要安装符合版本的 torchvision 即可,实现中提供了 tensorboard 记录以及最后的可视化展示,测试集即为最经典的 MNIST,代码如下: import jax import…

BLE蓝牙配网双模式实操:STA+SoftAP技术原理与避坑指南

想让设备同时支持蓝牙快速配网与AP热点备份?STA+SoftAP双模式是关键!本文深度解析技术原理,结合真实项目案例总结实操避坑点,助你一文搞懂双模式配网逻辑,开发少走90%弯路。 本文特别分享蓝牙配网方案: 以Air800…

【小白也能懂】PyTorch 里的 0.5 到底是干啥的?——一次把 Normalize 讲透! - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

第58天:RCE代码amp;命令执行amp;过滤绕过amp;异或无字符amp;无回显方案amp;黑白盒挖掘

第58天:RCE代码&命令执行&过滤绕过&异或无字符&无回显方案&黑白盒挖掘 案例演示RCE & 代码执行 & 命令执行 RCE-利用&绕过&异或&回显 白盒-CTF-RCE代码命令执行 黑盒-运行-R…

057-Web攻防-SSRFDemo源码Gopher项目等

057-Web攻防-SSRF&Demo源码&Gopher项目等 知识点知识点: 1、SSRF-原理-外部资源加载 2、SSRF-利用-伪协议&无回显 3、SSRF-挖掘-业务功能&URL参数案例演示1、SSRF-原理&挖掘&利用&修复 2…

060-WEB攻防-PHP反序列化POP链构造魔术方法流程漏洞触发条件属性修改

060-WEB攻防-PHP反序列化&POP链构造&魔术方法流程&漏洞触发条件&属性修改 知识点: 1、PHP-反序列化-应用&识别&函数 2、PHP-反序列化-魔术方法&触发规则 3、PHP-反序列化-联合漏洞&P…