我的桌面是带有 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 性能计数器读数的模块源代码可以用作参考?
提前谢谢你的帮助。