linux 我们可以在内核空间调用系统调用吗?

dy2hfwbg  于 2022-11-02  发布在  Linux
关注(0)|答案(1)|浏览(194)

有时候,当我们必须在内核系统中调用系统调用时,我们调用它的帮助器或相关的内核函数,而不是做'syscall'。我仍然想知道我们能在内核空间中调用系统调用吗?如果不能,是什么阻止我们这样做。
我的问题有点怪。

bq3bfh9z

bq3bfh9z1#

实际上,与普遍的看法(以及此处的一些答案)相反,答案是,是的,您可以,但取决于操作系统:

  • 在Linux中,你可以调用几乎所有的系统调用,只要你能找到它们的内核输出(比如cat /proc/kallsyms | grep sys_)。在大多数系统调用中(那些接受用户模式 * 的系统调用),有一个小“技巧”可以通过设置数据段(KERNEL_DS)来绕过保护。这不是完全推荐的,但是如果你需要从内核访问文件(比如SELinux),这肯定是有意义的。
  • 在Windows中,内核中的大多数Nt* 调用也可以作为Zw* 调用使用- do“dumpbin /exports C:\windows\system32\ntoskrnl.exe| findstr Zw(或Nt)”中的示例。
  • 在Mac OS X中,从技术上讲,这是不允许的,尽管有一些聪明的黑客可以绕过它。

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

相关问题