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;─┼─────────────┤► ... │ | │
| │ } │ │ ─────────────────┼─────────────────┘
| │ │ │ │ |
| └────────────────┘ └───────────────────────────┘ |
| |
-----------------------------------------------------------------------