我正在测试一个内核模块,它在每个内核上创建性能事件并计算L2D_CACHE_REFILL的总数。
System details: NVIDIA Jetson nano, OS: Ubuntu 18.04.6 LTS, Kernel: 4.9.255, L4T: 32.7.3, Jetpack: 4.6.3
当我尝试使用
insmod
命令插入此模块时,我在内核日志文件中收到警告消息。 dmesg
命令截图如下:此警告指出,在第 1 行。 199,函数
armpmu_start()
正在抛出警告。
我尝试检查内核源代码。来自
armpmu_start
文件的 drivers/perf/arm_pmu
函数的内核代码片段如下:
此外,当我尝试使用
rmmod
命令删除模块时,我的 jetson nano 板正在重新启动。
以下是内核模块使用的几个 perf API:
struct perf_event_attr sched_perf_hw_attr = { .type = PERF_TYPE_RAW, .config = 0x17, .size = sizeof (struct perf_event_attr), .pinned = 1, .disabled = 1, .exclude_kernel = 1, .sample_period = budget };
使用
event_overflow_callback
函数创建性能事件
event = perf_event_create_kernel_counter (&sched_perf_hw_attr, 中央处理器, 无效的, 事件溢出回调, 无效的 );
启动计数器的代码
perf_event_enable (event); event->pmu->add (event, PERF_EF_START);
事件->pmu->停止(事件,PERF_EF_UPDATE);
事件->pmu->del(事件,0);
event_overflow_callback
功能中执行以下活动。停止柜台
事件->pmu->停止(事件,PERF_EF_UPDATE);
启用性能计数器
event->pmu->start(事件,PERF_EF_RELOAD);
最后的陈述是否引起了问题?我尝试在
PERF_EF_UPDATE/ PF_EF_START
函数中将参数设置为start()
。但仍然收到相同的警告。
非常感谢您在诊断问题方面的任何帮助。 我是 Linux 内核模块的新手。请推荐一种在 Nvidia jetson 板等嵌入式设备上调试 Linux 内核模块的方法。这将帮助我获得知识。