【问题标题】:Can we call system call in kernel space?我们可以在内核空间调用系统调用吗?
【发布时间】:2013-03-28 07:19:36
【问题描述】:

有时,当我们必须在内核系统中调用系统调用时,我们会调用它的帮助程序或相关的内核函数,而不是执行 'syscall'。我仍然想知道我们可以在内核空间中调用系统调用吗?如果没有,是什么阻止了我们这样做。

我的问题有点奇怪。

【问题讨论】:

  • 不,你不能。根据定义,系统调用是内核和用户空间之间的接口
  • 我知道。我们所做的是调用助手或其他函数。我只是好奇我们能不能成功。
  • 而且一个系统调用大概也是一个调度点;所以你不想在内核的任意点调用它的函数。通常,内核编码非常棘手。你应该更多地解释你想要做什么以及为什么要这样做......
  • 我没有需要或确实使用过的案例。我只是问有可能做到这一点。很抱歉让您感到困惑。我只是出于好奇提出一个问题......
  • Linux 内核编程方面的书籍很多……你看过吗?

标签: linux kernel system-calls


【解决方案1】:

实际上,与流行的看法(以及这里的一些答案)相反,答案是,是的,你可以,但取决于哪个操作系统:

  • 在 Linux 中,您可以调用几乎所有的系统调用,只要您能找到它们的内核导出(例如 cat /proc/kallsysms | grep sys_)。通过设置数据段(KERNEL_DS),在大多数系统调用(那些接受用户模式*的系统调用)中有一个小“技巧”​​来绕过保护。不完全推荐,但如果您需要从内核(例如 SELinux)访问文件,这肯定是有意义的。

  • 在 Windows 中,内核中的大多数 Nt* 调用也可用作 Zw* 调用 - 执行 "dumpbin /exports C:\windows\system32\ntoskrnl.exe | findstr Zw (or Nt)" for一个例子。

  • 在 Mac OS X 中,它在技术上是不允许的,尽管有一些巧妙的技巧可以绕过它。

尽管系统调用确实是用户模式和内核之间的接口,但令人惊讶的是,在相当多的情况下,即使是具有生产价值的代码也会这样做——但要仔细遵守警告。

【讨论】:

  • 但是,当我 insmod 时,它会抱怨“未知符号 sys_socket”。
  • 这可能是因为该符号仅适用于 GPL。 Linux有时就是这样。从上面尝试 cat/grep,如果您确实看到导出的符号 (T),但仍然无法链接到它,那么很可能是这样。并非所有系统调用都必须导出。尤其是套接字还有其他问题,但我们不要复杂化 - 先尝试一下
猜你喜欢
  • 1970-01-01
  • 2018-11-29
  • 2014-03-02
  • 1970-01-01
  • 1970-01-01
  • 2011-12-15
  • 1970-01-01
  • 1970-01-01
  • 2021-03-03
相关资源
最近更新 更多