Обработчики kretprobe в ядре 3.x не вызываютсяLinux

Ответить Пред. темаСлед. тема
Anonymous
 Обработчики kretprobe в ядре 3.x не вызываются

Сообщение Anonymous »

Недавно я изучал и экспериментировал с зондами ядра (как kprobes, так и kretprobes), и сегодня мне удалось заставить их работать с ядром Ubuntu 22.04 5.x (это ядро, которое я использую на своей машине разработки) и ядром Debian 12.5. У меня есть виртуальная машина 6.x, и она работала без каких-либо проблем.
Я начал проверять некоторые старые ядра 3.x и 4.x, поэтому установил CentOS 7 с ядром 3.10. .0.1160.119.el7.x86_64...
Здесь и начинается проблема. Прежде всего, в ядре 3.x имена системных вызовов были другими. Например, __x64_sys_getdents64 теперь называется sys_getdents64(есть еще SyS_getdents64, я действительно не знаю разницы).

Код: Выделить всё

[user@localhost ~]$ cat /proc/kallsyms | grep getdents
0000000000000000 T SyS_getdents
0000000000000000 T sys_getdents
0000000000000000 T SyS_getdents64
0000000000000000 T sys_getdents64
0000000000000000 T compat_sys_getdents
0000000000000000 T compat_sys_getdents64
...
Поэтому я изменил код и установил kretprobe на sys_getdents64.
Я мог успешно установить зонды ядра в соответствии с обратным адресом Register_kretprobe, но мой обработчики не вызываются. Чтобы сузить проблему, я написал упрощенную версию своего кода

Код: Выделить всё

#include 
#include 
#include 

static int entry_handler(struct kretprobe_instance *ri, struct pt_regs *regs)
{
printk(KERN_INFO "entry_handler: getdents64 called\n");
return 0;
}

static int ret_handler(struct kretprobe_instance *ri, struct pt_regs *regs)
{
printk(KERN_INFO "ret_handler: getdents64 returned\n");
return 0;
}

static struct kretprobe my_kretprobe = {
.handler = ret_handler,
.entry_handler = entry_handler,
.maxactive = 20,
};

static int __init kretprobe_init(void)
{
int ret;

my_kretprobe.kp.symbol_name = "sys_getdents64";
ret = register_kretprobe(&my_kretprobe);
if (ret < 0) {
printk(KERN_INFO "register_kretprobe failed, returned %d\n", ret);
return -1;
}
printk(KERN_INFO "Planted return probe at %s: %p\n",
my_kretprobe.kp.symbol_name, my_kretprobe.kp.addr);
return 0;
}

static void __exit kretprobe_exit(void)
{
unregister_kretprobe(&my_kretprobe);
printk(KERN_INFO "kretprobe at %p unregistered\n", my_kretprobe.kp.addr);
}

module_init(kretprobe_init)
module_exit(kretprobe_exit)
MODULE_LICENSE("GPL");
и собрать его с помощью следующего Makefile,

Код: Выделить всё

obj-m += lkmtest.o

all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules

clean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
Я получаю следующий вывод из Makefile:

Код: Выделить всё

 make
make -C /lib/modules/3.10.0-1160.119.1.el7.x86_64/build M=/home/user/test modules
make[1]: Entering directory `/usr/src/kernels/3.10.0-1160.119.1.el7.x86_64'
CC [M]  /home/user/test/lkmtest.o
Building modules, stage 2.
MODPOST 1 modules
CC      /home/user/test/lkmtest.mod.o
LD [M]  /home/user/test/lkmtest.ko
make[1]: Leaving directory `/usr/src/kernels/3.10.0-1160.119.1.el7.x86_64'
после insmod lkmtest.ko я получаю следующее подтверждение в dmesg

Код: Выделить всё

[  225.686827] Planted return probe at SyS_getdents64: ffffffffa3c722e0
Но что бы я ни делал, я не вижу сообщения в printk обработчика kretprobe! Я попробовал ls из разных каталогов, запустил top, но в журналах dmesg не было никаких сообщений от обработчика зонда.
Я проверил, и это кажется, в этом ядре включены kprobes,

Код: Выделить всё

[root@localhost user]# cat /sys/kernel/debug/kprobes/enabled
1
Как ни странно, я протестировал пример кода с https://github.com/spotify/linux/blob/m ... _example.c и kretprobe на do_fork работало хорошо, но когда я изменил переменную func_name на getdents64, поведение было таким же, как я говорил выше.
Я не знаю У меня нет никакой цели производить какой-либо продукт или что-то в этом роде. Я просто использую свободное время на работе, чтобы узнать о ядре Linux и его внутреннем устройстве, а также поэкспериментировать.
После того, как я попробовал разные вещи, чтобы ограничить свои знания, и несколько статей в Интернете, я смог Я сам не обнаружил проблемы, поэтому хочу получить профессиональную помощь.

Подробнее здесь: https://stackoverflow.com/questions/786 ... ing-called
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Linux»