我的答案here涵盖了您的问题。
我研究了Linux内核,发现对于x86_64体系结构,中断int 0x80
不适用于调用系统调用。
((编者注:并非完全正确,在某些情况下它确实有效,但从不推荐。What happens if you use the 32-bit int 0x80 Linux ABI in 64-bit code?)
对于i386体系结构(32位x86用户空间),更优选syscall
或int 0x80
,为什么?
EDIT:我使用内核3.4
syscall
是在x86-64
上进入内核模式的默认方法。该指令在32位操作模式下不可用在Intel处理器上>。sysenter
是最常用于以32位操作模式调用系统调用的指令。它类似于syscall
,虽然使用起来有点困难,但这是内核需要考虑的问题。int 0x80
是调用系统调用的传统方法,应避免使用。调用系统调用的首选方法是使用VDSO,它是映射在每个进程地址空间中的一部分内存,可以更有效地使用系统调用(例如,在某些情况下根本不进入内核模式)。与传统的int 0x80
方式相比,VDSO还可以处理syscall
或sysenter
指令。
我的答案here涵盖了您的问题。
实际上,最近的内核正在实现VDSO,特别是为了动态优化系统调用(内核将VDSO设置为最适合当前处理器的某些代码)。因此,您应该使用VDSO,对于现有的系统调用,最好使用libc提供的接口。
[注意,AFAIK是简单系统调用成本的很大一部分是从用户空间到内核再到内核。因此,对于某些系统调用(可能是gettimeofday
,getpid
...),VDSO甚至可以避免(并且从技术上讲,可以避免进行真正的系统调用)。对于大多数系统调用(例如open
,read
,send
,mmap
...。),系统调用的内核成本足够大,足以改善用户空间到内核空间的过渡(例如,使用SYSENTER
或SYSCALL
机器指令,而不是INT
)无关紧要。
更改前请注意:系统调用号不同
http://docs.cs.up.ac.za/programming/asm/derick_tut/syscalls.html表示32位或0x80http://blog.rchapman.org/post/36801038863/linux-system-call-table-for-x86-64(用于系统调用)>
int 0x80
是更好的术语,用于指示其对内核的系统调用
含义和解释是可互换的,'进行系统调用'或'问题int 80h'。
与DOS时代没有不同:
这里的共同主题是什么,当调用中断/系统调用时,内核检查寄存器的状态以查看需要哪种类型的系统调用。例如,通过查看eax
寄存器并确定要执行的操作,内部上下文切换到内核空间,执行该过程并将上下文切换回用户空间,并可以选择返回到呼叫,即成功还是失败。
我的答案here涵盖了您的问题。
更改前请注意:系统调用号不同
int 0x80
是更好的术语,用于指示其对内核的系统调用