我知道在Linux x64中“syscall”和“int 0x80”汇编程序指令在软件中生成一个中断,要求内核做一些工作。他们有不同的操作码(0F 05对CD 80),前者更快 我不清楚他们之间是否有任何关系:他们真的是独立的吗? (即:“syscall”调用“int 0x80”?) 谢谢。
答案 0 :(得分:4)
syscall
(x86-64)和sysenter
(x86-32)指令更新更快,因此在可用时使用;但保留int 0x80
机制以与旧二进制文件兼容。没有语义差异 - 无论使用哪条指令将控制转移到内核中,系统调用编号都是相同的,我认为参数也都在同一个地方。
我有一个暗淡的回忆,即只有使用int 0x80
进行少量系统调用,因为它们与堆栈相关的异常行为(clone?execve?sigreturn?)但可能不再是真。
答案 1 :(得分:1)
int 0x80
已过时(因为速度缓慢)。顺便说一下,你真的想用vdso(7)
AFAIK,两个指令都进入内核,每个指令都有一些(短)内核处理序列,最终跳转到系统调用表。
答案 2 :(得分:0)
int 0x80
是与32-bit
程序集一起使用的8086 - 80386
中断。 x86_64
在其位置使用syscall
。请参阅/usr/include/asm/unistd_32.h
和unistd_64.h
中每个期望调用各种内核函数的不同调用号的差异。