【问题标题】:How to call system call from kernel?如何从内核调用系统调用?
【发布时间】:2019-06-19 18:00:02
【问题描述】:

我正在尝试从内核空间调用getrusage() 系统调用,但我不知道如何。

我阅读了有关获取内核导出 (Can we call system call in kernel space?) 的信息,但我不知道那是什么或如何使用它。有人可以告诉我如何在 C 中从内核调用系统调用吗?

编辑:旧标题是一个问题的草稿,对不起!

【问题讨论】:

  • 你的标题和你的问题很不一样——你能详细说明一下吗?
  • 已修复。很抱歉!
  • 您可以查看此线程,这似乎与您的问题有点重复:getting-getrusage-to-measure-system-time-in-c 您还可以查看getrusage 的文档,例如this
  • man syscall?手册页甚至包括用于进行系统调用的示例代码。也就是说,包装函数通常被认为是首选方法(例如,调用 getrusage(...) 函数而不是直接进行系统调用)。
  • @SpencerD: syscall 用于从用户空间进行系统调用。

标签: c linux system-calls


【解决方案1】:

如何从内核调用系统调用?

你没有。这甚至没有意义。这就像在问“当我已经在我的房子里时,我如何进入我的房子?”。

在内核中有一大堆函数。其中一些被添加到系统调用表中,而另一些则没有;但是如果您已经在内核中,则可以使用它们而无需关心它们是否已添加到系统调用表中。请注意,如果您正在编写内核模块,那么它最终会在加载模块时完成动态链接(有点像内核是一个共享库)。

【讨论】:

  • 我想知道 - getrusage 需要一个指向要填充的缓冲区的指针。系统调用表中的相应函数 sys_getrusage 或其他任何东西都将期待一个指向用户空间内存的指针.如果您将指针传递给内核内存,它在所有架构上仍然有效吗?
  • @NateEldredge:我不知道 Linux 是如何做到的。我自己(至少对于有大量寄存器的 64 位 80x86);内核会将所有数据推入寄存器并返回到用户空间,并让用户空间库的getrusage 代码将寄存器中的数据解包到调用者的缓冲区中(这样内核就不必进行所有的完整性检查/验证库函数的调用者缓冲区)。不过,Linux 可能“更通用”。
  • @NateEldredge:当然,如果内核的内部 getrusage() 只能从用户空间使用(例如,使用来自用户空间的缓冲区),则可能有一个不同的函数来获取数据(例如getrusage_internal() 不对缓冲区进行任何检查,在完成检查后由getrusage() 调用)。还;很可能存在一个包含相同数据的“进程结构”(对于每个进程),并且内核中的所有代码都可以直接访问这些结构(无需担心任何getrusage() 包装器膨胀),因此尝试使用getrusage()反正是个错误。
猜你喜欢
  • 1970-01-01
  • 2019-08-04
  • 2016-01-06
  • 2018-11-29
  • 1970-01-01
  • 2013-09-25
  • 2011-12-15
  • 1970-01-01
  • 2013-11-01
相关资源
最近更新 更多