作者:Sandy 原创作品转载请注明出处
《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000 ”
实验环境:c+Linux64位 (32位系统可能结果会不同)
依照学术诚信条款,我保证此回答为本人原创,所有回答中引用的外部材料已经做了出处标记。
一,系统调用的内核源码
1,内核中关于系统调用的源码。
上一周的课程分析了系统调用的整体流程,本文主要是从Linux内核源码的层次来分析系统调用的执行;本文使用到的内核的源码都能够在这里查看Linux内核源码;其中系统调用分派表(dispatch table)位于文件\arch\x86\syscalls\syscall_32.tbl,该文件标志了内核的系统调用的系统调用号;而系统调用的内核源码则位于/linux-3.18.6/arch/x86/kernel/entry_32.S,该文件的内核源码是系统调用执行的主要代码,也是本文分析的重点。
2,系统调用在内核中的调用方式。
在之前的分析Linux内核启动的课程中,在\init\main.c 的start_kernel中有这样的调用:
trap_init()
当时分析过这一模块主要是对系统调用进行初始化,该函数的位置:/arch/x86/kernel/traps.c,其中有如下代码:
#ifdef CONFIG_X86_32
set_system_trap_gate(SYSCALL_VECTOR, &system_call);
set_bit(SYSCALL_VECTOR,