分支记录缓冲扩展(BRBE)是ARMv8架构中用于追踪程序执行流程的硬件机制,其核心设计目标是为开发者提供低开销的分支执行历史记录。与传统的PC采样相比,BRBE能够捕获完整的控制流变化,包括直接/间接跳转、函数调用/返回等所有分支类型。
BRBEv1.1版本引入了几个关键特性:
每个分支记录由三个64位寄存器组成:
c复制struct brbe_record {
uint64_t SRC; // 源地址及相关标志
uint64_t TGT; // 目标地址
uint64_t INF; // 元信息(类型、EL级别、误预测等)
};
INF字段的详细构成:
UpdateBranchRecordBuffer是核心记录函数,其伪代码逻辑:
python复制def UpdateBranchRecordBuffer(ccu, cc, branch_type, el, mispredict, valid, src, tgt):
# 缓冲区移位(先进先出)
for i from N-1 downto 1:
Records_SRC[i] = Records_SRC[i-1]
Records_TGT[i] = Records_TGT[i-1]
Records_INF[i] = Records_INF[i-1]
# 写入新记录
Records_INF[0] = pack(ccu, cc, el, valid, mispredict, branch_type)
Records_SRC[0] = src
Records_TGT[0] = tgt
BRBEExceptionReturn处理异常返回时的特殊记录:
python复制def BRBEExceptionReturn(target, source_el, src_valid, src_addr):
# 检查各EL的ERTN使能位
case source_el:
EL3: if !FEAT_BRBEv1p1 or MDCR_EL3.E3BREC==MDCR_EL3.E3BREW: return
EL2: if BRBCR_EL2.ERTN=='0': return
EL1: if BRBCR_EL1.ERTN=='0': return
# 生成记录类型编码'000111'
if src_valid or BranchRecordAllowed(PSTATE.EL):
UpdateBranchRecordBuffer(..., branch_type='000111', ...)
BRBE提供多级过滤控制:
异常级别过滤:
分支类型过滤:
安全状态过滤:
AArch64_BreakpointMatch实现断点匹配的核心逻辑:
mermaid复制graph TD
A[检查链接使能] -->|是| B[返回不活跃]
A -->|否| C[检查使能状态]
C --> D[状态匹配检查]
D --> E[值匹配检查]
E --> F[组合匹配结果]
AArch64_StateMatch处理安全状态和权限级别检查:
AArch64_BreakpointValueMatch处理地址/上下文匹配:
调试异常触发涉及多个系统寄存器协同工作:
| 寄存器 | 功能描述 |
|---|---|
| MDCR_EL3 | 安全调试全局控制 |
| MDCR_EL2 | 虚拟化调试控制 |
| DBGBCR_EL1(n) | 断点控制寄存器(每个断点一个) |
| DBGBVR_EL1(n) | 断点值寄存器 |
异常触发条件检查流程:
EBEP(Extended Base Event Profiling)扩展引入PMU异常机制:
python复制def CheckForPMUException():
enabled, target_el = PMUExceptionEnabled()
if not enabled or PMUExceptionMasked(target_el, PSTATE.EL, PSTATE.PM):
return
if FEAT_SEBEP and PSTATE.PPEND:
TakeProfilingException(target_el, fsc='00000', synchronous=True)
else:
if CheckPMUOverflowCondition(PMUOverflowCondition_PMUException, ...):
TakeProfilingException(target_el, fsc='00000', synchronous=False)
关键控制位:
BranchEncCycleCount实现创新的周期计数编码:
math复制\text{cycles} =
\begin{cases}
M & \text{if } E=0 \\
(1 << (E-1)) \times (M + 256) & \text{otherwise}
\end{cases}
典型BRBE初始化序列:
assembly复制// 配置BRBCR_EL1
mov x0, #(1<<0) // E1BRE=1, 使能EL1分支记录
orr x0, x0, #(1<<3) // ERTN=1, 记录异常返回
msr BRBCR_EL1, x0
// 配置BRBFCR_EL1
mov x0, #0xFF // 使能所有分支类型过滤
msr BRBFCR_EL1, x0
// 清除缓冲区
msr BRB_IALL, xzr
无分支记录生成:
记录不完整:
异常触发失败:
选择性记录:
降低开销:
安全实践: