.event_init = perf_tp_event_init, .add = perf_trace_add, .del = perf_trace_del, .start = perf_swevent_start, .stop = perf_swevent_stop, .read = perf_swevent_read, }; 与硬件相关的PMU具有与arch-spec有关的抽象结构,例如'struct x86_pmu'。与硬件相关的结构将读取/写入性能监视器MSR。
从上面代码可以看出, cpu_clock_perf_event_enable 函数实际上调用了 perf_swevent_start_hrtimer 函数来进行初始化工作。我们再来看看 perf_swevent_start_hrtimer 函数的实现: staticvoid perf_swevent_start_hrtimer(struct perf_event *event) { structhw_perf_event*hwc= &event->hw; // 1. 初始化一个定...
{structperf_event_attr attr;intrc;//printf("perf open %lx [%d]\n", off, (int) off);memset(&attr,0,sizeof(attr)); attr.type=PERF_TYPE_SOFTWARE; attr.size=sizeof(attr); attr.config=off; attr.mmap=1; attr.comm=1; attr.exclude_kernel=1; rc= syscall(SYS_perf_event_open, &att...
perf_swevent_start_hrtimer(event); return0; } 从上面代码可以看出,cpu_clock_perf_event_enable()函数实际上调用了perf_swevent_start_hrtimer()函数来进行初始化工作。我们再来看看perf_swevent_start_hrtimer()函数的实现: staticvoid perf_swevent_start_hrtimer(structperf_event*event) { structhw_perf_ev...
Linux kernel 3.8.9之前的版本中的kernel/events/core.c中的‘perf_swevent_init’函数中存在漏洞,该漏洞源于程序使用不正确的整数数据类型。本地攻击者可通过特制的perf_event_open系统调用利用该漏洞获得权限。 目前厂商已经发布了升级补丁以修复此安全问题,补丁获取链接: ...
struct perf_event_attr attr; // 事件的属性(由用户提供) struct hw_perf_event hw; struct perf_event_context *ctx; // 事件所属的上下文 ... }; 我们现在只需关注其中的两个成员变量:count和ctx。 count:表示事件被触发的次数。 ctx:表示当前事件所属的上下文。
.read=perf_swevent_read, }; 与硬件相关的PMU具有与arch-spec有关的抽象结构,例如'struct x86_pmu'。与硬件相关的结构将读取/写入性能监视器MSR。 每个PMU都通过调用“ perf_pmu_register”进行注册。 性能事件上下文 性能可以监视cpu相关事件和任务相关事件。他们两个都可以有几个受监视的事件。因此,我们需要一...
初始化一个定时器,定时器的回调函数为:perf_swevent_hrtimer()。 启动定时器。 这个定时器结构保存在 perf_event 结构的 hwc 成员中,我们在以后的文章中将会介绍 Linux 高精度定时器的实现。 当定时器被触发时,内核将会调用 perf_swevent_hrtimer() 函数来处理事件。我们再来分析一下 perf_swevent_hrtimer() ...
例如,对于CPU时钟事件,当定时器被触发时,会调用perf_swevent_hrtimer函数: c static enum hrtimer_restart perf_swevent_hrtimer(struct hrtimer *hrtimer) { ... event->pmu->read(event); ... } 然后,perf_event_overflow函数会被调用来进行数据采样和收集: c int perf_event_overflow(struct perf...
为了实现不同事件的差异化管理,内核定义了 pmu 结构。对于 CPU 时钟事件,其 pmu 成员指向 perf_ops_cpu_clock 变量。通过这个结构,内核能够针对不同事件进行启用和禁用操作。启用 CPU 时钟事件时,内核调用 cpu_clock_perf_event_enable() 函数,它通过 perf_swevent_start_hrtimer() 函数初始化...