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

标签 linux kernel system-calls

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

我的问题有点奇怪。

最佳答案

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

  • 在 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/

相关文章:

c - 是否可以实时监控linux下的所有系统调用?

c - 验证进程不再具有控制终端的方法

c - "kernel must be loaded first"

linux - 在 Linux 启动之前清除 RAM 区域

计算 linux 机器上非空 SNDBUF 的 tcp 套接字总数

assembly - 汇编代码中的 "int 0x80"是什么意思?

c++ - C中的快速生产者/慢速消费者

c++ - 加载共享库时出错 : No such file or directory even after using LD_LIBRARY_PATH and changing $PATH

c - 从程序中读取 JSON 输出,然后在 C 中解析 JSON

operating-system - 为什么要在代码中尽量减少对系统调用的使用?