系统调用是在用户空间进程和硬件设备之间添加一个中间层。该层作用:
- 为用户空间提供一种硬件的抽象接口;
- 系统调用保证了系统的稳定和安全;
- 如果应用层可以随意访问用户空间,而内核对此一无所知的话,会造成系统异常。
系统调用
getpid 系统调用
其中SYSCALL_DEFINE0是一个宏定义,它定义一个无参数的系统调用(因此这里的数字为0),展开宏定义:SYSCALL_DEFINE0(getpid)
{
return task_tgid_vnr(current); // returns current->tgid
}
asmlinkage long sys_getpid(void) {
return task_tgid_vnr(current); // returns current->tgid
}
系统调用处理程序
在Linux中,每个系统调用被赋予一个系统调用号,通过系统调用号关联系统调用。
应用程序把相应系统调用所对应的号放入eax中,调用参数分别放在ebx, ecx, edx, esi和edi中,通过软中断通知系统,告知内核自己需要执行一个系统调用。