linux - SYSENTER/SYSEXIT 与 INT 0x80

标签 linux assembly x86

旧的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/

相关文章:

c - 理解反汇编——看两个 main() 的

c - _mm_store_si128 上的 SSE 段错误

c++ - 使用 SDL_SetWindowIcon() 没有窗口图标

linux - 用于获取转发端口并插入到程序配置文件的 Bash 脚本

c - 未知 IA32 汇编语言指令

c - GCC/X86,相对跳转问题

x86 - 使用 GDB 读取 MSR

linux - Linux 中的 atq 作业数量有限制吗?

android - 在 app.json 中定义 expo entryPoint 不起作用

gcc - 为什么 GCC 不遵循 System V AMD64 ABI?