我的桌面电脑装有Ubuntu操作系统和Intel x86_64处理器。
我知道有perf工具可以获取程序的统计数据列表,但是我的目的是直接读取性能计数器而不使用perf工具。
- 第一个问题
我的第一个问题是我从Github下载了这段代码:Github Code Reference。
它在linux-headers-5.3.0-40-generic内核下编译成功,并且没有任何错误。但是当我使用“insmod”命令加载.ko文件时,系统会挂起。当我检查dmesg时,发现.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内核没有将所有头文件链接到来自kernel.org内核代码中的core.c文件。
如何使我的Ubuntu内核使用与来自kernel.org的core.c相关联的所有文件并构建.ko文件?
或者是否有x86性能计数器读取的模块源代码可以供我参考?
提前感谢您的帮助。
perf
工具可以为您完成此操作。 - 0andriy+ https://github.com/opcm/pcm或+一些bash与
wrmsr/
rdmsr`,就像在https://agenda.cnaf.infn.it/getFile.py/access?resId=13&materialId=slides&confId=466中所示。 - osgx