我知道的拦截系统调用的方法如下。
所以你可以看到上面提到的所有方法都有缺陷。因此,我的问题是,在不修改内核的情况下,以最小的开销拦截系统调用的方法是什么。
发布于 2012-07-02 10:22:55
如果不能修改内核,则必须修改应用程序。您需要以某种方式拦截int/syscall/sysenter指令,要么在那里设置一个断点(如果您可以在Linux应用程序中处理它们;可以在Windows中使用SEH/VEH),或者以一种更侵入的方式将指令挂钩(将其更改为jmp,以保存系统调用号和参数,执行原始的int/syscall/sysenter和jmp back)。
编辑:哦,我忘了补充一下,找到这些指令可能是个挑战。您可能无法在编译的二进制文件中正确标识它们。您可能会错过一些(特别是在运行时创建的),您还可以接受一些关于int/syscall/sysenter的其他说明(如果您的代码分析并不完美)。OTOH,在运行时(通过在执行/仿真它们之前分析单个指令(或它们的块)找到它们将导致性能的损失。
无论如何,性能问题很可能与进行系统调用的次数和记录/跟踪信息的数量直接相关。如果您将其删除(即只选择有趣的系统调用和参数)和/或只收集关于最后10000次系统调用的信息,并将数据保存在内存中,并将其保存到一个文件中(在应用程序的末尾),那么您将有更好的性能。
发布于 2012-07-02 10:16:36
查看使用动态工具框架,例如DTrace或SystemTap。其中一个或两者都可以用于您的平台。
发布于 2012-07-02 10:36:21
平工具也可能有帮助;它也适用于Linux。
https://stackoverflow.com/questions/11291632
复制相似问题