Syscalls
系统调用的返回值如果返回一个负数一般代表一个错误,若返回0,则代表成功(注意并不是所有)。返回错误时还会修改全局变量errno。
SYSCALL_DEFINE0(getpid)
{
return task_tgid_vnr(current);
// returns current->tgid
}
SYSCALL_DEFINE0是定义的一个宏,展开后的代码如下:
asmlinkage long sys_getpid(void)
asmlinkage是函数定义的修饰符,它告诉编译器在栈上寻找参数。系统调用在内核空间和物理空间有不同的返回值,内核中返回long,用户空间中返回int。
内核中有一个已注册的系统调用构成的表sys_call_table。赋予每个合法的系统调用一个调用号。
System Call Handler
应用程序给内核发送一个软中断的信号,引发一个异常,系统将进入内核态然后执行异常处理(系统调用处理)。x86中系统调用的中断号是0x80。而系统调用号则是通过寄存器%eax来传送的。
system_call()函数会检查系统调用的合法性,如果合法的会执行 call *sys_call_table(,%rax,8)。系统调用的参数一般通过寄存器传送,如果参数过多就使用一个指向用户空间的指针,那么储存了所有的参数。