我研究了 Linux 内核,发现对于 x86 _ 64体系结构,中断 int 0x80不能调用系统调用 1。
int 0x80
对于 i386体系结构(32位 x86用户空间) ,哪个更可取: syscall还是 int 0x80? 为什么?
syscall
我使用 Linux 内核3.4版。
脚注1: int 0x80在某些情况下可以在64位代码中工作,但是不推荐使用
我的答案涵盖了你的问题。
实际上,最近的内核正在实现一个 VDSO,主要是为了动态优化系统调用(内核将 VDSO 设置为最适合当前处理器的代码)。因此,您应该使用 VDSO,并且对于现有的系统调用,您将更好地使用 libc 提供的接口。
注意,AFAIK,简单系统调用成本的很大一部分是从用户空间到内核再到内核。因此,对于某些系统调用(可能是 gettimeofday、 getpid...) ,VDSO 甚至可以避免这种情况(并且在技术上可以避免执行真正的系统调用)。对于大多数系统调用(如 open、 read、 send、 mmap... ...) ,系统调用的内核开销很大,足以使用户空间到内核空间转换的任何改进(例如,使用 SYSENTER或 SYSCALL机器指令而不是 INT)变得微不足道。
gettimeofday
getpid
open
read
send
mmap
SYSENTER
SYSCALL
INT
x86-64
sysenter
调用系统调用的首选方法是使用 VDSO,这是映射到每个进程地址空间的内存的一部分,它允许更有效地使用系统调用(例如,在某些情况下根本不进入内核模式)。与传统的 int 0x80方式相比,vDSO 还需要处理更多的 syscall或 sysenter指令。
此外,请参阅 这个和 这个。
在更改之前要注意这一点: 当执行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