我正在使用Kprobes编写一个Linux内核模块来跟踪特定的系统调用,并且我需要从一个KProbe处理程序(具体地说,是一个Kretprobe)中写入一个文件。我知道这通常是不可取的,但是我需要将输出写到一个非常特定的位置,所以我不能使用任何标准的日志记录机制。
我可以从模块中的init()函数很好地打开/写入,但是当我尝试从探测处理程序中这样做时,内核崩溃了。
发布于 2015-07-14 21:24:30
来自Documentation/kspeces.txt:
探测处理程序在禁用抢占的情况下运行。根据体系结构和优化状态的不同,处理程序也可以在禁用中断的情况下运行(例如,在x86/x86-64上,kretprobe处理程序和优化的kprobe处理程序运行时不禁用中断)。在任何情况下,您的处理程序都不应该放弃CPU (例如,通过尝试获取信号量)。
换句话说,您不能在探测处理程序中休眠。因为对文件的读/写操作通常使用磁盘I/O,所以不能在处理程序中使用这些操作。
我需要将输出写到一个非常特定的位置,所以我不能使用任何标准的日志记录机制。
您可以从探测处理程序输出跟踪,例如,输出到特殊设备文件中,并运行(并行)用户空间程序,该程序只是在非常特定的位置读取该文件并写入其中一个文件。
https://stackoverflow.com/questions/31406898
复制相似问题