旧的linux版本使用“int 0x80”指令来实现系统调用,后来的版本使用“SYSENTER/SYSEXIT”指令来实现。
通过“int 0x80”传输到ring 0后,cpu处于中断上下文中,中断被禁用。但是“SYSENTER/SYSEXIT”不会产生“中断上下文”并且中断不会被禁用。
这种差异会不会给系统调用带来问题?
最佳答案
接到电话的人都清楚发生了什么,并且必须应对。请记住,中断是提醒系统出现需要紧急注意的事情的方式,最好尽快处理。禁用中断会降低性能,因为事件处理会延迟。不久前英特尔添加了新指令 SYSENTER/SYSEXIT 指令以提供更快/更简单的系统调用处理,Linux 几乎立即开始使用它们。
从历史的角度来看,计算机过去只有一个 CPU。禁用对它们的中断是确保互斥的一种(残酷的)方式:只要禁用中断,没有(几乎没有异常(exception))可以干扰,因为没有其他事情会发生。因此,强制中断是完成系统调用的一种简单方法,还有确保不受干扰的额外好处。对于多 CPU 机器(甚至是手机!),在 CPU 上禁用中断来处理调用几乎没有什么用,其他人可以继续并践踏你的工作。在整个系统范围内禁用中断代价高昂,而仅仅为了确保互斥而停止整个系统是疯狂的。当前版本的 Linux 使用复杂的同步技术来尽可能避免这种粗暴的方法。因此,防止中断不再那么重要。
关于linux - SYSENTER/SYSEXIT 与 INT 0x80,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22254566/