首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在不修改内核的情况下拦截系统调用的最小开销方式

在不修改内核的情况下拦截系统调用的最小开销方式
EN

Stack Overflow用户
提问于 2012-07-02 10:12:07
回答 3查看 2.3K关注 0票数 6

我知道的拦截系统调用的方法如下。

  1. 使用帕斯莱,但这似乎有很高的开销。据我所知,像strace这样的工具也在内部使用ptrace。
  2. 使用内核模块来更改系统调用表,但据我所知,这种方法在以后的linux内核中不再可行。
  3. 使用LD_PRELOAD。但是,如果您不对系统调用使用包装库函数,就无法直接进行系统调用。

所以你可以看到上面提到的所有方法都有缺陷。因此,我的问题是,在不修改内核的情况下,以最小的开销拦截系统调用的方法是什么。

EN

回答 3

Stack Overflow用户

发布于 2012-07-02 10:22:55

如果不能修改内核,则必须修改应用程序。您需要以某种方式拦截int/syscall/sysenter指令,要么在那里设置一个断点(如果您可以在Linux应用程序中处理它们;可以在Windows中使用SEH/VEH),或者以一种更侵入的方式将指令挂钩(将其更改为jmp,以保存系统调用号和参数,执行原始的int/syscall/sysenterjmp back)。

编辑:哦,我忘了补充一下,找到这些指令可能是个挑战。您可能无法在编译的二进制文件中正确标识它们。您可能会错过一些(特别是在运行时创建的),您还可以接受一些关于int/syscall/sysenter的其他说明(如果您的代码分析并不完美)。OTOH,在运行时(通过在执行/仿真它们之前分析单个指令(或它们的块)找到它们将导致性能的损失。

无论如何,性能问题很可能与进行系统调用的次数和记录/跟踪信息的数量直接相关。如果您将其删除(即只选择有趣的系统调用和参数)和/或只收集关于最后10000次系统调用的信息,并将数据保存在内存中,并将其保存到一个文件中(在应用程序的末尾),那么您将有更好的性能。

票数 4
EN

Stack Overflow用户

发布于 2012-07-02 10:16:36

查看使用动态工具框架,例如DTraceSystemTap。其中一个或两者都可以用于您的平台。

票数 1
EN

Stack Overflow用户

发布于 2012-07-02 10:36:21

平工具也可能有帮助;它也适用于Linux。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11291632

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档