Я пытаюсь использовать kprobe для отслеживания вызовов функций handle_pte_fault в ядре Linux. Я могу зондировать handle_mm_fault, но когда я пытаюсь зондировать handle_pte_dault, обработчик kprobe для handle_pte_fault ничего не печатает.
Используя это, я решил, что не могу исследовать встроенную и статическую функцию. Итак, я изменил определение функции handle_pte_fault следующим образом и перекомпилировал ядро.
Из:
static int handle_pte_fault(struct vm_fault *vmf)
к:
noinline int handle_pte_fault(struct vm_fault *vmf)
Я также добавил следующее, чтобы убедиться, что символ handle_pte_fault существует
EXPORT_SYMBOL_GPL(handle_pte_fault);
Тем не менее я не могу отслеживать / проверять функцию handle_pte_fault. Любая помощь или объяснение. Означает ли это, что kprobe будет работать только для некоторых случайных функций?
Я использую ядро v4.13.
Ниже приведен код модуля ядра для kprobe, который я использую:
#include<linux/module.h>
#include<linux/version.h>
#include<linux/kernel.h>
#include<linux/init.h>
#include<linux/kprobes.h>
static struct kprobe kp;
static const char *probed_func = "handle_pte_fault";
static unsigned int counter = 0;
int Pre_Handler(struct kprobe *p, struct pt_regs *regs){
printk("Pre_Handler: counter=%u\n",counter++);
return 0;
}
void Post_Handler(struct kprobe *p, struct pt_regs *regs, unsigned long flags){
printk("Post_Handler: counter=%u\n",counter++);
}
int myinit(void)
{
printk("module inserted\n ");
kp.pre_handler = Pre_Handler;
kp.post_handler = Post_Handler;
kp.addr = (kprobe_opcode_t *)kallsyms_lookup_name(probed_func);
register_kprobe(&kp);
return 0;
}
void myexit(void)
{
unregister_kprobe(&kp);
printk("module removed\n ");
}
module_init(myinit);
module_exit(myexit);
MODULE_AUTHOR("User1");
MODULE_DESCRIPTION("KPROBE MODULE");
MODULE_LICENSE("GPL");
Да, всегда следует проверять возвращаемое значение register_kprobe. Кроме того, вы также можете проверить, вернул ли kallsyms_lookup_name правильный адрес handle_pte_fault. Кроме того, обратите внимание на сообщения в dmesg после загрузки модуля. Если там есть сообщения об ошибках, это может помочь понять, что происходит не так.
Это действительно работает, я делал ошибки при перезагрузке, используя более старый скомпилированный образ. Как только я перезагружаюсь с правильным изображением, он работает нормально. Спасибо за помощь.





Какое значение возвращается при вызове
register_kprobe()? Это должен быть индикатор того, была ли установка kprobe успешной или нет.