Я пытаюсь создать механизм для чтения счетчиков производительности для процессов.Я хочу, чтобы этот механизм выполнялся из самого ядра (версия 4.19.2).
Я могу сделать это из пользовательского пространства системным вызовом sys_perf_event_open()
следующим образом.
syscall (__NR_perf_event_open, hw_event, pid, cpu, group_fd, flags);
Я хотел бы вызвать этот вызов из пространства ядра.Отсюда я получил некоторую базовую идею Как использовать системный вызов Linux из модуля ядра Linux
Вот шаги, которые я предпринял для достижения этой цели:
Чтобы убедиться, что виртуальный адрес ядра остается действительным, я использовал 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'" .Почему это появляется, когда файл заголовка, определяющий его, уже включен?Связано ли это с тем, как следует вызывать системные вызовы из кода ядра?