【问题标题】:Replacing system calls (syscalls) in Linux 2.6+在 Linux 2.6+ 中替换系统调用(syscalls)
【发布时间】:2011-09-17 22:27:21
【问题描述】:

我正在考虑写一个userland threading library,因为在这个领域似乎没有积极的工作,我相信C++0x promises and futures 可能会给这个模型一些力量。不幸的是,为了使这个模型工作,必须确保阻塞调用的上下文切换。因此,我想拦截每个系统调用,以便用异步版本替换它。有一些注意事项:

  • 我知道几乎每个常规系统调用都有异步系统调用,但出于向后兼容性的原因,这不是一个可行的解决方案。
  • 我知道在 Linux 2.4 或更早版本中可以直接更改 sys_call_table,但这已经消失了。
  • 由于我希望我的库在需要时进行静态链接,因此 LD_PRELOAD 技巧不可行。
  • 同样,内核模块不是一个选项,因为它应该是一个用户态库。
  • 最后,出于类似原因,ptrace() 也不是一个选项。我不能让我的库仅仅为了使用而分叉一个新进程。

这可能吗?

【问题讨论】:

  • 在我看来,这个问题与系统调用无关,但通常与链接机制有关。由于通常没有人在汇编代码中调用系统调用,您只想在链接时用自己的函数替换一些通用函数。
  • 您知道,我想知道ptrace 本身的进程是否有可能实现这一点?即使不是,您也可能想了解strace 如何拦截系统调用。

标签: multithreading c++11 future system-calls promise


【解决方案1】:

我正在考虑编写一个用户态线程库,因为这方面似乎没有积极的工作

您可能想看看线程库Marcel(及其publications)和MPC,它们实现了混合(内核用户级)线程,主要在高性能计算的目的,所以他们必须为这种阻塞系统调用找到一些解决方案。

以免在应用程序时阻塞内核线程 进行阻塞系统调用,Marcel 使用 Scheduler Activations 时 它们是可用的,或者只是在动态拦截这样的阻塞调用 符号级别。

【讨论】:

  • 我实际上看过 Marcel,但不幸的是它的许可证与我正在做的事情不兼容。此外,您发布的内容表明他们正在使用 LD_PRELOAD 技巧和/或使用共享库。尽管如此,马塞尔看起来还是很可爱的,所以希望其他人的要求不会比我严格。
猜你喜欢
  • 2012-01-07
  • 1970-01-01
  • 1970-01-01
  • 2012-06-30
  • 1970-01-01
  • 2018-09-10
  • 1970-01-01
  • 1970-01-01
  • 2011-04-22
相关资源
最近更新 更多