【发布时间】:2015-06-09 00:25:55
【问题描述】:
我知道在 Linux x64 中,“syscall”和“int 0x80”汇编指令会在软件中产生一个中断,要求内核做一些工作。它们有不同的操作码(0F 05 vs CD 80),前者更快。
我不清楚他们之间是否有任何关系:他们真的独立吗? (即:“系统调用”是否调用“int 0x80”?)
谢谢。
【问题讨论】:
-
我不知道有什么区别,但是两者都在 64 位长模式下工作,而只有 int 0x80 在 32 位模式下工作,这表明无论前者做什么不仅效率更高,而且不使用相同的 32 位 CPU 功能。我怀疑这与 64 位长模式具有非常简化的平面内存模型(32 位是分段的)这一事实有关。
-
在 64 位代码中,只能使用
syscall。有关如何(以及如何在 32 位代码中使用int 0x80)的详细信息,请参阅 stackoverflow.com/questions/2535989/…。 -
int 0x80即使在 64 位进程中执行时也会调用 32 位 ABI(及其调用约定和系统调用号)。这绝不是一个好主意,也没有任何好处(syscall更快)。例如eax=1/int 0x80是 sys_exit(),但eax=1/syscall是 sys_write()。 stackoverflow.com/questions/2500362/…
标签: linux system-calls