2013-04-05 58 views
7

有时,当我们不得不在内核系统中调用系统调用时,我们会调用它的帮助程序或相关的内核函数,而不是'系统调用'。我仍然想知道我们可以在内核空间中调用系统调用吗?如果不是,那么阻止我们做什么。我们可以在内核空间中调用系统调用吗?

我的问题有点奇怪。

+0

不,你不能。系统调用根据定义是我知道的内核和用户之间的接口 – 2013-04-05 19:00:33

+0

。我们所做的就是打电话给帮手或其他功能。我只是好奇,我们能不能做到。 – liuyruc 2013-04-05 19:06:10

+0

系统调用也可能是一个调度点;所以你不想在内核的任意点调用它的函数。一般来说,内核编码非常棘手。你应该更多地解释你想要做什么以及为什么要这么做...... – 2013-04-05 19:29:16

回答

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中,它在技术上不应该被允许,尽管有一些聪明的黑客可以绕过它。

即使系统调用确实是用户模式和内核之间的接口,也有相当出奇,甚至生产价值的代码,这样做少数情况下 - 而是通过警告小心遵守。

+1

但是,当我insmod时,它抱怨“未知的符号sys_socket”。 – 2015-02-12 09:30:35

+0

这可能是因为该符号只是GPL。 Linux就是这样的。尝试从上面的猫/ grep,如果你看到的符号出口(T),仍然不能链接到它,那很可能是。并非所有系统调用都必须导出。特别是套接字还有其他问题,但我们不要复杂 - 首先尝试一下 – Technologeeks 2015-02-12 21:13:29

相关问题