在 Linux 的32位代码中,什么是更好的“ int 0x80”或“ syscall”?

我研究了 Linux 内核,发现对于 x86 _ 64体系结构,中断 int 0x80不能调用系统调用 1

对于 i386体系结构(32位 x86用户空间) ,哪个更可取: syscall还是 int 0x80? 为什么?

我使用 Linux 内核3.4版。


脚注1: int 0x80在某些情况下可以在64位代码中工作,但是不推荐使用

45128 次浏览

我的答案涵盖了你的问题。

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

注意,AFAIK,简单系统调用成本的很大一部分是从用户空间到内核再到内核。因此,对于某些系统调用(可能是 gettimeofdaygetpid...) ,VDSO 甚至可以避免这种情况(并且在技术上可以避免执行真正的系统调用)。对于大多数系统调用(如 openreadsendmmap... ...) ,系统调用的内核开销很大,足以使用户空间到内核空间转换的任何改进(例如,使用 SYSENTERSYSCALL机器指令而不是 INT)变得微不足道。

  • syscall是在 x86-64上进入内核模式的默认方式。此指令在32位操作模式 在英特尔处理器上中不可用。
  • sysenter是在32位操作模式下最常用于调用系统调用的指令。它类似于 syscall,不过使用起来有点困难,但这是内核关心的问题。
  • int 0x80是调用系统调用的遗留方法,应该避免使用。

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

此外,请参阅 这个这个

在更改之前要注意这一点: 当执行0x80或 syscall 时,例如 sys _ write 为4,0x80为1,syscall 为1。

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