6
votes

I know that in Linux x64 "syscall" and "int 0x80" assembler instructions generate an interrupt in software asking the kernel to do some work. They have different opcodes (0F 05 vs CD 80) and the former is faster.
It's not clear to me if there is any relationship between them: are they really independent? (i.e.: does "syscall" call "int 0x80"?) Thank you.

3
I don't know what the difference is, but both work in 64bit long mode, while only int 0x80 works in 32 bit mode, which suggests whatever the former does is not only more efficient, but would not use the same 32bit CPU features. I suspect it is related to the fact that 64bit long mode has a much simplified flat memory model (32bit is segmented).teppic
In 64-bit code, only ever use syscall. See stackoverflow.com/questions/2535989/… for details on how (and on how to use int 0x80 in 32-bit code.)Peter Cordes
int 0x80 invokes the 32-bit ABI (with its calling convention and syscall numbers) even when executed in a 64-bit process. This is never a good idea and ther's no benefit (syscall is faster). e.g. eax=1 / int 0x80 is sys_exit(), but eax=1 / syscall is sys_write(). stackoverflow.com/questions/2500362/…Peter Cordes

3 Answers

6
votes

The syscall (x86-64) and sysenter (x86-32) instructions are newer and faster, and so are used when available; but the int 0x80 mechanism is preserved for compatibility with old binaries. There is no semantic difference -- system call numbering is the same regardless of which instruction is used to transfer control into the kernel, and I think the arguments are all in the same places as well.

I have a dim recollection of there being a small number of system calls that could only be made using int 0x80 because of their unusual stack-related behavior (clone? execve? sigreturn?) but that might no longer be true.

1
votes

int 0x80 is rumored to be obsolete (since slow). BTW, you really want to use vdso(7)

AFAIK, both instructions are going inside the kernel, and each has some (short) sequence of kernel processing which ultimately jump into the syscall table.

0
votes

int 0x80 is the 32-bit interrupt used with 8086 - 80386 assembly. x86_64 uses syscall in its place. See the differences in /usr/include/asm/unistd_32.h and unistd_64.h for the different call numbers each expect to invoke the various kernel functions.