【问题标题】:Big Differences Between Linux System Calls and INT 80 Software InterruptsLinux 系统调用和 INT 80 软件中断之间的巨大差异
【发布时间】:2011-12-13 05:00:54
【问题描述】:

从一张不太远的图片中,有人可以详细说明 Linux 的系统调用(如 read() 和 write() 等)之间的区别,并使用 x86 INT 操作码将它们写成汇编设置指定的寄存器?

【问题讨论】:

  • 问“系统调用”和“在程序集中编写系统调用”之间的区别就像问“书”和“写书”之间的区别。一个是实体,另一个是过程。

标签: linux kernel system-calls


【解决方案1】:

实际的函数read() 是一个C 库包装器,它覆盖了所谓的“系统调用门”。 C 库包装器主要负责将errno 设置为失败,以及用户空间中使用的结构与低级系统调用使用的结构之间的映射。

反过来,系统调用门实际上是从用户模式切换到内核模式。这取决于 CPU 架构 - 在 x86 上,您有两种选择 - 一种是在使用系统调用号和参数设置寄存器后使用 INT 080h;另一种是调用映射到每个可执行文件的地址空间的库提供的符号,具有相同的寄存器设置。然后,该库在用户->内核转换的几个潜在选项之间进行选择,包括SYSENTERSYSCALL,或回退到INT 080h。其他架构使用不同的方法。在任何情况下,CPU 都会转移到内核空间,其中系统调用号用于在大表中查找适当的处理程序。

【讨论】:

    【解决方案2】:

    中断不是调用系统调用的唯一方法,您可以使用特殊指令,如 sysenter、syscall 或在保护模式下简单跳转到特定地址。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-07
      • 2018-10-06
      相关资源
      最近更新 更多