C语言#Linux-- C语言执行系统调用(system call)的具体流程

参考书籍: 3.1节
书籍信息:《The Linux Programming Interface》
作者:Michael Kerrisk 时间:2010

流程:

  • 1、应用程序调用C库,其封装的一个系统调用
  • 2、封装函数,进行陷入处理的流程,传参,调用陷入指令(int 0x80)。。。。。略
  • 3、为了响应,内核激发一个系统调用流程(在一个汇编文件里。)。。
|------------------------- User Mode --------------------------------|
|                                                                    |
|          Application                  glibc wrapper function       |
|           program                        (sysdeps/unix/            |
|                                         sysv/linux/execve.c)       |
|                                                                    |
|                                                                    |
|                                                                    |
|                                   ┌─────────────────────────────┐  |
|                              ┌────┤►execve(path, argv, envp)|
|                              │    │ {|
|      ┌───────────────────┐   │    │                             │  |    switch to
|...              │   │    │  ...|    kernel mode
|execve(path, ────┼───┘    │  int 0x80 ──────────────────┼──|──────┐
|      │      argv, envp); │        │   (arguments:__NR_execve,||...  ◄───────────┼───┐    │            path, argv, envp)||      │                   │   │    │  ...      ◄─────────────────┼─────────┼───────┐
|      └───────────────────┘   └────┼──return;|      │       │
|}|      │       │
|                                   └─────────────────────────────┘  |      │       │
----------------------------------------------------------------------      │       │
                                                                            │       │
|--------------------- Kernel   Mode-----------------------------------|    │       │
|                                                                      |    │       │switch to
|                                                                      |    │       │user mode
|          System Call                      Trap handler               |    │       │
|         service routine                                              |    │       │
|         (arch/x86/kernel/            (arch/x86/kernel/entry_32.S)    |    │       │
|            process_32.c)                                             |    │       │
|                                                                      |    │       │
|                                                                      |    │       │
|      ┌────────────────┐             ┌───────────────────────────┐    |    │       │
|sys_execve() ◄─┼─────┐       │ system_call:  ◄───────────┼─────────┘       │
|{              │     │       │                           │    ||      │                │     │       │  ...||      │                │     │       │                           │    ||...           │     └───────┼──call sys_call_table      │    ||      │                │             │        [__NR_execve]||return error;─┼─────────────┤► ...||}              │             │          ─────────────────┼─────────────────┘
|      │                │             │                           │    |
|      └────────────────┘             └───────────────────────────┘    |
|                                                                      |
-----------------------------------------------------------------------