系统调用是在用户空间进程和硬件设备之间添加一个中间层。该层作用:

  • 为用户空间提供一种硬件的抽象接口;
  • 系统调用保证了系统的稳定和安全;
  • 如果应用层可以随意访问用户空间,而内核对此一无所知的话,会造成系统异常。

    系统调用

    getpid 系统调用

    1. SYSCALL_DEFINE0(getpid)
    2. {
    3. return task_tgid_vnr(current); // returns current->tgid
    4. }
    其中SYSCALL_DEFINE0是一个宏定义,它定义一个无参数的系统调用(因此这里的数字为0),展开宏定义:
    1. asmlinkage long sys_getpid(void) {
    2. return task_tgid_vnr(current); // returns current->tgid
    3. }

    系统调用处理程序

    在Linux中,每个系统调用被赋予一个系统调用号,通过系统调用号关联系统调用。
    应用程序把相应系统调用所对应的号放入eax中,调用参数分别放在ebx, ecx, edx, esi和edi中,通过软中断通知系统,告知内核自己需要执行一个系统调用。