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