Я начал проверять некоторые старые ядра 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
...
Я мог успешно установить зонды ядра в соответствии с обратным адресом 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");
Код: Выделить всё
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
Код: Выделить всё
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'
Код: Выделить всё
[ 225.686827] Planted return probe at SyS_getdents64: ffffffffa3c722e0
Я проверил, и это кажется, в этом ядре включены kprobes,
Код: Выделить всё
[root@localhost user]# cat /sys/kernel/debug/kprobes/enabled
1
Я не знаю У меня нет никакой цели производить какой-либо продукт или что-то в этом роде. Я просто использую свободное время на работе, чтобы узнать о ядре Linux и его внутреннем устройстве, а также поэкспериментировать.
После того, как я попробовал разные вещи, чтобы ограничить свои знания, и несколько статей в Интернете, я смог Я сам не обнаружил проблемы, поэтому хочу получить профессиональную помощь.
Подробнее здесь: https://stackoverflow.com/questions/786 ... ing-called