我研究了Linux内核,发现对于x86_64
体系结构,中断int 0x80
并不像调用系统调用那样工作。
问题是:如果x86
架构更适合syscall
或int 0x80
以及为什么?
编辑:我使用内核3.4
答案 0 :(得分:70)
syscall
是在x86-64
上进入内核模式的默认方式。在Intel处理器的 32位操作模式下,此指令不可用。sysenter
是最常用于以32位操作模式调用系统调用的指令。它类似于syscall
,虽然有点难以使用,但这是内核的关注。int 0x80
是一种调用系统调用的传统方式,应该避免使用。调用系统调用的优选方法是使用VDSO,它是在每个进程地址空间中映射的内存的一部分,允许更有效地使用系统调用(例如,在某些情况下根本不进入内核模式)。与传统的int 0x80
方式相比,VDSO在处理syscall
或sysenter
指令方面也更加困难。
答案 1 :(得分:19)
我的回答here涵盖了您的问题。
实际上,最近的内核正在实现VDSO,特别是动态优化系统调用(内核将VDSO设置为最适合当前处理器的某些代码)。因此,您应该使用VDSO,并且对于现有的系统调用,您最好使用libc提供的接口。
请注意,AFAIK,简单系统调用成本的一个重要部分是从用户空间到内核并返回。因此,对于某些系统调用(可能是gettimeofday
,getpid
...),VDSO甚至可以避免(并且在技术上可能会避免执行真正的系统调用)。对于大多数系统调用(例如open
,read
,send
,mmap
....)系统调用的内核成本足够大,可以对用户进行任何改进 - 空间到内核空间转换(例如使用SYSENTER
或SYSCALL
机器指令而不是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的日子没什么不同:
这里的共同主题是,当调用中断/系统调用时,内核会检查寄存器的状态,以查看需要哪种类型的系统调用。例如,通过查看eax
寄存器,并确定要执行的操作,内部上下文切换到内核空间,执行过程和上下文切换回用户空间,并返回结果返回选项电话会议,即成功还是失败。