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

时间:2013-04-05 18:49:01

标签: linux kernel system-calls

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

我的问题有点奇怪。

1 个答案:

答案 0 :(得分:9)

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

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

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

  • 在Mac OS X中,技术上不应该允许,但有巧妙的黑客可以绕过它。

即使系统调用确实是用户模式和内核之间的接口,但令人惊讶的是,即使是具有生产价值的代码也会出现这种情况,但是通过仔细遵守警告。