register_wide_hw_breakpoint实现分析
以下是对register_wide_hw_breakpoint内核函数的详细分析:
1. 功能说明
该函数用于在全CPU核心上注册硬件断点,属于Linux内核的调试基础设施。核心功能:
为每个在线CPU创建硬件断点(通过perf_event子系统)
返回一组per-CPU的perf_event指针(用于后续管理)
2. 关键代码逻辑
(1) 内存分配
cpu_events = alloc_percpu(typeof(*cpu_events));
使用alloc_percpu分配per-CPU内存,每个CPU核心会有独立副本
失败时返回ENOMEM错误(强制类型转换为ERR_PTR)
(2) 断点注册循环
for_each_online_cpu(cpu) {
bp = perf_event_create_kernel_counter(attr, cpu, NULL, triggered, context);
per_cpu(*cpu_events, cpu) = bp;
}
for_each_online_cpu:遍历所有在线CPU
perf_event_create_kernel_counter:核心操作,实际创建硬件断点
attr:指定断点属性(地址、类型等)
triggered:断点触发时的回调函数
结果存储到per-CPU变量中
(3) 错误处理
if (IS_ERR(bp)) {
err = PTR_ERR(bp);
break; // 任一CPU失败则终止
}
...
if (likely(!err)) return cpu_events;
使用IS_ERR/PTR_ERR处理内核错误码
likely()优化分支预测,假设成功是常见路径
失败时调用unregister_wide_hw_breakpoint清理已注册断点
3. 技术亮点
CPU热插拔安全
get_online_cpus()/put_online_cpus():防止操作期间CPU状态变化
硬件断点管理
通过perf_event子系统抽象不同架构的硬件断点(x86/ARM等)
内存模型
__percpu标注显式声明per-CPU内存语义
使用per_cpu()宏安全访问per-CPU变量