【问题标题】:How systemcalls are handled by the kernel? [duplicate]内核如何处理系统调用? [复制]
【发布时间】:2018-04-04 02:42:07
【问题描述】:

我以前认为系统调用是黑盒,后来我发现它向内核发送了一个中断(0x80),内核调用了相应的中断处理程序。但是我仍然无法理解引擎盖下到底发生了什么,中断处理程序究竟是什么以及如何工作?中断处理程序是内核的一部分吗?

【问题讨论】:

  • 在问这个问题之前你的研究是什么?你试过问谷歌吗?我记得有很多非常好的文章概述了细节。
  • 不同的问题,但重复的 IMO,因为答案有 Linux 的 int 0x80 处理 64 位内核代码的实际演练。 (并与本机 64 位系统调用的 syscall 处理程序进行比较)。

标签: assembly linux-kernel x86 osdev


【解决方案1】:

它与函数调用有何不同?函数调用有一组规则。在这种情况下,调用包含一组规则、输入、输出。只是你调用它的方式有点不同。有充分的理由,您可以越过保护边界。软件中断允许逻辑从您的应用程序转到内核代码、读取输入、做出反应并返回。

这里几乎没有魔法。

【讨论】:

  • 我无法理解的是这些功能是如何实现的。大多数C函数最终都会变成系统调用,那么如果中断处理程序依赖于系统调用,它是如何工作的呢?
  • 处理程序为系统调用提供服务。应用层的 c 函数通常不能直接接触资源,它们必须要求内核做一些事情。这就是机制。内核有一个处理这些软件中断的处理程序,该处理程序就是系统,因此是系统调用。
  • 它们的实现方式是,对于特定的操作系统,您为这些调用编写内联或真正的汇编,它是该系统的 C 或其他库的一部分。
  • Linux、windows、macos 等将有一组不同的系统调用,并且该系统的 C(或其他)库是为该系统定制的(假设系统调用不兼容,这是一个安全的假设)
  • 术语:“超级用户”是特权用户,例如root。系统调用将您的参数传递给 kernel 代码。编辑更正。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-01
  • 2020-05-03
相关资源
最近更新 更多