Syscalls:
SYSCALL_DEFINE0(getpid)
{
return task_tgid_vnr(current); // returns current->tgid
}
SYSCALL_DEFINE0 is simply a macro that defines a system call with no parameters (hence the 0).The expanded code looks like this:
asmlinkage long sys_getpid(void)
System Call Numbers
The kernel keeps a list of all registered system calls in the system call table, stored in sys_call_table.This table is architecture; on x86-64 it is defined in arch/i386/kernel/syscall_64.c.
System Call Handler
The defined software interrupt on x86 is interrupt number 128, which is incurred via the int $0x80 instruction. It triggers a switch to kernel mode and the execution of exception vector 128, which is the system call handler.
Denoting the Correct System Call
On x86, the syscall number is fed to the kernel via the eax register.Parameter Passing
System Call Implementation
- Implementing System Calls
- Verifying the Parameters
- System Call Context
- Final Steps in Binding a System Call
This can be as simple as putting the system call in a relevant file in kernel/, such as sys.c