Технически возможно вызвать ioctl внутри кода ядра. Он называется ksys _ioctl().[ *] Обратите внимание, что init/
— это единственный другой код, который вызывает ksys _ioctl (). Это, мягко говоря, необычно. Вызов perf ioctl внутри ядра звучит еще более сомнительно.
Чтобы начать понимание того, почему это необычно, я хотел бы отметить, что ksys_ioctl()
по-прежнему принимает fd
аргумент. Это номер файлового дескриптора в контексте текущей задачи(процесса/потока ).
[edit] My goal is that, at every context switch get the count of an event and store it in the task structure. Hence eventually I want the counter to be called from the context_switch() function in the kernel.
АААААА.
Итак, вы не хотели вызывать ioctl ()из ядра. (У вас не будет файлового дескриптора для вызова ioctl (). И я не верю, что вы хотите начать открывать файловые дескрипторы в таблице файлов текущей задачи при каждом переключении контекста _(). Даже если вы их потом закроете ).
На данный момент вы спрашиваете о реализации (уменьшенной версии )системы Linux perf
sub -. Подсистема perf
владеет счетчиками производительности. Если вы хотите использовать счетчики производительности без подсистемы perf
, вы должны начать с отключения поддержки perf
в ядре. На каком-то более позднем этапе процесса вам следует потратить время на просмотр соответствующих материалов в SDM(или соответствующих руководствах -, которые я не проверял ).
[ *] Примечание :существуют ограничения при передаче указателей в ksys_*()
функции. В основном они ожидают __user
памяти, а не памяти ядра, если только вы не играете в игры с использованием set_fs()
...
Работа над кодом perf
— это другое дело. Вы можете легко найти код, чтобы начать смотреть там, например. нажав PERF _EVENT _IOC _RESET . А также конкретная строка, которая даст вам исходный файл (и каталог )для просмотра, и вы также можете продолжать щелкать по :-). Поэтому я предполагаю, что это не ваш вопрос.