使用 Kprobe 获取 splice 系统调用 source_fd 的文件类型
使用 Kprobe 获取 splice 系统调用 source_fd 的文件类型
为了能够判断 source_fd 的文件类型,需要使用结构体指针。修改后的命令如下:
echo 'p:th1nk_test sys_enter_splice source_fd=%di target_fd=%si len=%dx flags=%cx; struct file *filep = (struct file *)bpf_get_filename((const char *)&file, sizeof(file)); if (filep != NULL) { bpf_probe_read(&source_file_type, sizeof(source_file_type, &filep->f_inode->i_mode);}' > /sys/kernel/debug/tracing/kprobe_events
echo 'p:th1nk_test sys_exit_splice; if (source_file_type != 0) { bpf_trace_printk("source_fd: %d, file type: %d\n", source_fd, source_file_type); }' >> /sys/kernel/debug/tracing/kprobe_events
echo 1 > /sys/kernel/debug/tracing/events/kprobes/enable
echo > /sys/kernel/debug/tracing/trace && cat /sys/kernel/debug/tracing/trace
这个命令在内核中安装了一个 kprobe,当系统调用 splice 被调用时,会打印出 source_fd 所对应的文件类型。修改后的命令增加了一个结构体指针,用于获取 source_fd 所对应的文件类型,并在 sys_exit_splice 中打印出文件类型。
解释:
bpf_get_filename: 获取文件名的函数bpf_probe_read: 读取内存数据的函数source_file_type: 用于存储文件类型的变量filep->f_inode->i_mode: 文件 inode 的模式,其中包含文件类型信息
通过上述步骤,我们可以成功地使用 Kprobe 获取 splice 系统调用 source_fd 的文件类型。
原文地址: https://www.cveoy.top/t/topic/mV8m 著作权归作者所有。请勿转载和采集!