【问题标题】:SYSENTER/SYSEXIT vs INT 0x80SYSENTER/SYSEXIT 与 INT 0x80
【发布时间】:2014-03-07 15:47:26
【问题描述】:

旧的linux版本使用“int 0x80”指令来实现系统调用,之后的版本使用“SYSENTER/SYSEXIT”指令来实现。

通过“int 0x80”传输到环 0 后,cpu 处于中断上下文中并且中断被禁用。但是“SYSENTER/SYSEXIT”不会产生“中断上下文”并且中断没有被禁用。

这种差异会不会导致系统调用出现问题?

【问题讨论】:

  • 我怀疑 Linux 继续运行良好且可靠的事实可能表明交换机没有引起任何问题(或者确实出现的任何问题都已得到处理)...

标签: linux assembly x86


【解决方案1】:

接到电话的人都清楚发生了什么,并且必须应对。请记住,中断是提醒系统出现需要紧急关注的事情的方式,最好尽快处理。禁用中断会降低性能,因为事件处理会延迟。 intel 不久前添加了新指令 SYSENTER/SYSEXIT 指令以提供更快/更简单的系统调用处理,Linux 几乎立即开始使用它们。

从历史的角度来看,计算机曾经有一个 CPU。对它们禁用中断是确保互斥的一种(残酷的)方法:只要中断被禁用,没有任何东西(几乎没有例外)可以干扰,因为不会发生其他任何事情。因此,强制中断是完成系统调用的一种简单方法,并具有确保不受干扰的额外好处。使用多 CPU 机器(甚至是手机!),在 CPU 上禁用中断来处理呼叫购买很少,其他人可以继续践踏你的工作。在系统范围内禁用中断代价高昂,仅仅为了确保互斥而停止整个系统是疯狂的。当前版本的 Linux 使用复杂的同步技术来尽可能避免使用这种笨拙的方法。所以对中断的保护不再那么重要了。

【讨论】:

  • 但是据我所知,Linux 会在原子地进入中断处理程序(中断被禁用)时做一些关键的事情,并且重置工作是通过称为“后半机”的软件中断安排的,它不会'不需要是原子代码。
  • "不久前" -- Pentium II 于 1997 年发布,是第一个支持 SYSENTER 的 Intel CPU。当前没有任何 x86 或 x64 系统缺少这些指令,
猜你喜欢
  • 2018-02-11
  • 2011-07-22
  • 2016-03-27
  • 2015-06-27
  • 2021-04-02
  • 2012-12-11
  • 1970-01-01
  • 2010-10-10
  • 1970-01-01
相关资源
最近更新 更多