内核版本:Linux-4.19
操作系统通过系统调用为运行于其上的进程提供服务。
那么,在应用程序内,调用一个系统调用的流程是怎样的呢?
我们以一个假设的系统调用 xyz() 为例,介绍一次系统调用的所有环节。
说明:
如上图所示,系统调用执行的流程如下:
1. 应用程序代码调用 xyz(),该函数是一个包装系统调用的库函数;
2. 库函数 xyz() 负责准备向内核传递的参数,并触发软中断以切换到内核;
3. CPU 被软中断打断后,执行中断处理函数,即系统调用处理函数(system_call);
4. 系统调用处理函数调用系统调用服务例程(sys_xyz ),真正开始处理该系统调用。
系统调用的实现来自于Glibc,几乎所有 C 程序都要调用 Glibc 的动态链接库 libc.so 中的库函数。这些库函数的源码是不可见的,可通过 objdump 或 gdb 等工具对代码进行汇编反编译,摸清大体的过程。