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