0%

Linux系统调用

系统调用

什么是系统调用

系统调用是内核提供给上层应用使用内核功能的接口,能够操纵硬件、访问各种系统资源等。

为什么需要系统调用

应用程序运行在用户态,而内核运行在内核态,如果用户态的软件直接操作硬件的话,就会存在安全问题。因此,必须通过内核提供的接口来间接操作硬件、访问各种资源等

POSIX

POSIX其实是一个标准,定义了各种所需要提供的服务。

系统调用表

系统调用表提供了所有系统服务所对应的服务的函数地址。例如,对于x86-64结构的CPU来说,系统调用表在arch/x86_64/kernel/syscall.c里。

当然了,光有系统调用表还是不够的,实际上系统调用是根据系统调用号来执行的。x86-64架构的调用号在include/asm-x86_64/unistd.h下。2.6.0内核中的系统调用仅有236个。

系统调用流程

用户态的应用并不是直接调用系统调用函数的,而是通过函数封装来调用。例如在Linux中,就提供了C语言的系统调用接口。所以大致的流程就是:

1
应用程序 -> C库函数 -> 系统调用

用户态到内核态

系统调用的执行需要从用户态到内核态的转换(因为是从应用代码到内核代码)。通过系统陷入指令,可以完成这种转换。在Linux中,系统陷入是通过软中断来实现的(int $0x80)。

通过软中断,系统会跳转到系统调用的处理程序,然后就可以访问系统调用了。