我正在编写一个用于跟踪特定系统调用的 Linux 内核模块,并且我需要从处理程序(特别是 a )Kprobes
中写入文件。我知道通常不建议这样做,但我需要将输出写入一个非常具体的位置,所以我不能使用任何标准的日志记录机制。KProbe
Kretprobe
我可以从模块中的函数打开/写入正常init()
,但是当我尝试从探测处理程序中这样做时,内核崩溃了。
我正在编写一个用于跟踪特定系统调用的 Linux 内核模块,并且我需要从处理程序(特别是 a )Kprobes
中写入文件。我知道通常不建议这样做,但我需要将输出写入一个非常具体的位置,所以我不能使用任何标准的日志记录机制。KProbe
Kretprobe
我可以从模块中的函数打开/写入正常init()
,但是当我尝试从探测处理程序中这样做时,内核崩溃了。
从文档/kprobes.txt:
探测处理程序在禁用抢占的情况下运行。根据架构和优化状态,处理程序也可以在禁用中断的情况下运行(例如,在 x86/x86-64 上,kretprobe 处理程序和优化的 kprobe 处理程序在没有中断禁用的情况下运行)。在任何情况下,您的处理程序都不应该让出 CPU(例如,通过尝试获取信号量)。
换句话说,您不能在探针处理程序中睡觉。因为对文件的读/写操作通常使用磁盘 I/O,所以您不能在处理程序中使用这些操作。
我需要将输出写入一个非常具体的位置,所以我不能使用任何标准的日志记录机制。
您可以从探测处理程序输出跟踪,例如,到特殊设备文件中,并运行(并行)用户空间程序,该程序只需读取该文件并在非常特定的位置写入文件。