欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

[转载] hw_breakpiont实现机制研究

最编程 2024-05-05 21:21:02
...
使用参考内核sample data_breakpiont.c 1、通常我们是用hw_breakpoint的注册函数register_wide_hw_breakpoint来注册硬件断点 register_wide_hw_breakpoint: 申请一个percpu变量,为每个cpu注册一个perf event事件 cpu_events = alloc_percpu(typeof(*cpu_events)); ... for_each_online_cpu(cpu) { 这个triggered就是断点的响应函数 bp = perf_event_create_kernel_counter(attr, cpu, NULL, triggered); } perf_event_create_kernel_counter: perf_event_alloc: 申请一个struct perf_event *event;变量的空间,然后做初始化的工作,然后 event->overflow_handler = overflow_handler; 就是把triggered函数作为这个事件cpu的pmu计数器溢出发生异常时的处理函数 perf_install_in_context: 然后将perf event事件与perf_event_context相互关联,作用????????????????? 这样,就把一个硬件中断的响应钩子挂好了。 2、断点被访问到后,最终调用过来的还是通过在 start_kernel->perf_event_init->init_hw_breakpoint中注册的register_die_notifier(&hw_breakpoint_exceptions_nb); static struct notifier_block hw_breakpoint_exceptions_nb = { .notifier_call = hw_breakpoint_exceptions_notify, /* we need to be notified first */ .priority = 0x7fffffff }; hw_breakpoint_exceptions_notify->hw_breakpoint_handler 然后按个遍历所有的pmu,看看是哪个出发了这个异常 然后进行处理 perf_bp_event(bp, args->regs); perf_swevent_event(bp, 1, 1, &sample, regs); perf_swevent_overflow(event, 0, nmi, data, regs); __perf_event_overflow(event, nmi, throttle, data, regs) ok,已经够深入了,到了处理的地方了: if (event->overflow_handler) event->overflow_handler(event, nmi, data, regs); 可以看到,这个其实就是前面注册的钩子函数了。 3、pmu初始化,以及出发中断的原理,???????????????????????????????? 初始化函数:init_hw_perf_events 核心结构:x86_pmu

地址:https://wenku.baidu.com/view/63f85fefdaef5ef7ba0d3c82.html?from_page=view&from_mod=download

推荐阅读