【问题标题】:Opening/Writing to a file from a Kprobe handler从 Kprobe 处理程序打开/写入文件
【发布时间】:2015-10-03 02:33:08
【问题描述】:
我正在使用Kprobes 编写一个Linux 内核模块来跟踪特定的系统调用,并且我需要从KProbe 处理程序(特别是Kretprobe)中写入文件。我知道通常不建议这样做,但我需要将输出写入一个非常具体的位置,所以我不能使用任何标准的日志记录机制。
我可以从模块中的init() 函数很好地打开/写入,但是当我尝试从探针处理程序中这样做时,内核会崩溃。
【问题讨论】:
标签:
linux-kernel
kernel-module
kprobe
【解决方案1】:
来自文档/kprobes.txt:
探测处理程序在禁用抢占的情况下运行。取决于
架构和优化状态,处理程序也可以运行
禁用中断(例如,kretprobe 处理程序和优化的 kprobe
处理程序在 x86/x86-64 上不禁用中断的情况下运行)。在任何情况下,
您的处理程序不应让出 CPU(例如,通过尝试获取
信号量)。
换句话说,您不能在探针处理程序中休眠。因为文件的读/写操作通常使用磁盘 I/O,所以不能在处理程序中使用这些操作。
我需要将输出写入一个非常具体的位置,所以我不能使用任何标准的日志记录机制。
您可以从探测处理程序输出跟踪,例如,到特殊设备文件中,并运行(并行)用户空间程序,该程序只需读取该文件并在非常特定的位置写入一个文件 .