旧的linux版本使用“int 0x80”指令来实现系统调用,后来的版本使用“SYSENTER / SYSEXIT”指令来执行。
在通过“int 0x80”传送到环0之后,cpu处于中断环境,中断被禁止。 但“SYSENTER / SYSEXIT”不会产生“中断上下文”,中断也不会被禁止。
这种差异会导致系统调用的问题吗?
接到电话的人清楚发生了什么事情,而且必须应付。 记住,中断是提醒系统需要紧急注意的方法,最好尽快处理。 由于事件处理被延迟,禁用中断会降低性能。 为了提供更快速/更简单的系统调用处理,不久之前,intel新增了SYSENTER / SYSEXIT指令,Linux几乎立即开始使用它们。
从历史角度来看,电脑曾经有一个CPU。 禁用中断是确保互斥的一种(残酷的)方法:只要中断被禁用, 什么都没有 (除了小例外)可能会干扰,因为没有其他事情可能发生。 所以强制中断是完成系统调用的一个简单方法,还有额外的好处是确保不受干扰。 对于多CPU机器(甚至手机!),禁用CPU中断来处理呼叫的中断很少,其他人可以继续并践踏你的工作。 禁用系统中断是昂贵的,只是停止整个系统,以确保相互排斥是疯狂的。 如果可能的话,当前版本的Linux使用复杂的同步技术来避免这种笨拙的方法。 所以防止中断的保护不再那么重要了。