Linux系统调用与INT 80软件中断之间的巨大差异

Mat*_*gan 2 linux kernel system-calls

从目前尚未删除的图片来看,有人可以更详细地阐述Linux的系统调用(例如read()和write()等之间的区别,并使用x86 INT操作码和汇编在汇编中编写它们指定的寄存器?

bdo*_*lan 6

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

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