Linux kernel 从Kprobe处理程序打开/写入文件

Linux kernel 从Kprobe处理程序打开/写入文件,linux-kernel,kernel-module,kprobe,Linux Kernel,Kernel Module,Kprobe,我正在使用KProbe编写一个Linux内核模块来跟踪特定的系统调用,我需要从KProbe处理程序(特别是Kretprobe)中写入一个文件。我知道这通常是不建议的,但我需要将输出写入一个非常特定的位置,所以我不能使用任何标准的日志机制 我可以在模块中的init()函数中正常打开/写入,但当我尝试在探测处理程序中打开/写入时,内核崩溃。来自文档/kprobes.txt: 探针处理程序在禁用抢占的情况下运行。取决于 在体系结构和优化状态下,处理程序也可以使用 禁用中断(例如,kretprobe处理

我正在使用
KProbe
编写一个Linux内核模块来跟踪特定的系统调用,我需要从
KProbe
处理程序(特别是
Kretprobe
)中写入一个文件。我知道这通常是不建议的,但我需要将输出写入一个非常特定的位置,所以我不能使用任何标准的日志机制


我可以在模块中的
init()
函数中正常打开/写入,但当我尝试在探测处理程序中打开/写入时,内核崩溃。

来自文档/kprobes.txt:

探针处理程序在禁用抢占的情况下运行。取决于 在体系结构和优化状态下,处理程序也可以使用 禁用中断(例如,kretprobe处理程序和优化的kprobe 处理程序在x86/x86-64上运行时不禁用中断)。无论如何, 您的处理程序不应放弃CPU(例如,通过尝试获取 信号灯)

换句话说,您不能在探测器处理程序中睡觉。由于文件的读/写操作通常使用磁盘I/O,因此不能在处理程序中使用这些操作

我需要将输出写入一个非常特定的位置,因此我不能使用任何标准的日志机制

您可以将探测处理程序中的跟踪信息输出到特殊设备文件中,然后运行(并行)用户空间程序,该程序只需读取该文件并在非常特定的位置写入其中