【发布时间】:2011-12-13 05:00:54
【问题描述】:
从一张不太远的图片中,有人可以详细说明 Linux 的系统调用(如 read() 和 write() 等)之间的区别,并使用 x86 INT 操作码将它们写成汇编设置指定的寄存器?
【问题讨论】:
-
问“系统调用”和“在程序集中编写系统调用”之间的区别就像问“书”和“写书”之间的区别。一个是实体,另一个是过程。
标签: linux kernel system-calls
从一张不太远的图片中,有人可以详细说明 Linux 的系统调用(如 read() 和 write() 等)之间的区别,并使用 x86 INT 操作码将它们写成汇编设置指定的寄存器?
【问题讨论】:
标签: linux kernel system-calls
实际的函数read() 是一个C 库包装器,它覆盖了所谓的“系统调用门”。 C 库包装器主要负责将errno 设置为失败,以及用户空间中使用的结构与低级系统调用使用的结构之间的映射。
反过来,系统调用门实际上是从用户模式切换到内核模式。这取决于 CPU 架构 - 在 x86 上,您有两种选择 - 一种是在使用系统调用号和参数设置寄存器后使用 INT 080h;另一种是调用映射到每个可执行文件的地址空间的库提供的符号,具有相同的寄存器设置。然后,该库在用户->内核转换的几个潜在选项之间进行选择,包括SYSENTER、SYSCALL,或回退到INT 080h。其他架构使用不同的方法。在任何情况下,CPU 都会转移到内核空间,其中系统调用号用于在大表中查找适当的处理程序。
【讨论】:
中断不是调用系统调用的唯一方法,您可以使用特殊指令,如 sysenter、syscall 或在保护模式下简单跳转到特定地址。
【讨论】: