【发布时间】:2019-08-04 23:22:16
【问题描述】:
我正在尝试创建一种机制来读取进程的性能计数器。我希望从内核(4.19.2 版)本身内部执行此机制。
我可以从用户空间通过sys_perf_event_open() 系统调用来执行此操作,如下所示。
syscall (__NR_perf_event_open, hw_event, pid, cpu, group_fd, flags);
我想从内核空间调用这个调用。我从这里得到了一些基本的想法How do I use a Linux System call from a Linux Kernel Module
以下是我为实现这一目标而采取的步骤:
为了确保内核的虚拟地址保持有效,我使用了
set_fs()、get_fs()和get_fd()。由于
sys_perf_event_open()在/include/linux/syscalls.h 中定义,我已将其包含在代码中。
最终,调用系统调用的代码如下所示:
mm_segment_t fs;
fs = get_fs();
set_fs(get_ds());
long ret = sys_perf_event_open(&pe, pid, cpu, group_fd, flags);
set_fs(fs);
即使采取了这些措施,我仍然收到错误声明 “函数‘sys_perf_event_open’的隐式声明”。当定义它的头文件已经包含时,为什么会弹出这个?它是否与从内核代码中调用系统调用的方式有关?
【问题讨论】:
-
大多数情况下(基于这个问题和你之前的问题),您需要花费更多时间阅读和理解现有代码(包括阅读和理解不同 CPU 提供的现有 Linux 的低级设施)代码建立在)之上;这样您就可以修改现有代码,使其执行您想要的操作或提供其他代码(例如内核模块)可以用来执行您想要的功能。
-
非常不清楚的问题,显示出很多混乱。
标签: c gcc linux-kernel