SYSENTER/SYSEXIT与INT 0x80的区别

8

旧版的Linux使用“int 0x80”指令来实现系统调用,而较新版本则使用“SYSENTER/SYSEXIT”指令。

通过“int 0x80”转移到ring 0后,CPU处于中断上下文且中断被禁用。但是,“SYSENTER/SYSEXIT”不会产生“中断上下文”,也不会禁用中断。

这种差异会对系统调用造成问题吗?


1
我怀疑Linux继续良好可靠地运行,这可能表明转换没有引起任何问题(或者出现的任何问题已经得到处理)... - twalberg
1个回答

6
无论谁接到呼叫,都清楚正在发生什么,并且必须应对。请记住,中断是警报系统有紧急需要处理的事情的方式,它最好尽快处理。禁用中断会降低性能,因为事件处理会被延迟。不久前,英特尔增加了SYSENTER/SYSEXIT指令,以提供更快/更简单的系统调用处理, Linux 几乎立即开始使用它们。
从历史角度看,计算机过去只有一个CPU。在它们上面禁用中断是一种确保互斥的(野蛮)方法:只要中断被禁用,没有任何其他东西可以干扰(除了极少数情况),因为没有其他事情可以发生。因此,强制产生中断是完成系统调用的一种简单方法,并带有确保没有干扰的额外好处。但是,在多CPU机器上(甚至是手机!),在处理呼叫的CPU上禁用中断几乎没有任何效果,别的CPU可以继续践踏你的工作。系统范围内禁用中断的代价很高,而仅仅为了确保互斥而停止整个系统是疯狂的。当前版本的Linux使用复杂的同步技术,尽可能避免使用这种笨拙的方法。因此,防止中断的保护已经不那么重要了。

但据我所知,Linux会在进入中断处理程序时自动执行一些关键操作(禁用中断),而重置工作是通过软件中断调度的,这种调度被称为“后半部机制”,不需要原子代码。 - Gary Yin
“不久之前”-- Pentium II于1997年发货,是第一款支持SYSENTER的英特尔CPU。目前没有任何x86或x64系统缺少这些指令。 - Jon Watte

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接