【发布时间】:2020-07-08 19:57:00
【问题描述】:
我的桌面是带有 Ubuntu 操作系统的 Intel x86_64 处理器。
我知道有 perf 工具可以获取程序的统计信息列表。 但我想做的是直接读取性能计数器而不使用 perf 工具。
- 第一个问题
第一个问题是我从 Github 下载了这段代码:Github Code Reference。
它使用 linux-headers-5.3.0-40-generic 内核成功编译,没有任何错误。一旦我使用“insmod”.ko 文件,系统就会挂起。检查 dmesg 时未插入 .ko 文件,因此在对 .ko 文件执行“insmod”后必须停止它。发生这种情况是因为我尝试了未经授权的访问吗?如果有我可以尝试的建议,我很高兴听到。
对应的代码如下。
static void set_pce(void *arg)
{
int to_val = (arg != 0);
u_int64_t cr4_val;
cr4_val = __read_cr4();
if (to_val) {
cr4_val |= X86_CR4_PCE;
} else {
cr4_val &= ~X86_CR4_PCE;
}
__write_cr4(cr4_val);
}
static int __init user_rdpmc_init(void){
int cpu;
num_cpus = num_online_cpus();
printk(KERN_INFO "Enabling RDPMC from ring 3 for %d CPUs\n", num_cpus);
for (cpu = 0; cpu < num_cpus; cpu++) {
smp_call_function_single(cpu, set_pce, (void *) 1, 1);
}
return 0;
}
- 第二个问题
第二个问题是我在我的 Ubuntu 桌面上使用 linux-headers-5.3.0-40-generic 内核版本。我从 kernel.org 下载了内核代码版本 5.5.3。我彻底遵循了 5.5.3 内核代码中给出的 perf 代码,发现 linux-5.5.3/arch/x86/events/intel 目录下的 core.c 文件实际上是在设置和读取性能计数器。我使用 core.c 文件内容将其作为模块来读取性能计数器。当我编译它时,它会产生一堆错误,因为我使用 linux-headers-5.3.0-40-generic 来构建模块,但是我的 ubuntu 内核没有从内核代码链接到 core.c 文件的所有头文件来自 kernel.org。
如何让我的 Ubuntu 内核使用从 kernel.org 链接到 core.c 的所有文件并构建 .ko 文件?
或者是否有任何具有 x86 性能计数器读数的模块源代码可以用作参考?
提前感谢您的帮助。
【问题讨论】:
-
使用
perf工具为你做这件事。 -
要从您的程序中获取 perfcounter 读数,它可以使用 perf_event_open syscall(perf 也使用它)或一些内核模块 export msr access to root like msr.ko。您可以重用 PAPI library 访问计数器或 github.com/RRZE-HPC/likwid 或
modprobe msr+ github.com/opcm/pcm 或 + 一些 bash 与wrmsr/rdmsr就像在 agenda.cnaf.infn.it/getFile.py/… 中一样 -
请解释一下,为什么你“试图做的是不使用 perf 工具直接读取性能计数器。”,你的任务是什么?
标签: linux-kernel x86-64 kernel-module perf intel-pmu