Syscall#
From [The Linux Programming Interface]

https://cs61.seas.harvard.edu/site/2021/Kernel/
https://www.juliensobczak.com/inspect/2021/08/10/linux-system-calls-under-the-hood.html
[TCP IP Architecture Design - Sameer Seth]
Figure 1.10. System call implementation on Linux.
Calling Conventions#
https://chromium.googlesource.com/chromiumos/docs/+/master/constants/syscalls.md
arch |
syscall NR |
return |
arg0 |
arg1 |
arg2 |
arg3 |
arg4 |
arg5 |
|---|---|---|---|---|---|---|---|---|
arm |
r7 |
r0 |
r0 |
r1 |
r2 |
r3 |
r4 |
r5 |
arm64 |
x8 |
x0 |
x0 |
x1 |
x2 |
x3 |
x4 |
x5 |
x86 |
eax |
eax |
ebx |
ecx |
edx |
esi |
edi |
ebp |
x86_64 |
rax |
rax |
rdi |
rsi |
rdx |
r10 |
r8 |
r9 |
syscall instruction#
https://blog.packagecloud.io/the-definitive-guide-to-linux-system-calls/
legacy system calls: interrupt based#
32/64 bit:
int $0x80
Fast system calls#
64 bit:
On 32bit systems use:
sysenterandsysexit.On 64bit systems use:
syscallandsysret.
A hardware interrupt is raised by a hardware device to notify the kernel that a particular event has occurred. A common example of this type of interrupt is an interrupt generated when a NIC receives a packet.
A software interrupt is raised by executing a piece of code. On x86-64 systems, a software interrupt can be raised by executing the int instruction.
ASM e.g#
32bit ASM e.g#
No e.g
64bit ASM e.g#
First, we need to find the system call number for exit. In this case we need to read the table found in arch/x86/syscalls/syscall_64.tbl:
60 common exit sys_exit
The exit syscall is number 60. According to the interface described above, we just need to move 60 into the rax register and the first argument (the exit status) into rdi.
int
main(int argc, char *argv[])
{
unsigned long syscall_nr = 60;
long exit_status = 42;
asm ("movq %0, %%rax\n"
"movq %1, %%rdi\n"
"syscall"
: /* output parameters, we aren't outputting anything, no none */
/* (none) */
: /* input parameters mapped to %0 and %1, repsectively */
"m" (syscall_nr), "m" (exit_status)
: /* registers that we are "clobbering", unneeded since we are calling exit */
"rax", "rdi");
}
Ref#
http://blog.rchapman.org/posts/Linux_System_Call_Table_for_x86_64/
https://man7.org/linux/man-pages/man2/syscall.2.html
https://man7.org/linux/man-pages/man2/syscalls.2.html
https://blog.packagecloud.io/the-definitive-guide-to-linux-system-calls/
https://gitlab.com/x86-psABIs/x86-64-ABI
https://refspecs.linuxfoundation.org/elf/x86_64-abi-0.99.pdf
https://www.juliensobczak.com/inspect/2021/08/10/linux-system-calls-under-the-hood.html
https://sys.readthedocs.io/en/latest/doc/06_setting_up_arguements.html
https://sys.readthedocs.io/en/latest/doc/06_setting_up_arguements.html#walk-through-open-system-call-in-glibc

