什么是更好的“int 0x80”或“系统调用”?

时间:2012-10-09 18:56:52

标签: c linux linux-kernel system-calls

我研究了Linux内核,发现对于x86_64体系结构,中断int 0x80并不像调用系统调用那样工作。

问题是:如果x86架构更适合syscallint 0x80以及为什么?

编辑:我使用内核3.4

4 个答案:

答案 0 :(得分:70)

  • syscall是在x86-64上进入内核模式的默认方式。在Intel处理器 32位操作模式下,此指令不可用。
  • sysenter是最常用于以32位操作模式调用系统调用的指令。它类似于syscall,虽然有点难以使用,但这是内核的关注。
  • int 0x80是一种调用系统调用的传统方式,应该避免使用。

调用系统调用的优选方法是使用VDSO,它是在每个进程地址空间中映射的内存的一部分,允许更有效地使用系统调用(例如,在某些情况下根本不进入内核模式)。与传统的int 0x80方式相比,VDSO在处理syscallsysenter指令方面也更加困难。

另请参阅thisthis

答案 1 :(得分:19)

我的回答here涵盖了您的问题。

实际上,最近的内核正在实现VDSO,特别是动态优化系统调用(内核将VDSO设置为最适合当前处理器的某些代码)。因此,您应该使用VDSO,并且对于现有的系统调用,您最好使用libc提供的接口。

请注意,AFAIK,简单系统调用成本的一个重要部分是从用户空间到内核并返回。因此,对于某些系统调用(可能是gettimeofdaygetpid ...),VDSO甚至可以避免(并且在技术上可能会避免执行真正的系统调用)。对于大多数系统调用(例如openreadsendmmap ....)系统调用的内核成本足够大,可以对用户进行任何改进 - 空间到内核空间转换(例如使用SYSENTERSYSCALL机器指令而不是INT)无关紧要。

答案 2 :(得分:7)

在更改之前要注意这一点:系统调用号不同执行0x80或syscall时,例如sys_write为4,0x80,1为syscall。

http://docs.cs.up.ac.za/programming/asm/derick_tut/syscalls.html表示32位或0x80 系统调用http://blog.rchapman.org/post/36801038863/linux-system-call-table-for-x86-64

答案 3 :(得分:-3)

int 0x80是一个更好的术语,表明它对内核的系统调用告诉它做某事。

意义和解释是可互换的,“制作系统调用”或“问题80小时”。

与DOS的日子没什么不同:

  • 调用int 21h让DOS在AX寄存器和ES:DX寄存器对上执行某些操作,
  • int 13h是BIOS硬盘处理程序。
  • int 10h是EGA / VGA屏幕。
  • int 09h是键盘处理程序。

这里的共同主题是,当调用中断/系统调用时,内核会检查寄存器的状态,以查看需要哪种类型的系统调用。例如,通过查看eax寄存器,并确定要执行的操作,内部上下文切换到内核空间,执行过程和上下文切换回用户空间,并返回结果返回选项电话会议,即成功还是失败。