Tôi đang viết một mô-đun hạt nhân để theo dõi một vài syscalls muốn trả về các đối số hàm cho người dùng (thông qua ổ cắm netlink) nếu cuộc gọi thành công.Nhân Linux - Làm thế nào để khớp một jprobe với kretprobe?
jprobe.kp.symbol_name = "rename";
jprobe.entry = rename_handler;
kretprobe.kp.symbol_name = "rename";
kretprobe.handler = rename_ret_handler;
static rename_obj_t _g_cur_rename = NULL;
static void _rename_handler(const char *oldpath, const char *newpath)
{
_g_cur_rename = create_rename(oldpath, newpath);
jprobe_return();
}
static void _rename_ret_handler(struct kretprobe_instance *ri, struct pt_regs *regs)
{
/* Send only if successful */
if (regs_return_value(regs) == 0) {
add_send_queue(_g_cur_rename);
}
return 0;
}
Tôi lo ngại rằng một syscall đổi tên khác có thể preempt [1] giá trị hiện tại sau jprobe và tôi sẽ gửi các mã và đối số không chính xác.
jprobe: rename(a, b)
jprobe rename(c, d)
kretprobe
kretprobe
Edit: Bài viết này [2] khẳng định rằng ngắt bị vô hiệu hóa trong một handler kprobe. Nhưng điều đó có nghĩa là các ngắt bị vô hiệu hóa trong toàn bộ chuỗi (jprobe -> kprobe -> kretprobe) hoặc chỉ cho kprobe đơn?
- https://unix.stackexchange.com/questions/186355/few-questions-about-system-calls-and-kernel-modules-kernel-services-in-parallel
- https://lwn.net/Articles/132196/