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