从目前尚未删除的图片来看,有人可以更详细地阐述Linux的系统调用(如read()和write()等)之间的区别,并使用x86 INT操作码以及设置指定的寄存器?
答案 0 :(得分:6)
实际函数read()
是一个C库包装器,它被称为“系统调用门”。 C库包装器主要负责在失败时设置errno
,以及在用户空间中使用的结构与低级系统调用使用的结构之间的映射。
反过来,系统调用门实际上是从用户模式切换到内核模式的。这取决于CPU架构 - 在x86上,您有两个选项 - 一个是在使用系统调用号和参数设置寄存器后使用INT 080h
;另一个是调用映射到每个可执行文件的地址空间的库提供的符号,具有相同的寄存器设置。然后,该库在用户 - >内核转换的几个潜在选项之间进行选择,包括SYSENTER
,SYSCALL
或回退到INT 080h
。其他架构使用不同的方法。在任何情况下,CPU都会转移到内核空间,其中系统调用号用于在大表中查找适当的处理程序。
答案 1 :(得分:0)
中断不是调用系统调用的唯一方法,您可以使用sysenter,syscall等特殊指令或简单地跳转到受保护模式下的特定地址。