有时,当我们必须在内核系统中调用系统调用时,我们会调用它的帮助程序或相关的内核函数,而不是执行“系统调用”。我仍然想知道我们可以在内核空间调用系统调用吗?如果不是,是什么阻止了我们这样做。
我的问题有点奇怪。
最佳答案
实际上,与流行的看法(以及此处的一些答案)相反,答案是可以,但取决于操作系统:
在 Linux 中,如果您能找到它们的内核导出,您几乎可以调用所有系统调用(例如执行
cat/proc/kallsyms | grep sys_
)。通过设置数据段 (KERNEL_DS),有一个小“技巧”可以绕过大多数系统调用(那些接受用户模式 的系统调用)的保护。不完全推荐,但如果您需要从内核(例如 SELinux)访问文件,这肯定是有意义的。在 Windows 中,内核中的大部分 Nt* 调用也可用作 Zw* 调用 - 执行“dumpbin/exports C:\windows\system32\ntoskrnl.exe | findstr Zw(或 Nt)”一个例子。
在 Mac OS X 中,从技术上讲,它不应该被允许,尽管有一些巧妙的技巧可以绕过它。
尽管系统调用确实是用户模式和内核之间的接口(interface),但令人惊讶的是,在很多情况下,即使是具有生产值(value)的代码也会这样做——但要仔细遵守警告。
关于linux - 我们可以在内核空间调用系统调用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15841327/