LINUX 中断与系统调用实现机制及 fork 实例分析 1.Linux系统调用概述 1.1 系统调用的作用 系统调用(sy stem_call)是操作系统中必不可少的一个组成部分,系统调用命令是操作系统为满足用户所需的功能和保证程序的正常运转事先编制好的具有特定功能的例行子程序。在高级语言如 C 中,常以函数的形式出现。它们使得编程人员不需要太多了解系统就能完成复杂的编程。例如,在程序中安排一条创建进程的系统调用,则 OS 便会为之创建一个新的进程。它一般运行在核心态;可通过中断进入,返回时通常需要重新调度。 系统调用是用户程序和内核交互的接口。如果没有系统调用,那么应用程序就失去了内核的支持。 提到内核态及用户态,就顺便介绍下LINUX的内核保护机制。 1.2 内核保护机制 Linux系统在 CPU的保护模式下提供了四个特权级别,目前内核都只用到了其中的两个特权级别,分别为“特权级 0”和“特权级 3”,级别0也就是通常所讲的内核模式,级别3即用户模式。划分这两个级别主要是对系统提供保护。内核模式可以执行一些特权指令和进入用户模式,而用户模式则不能。 内核模式与用户模式分别使用各自的堆栈,当发生模式切换的时候同时要进行堆栈的切换。每个进程都有自己的地址空间(也称为进程空间),进程的地址空间也分为两部分:用户空间和系统空间,在用户模式下只能访问进程的用户空间,在内核模式下则可以访问进程的全部地址空间,这个地址空间里的地址是一个逻辑地址,通过系统段面式的管理机制,访问的实际内存要做二级地址转换,即:逻辑地址 -> 线性地址 -> 物理地址。 系统调用对于内核来说就相当于函数,关键问题就是从用户模式到内核模式的转换、堆栈的切换以及参数的传递。 下文将详细分析 linux系统调用的流程,并且以产生进程的系统调用(fork)为例加以了说明。 2. Linux系统调用实现机制 2.1 系统调用与中断机制之间的关系 系统调用本身也是由若干条指令构成的过程。但它与一般的过程不一样,主要区别是:系统调用是运行在系统态(kernel mode),而一般过程是运行在用户态(user mode),它必须通过中断进入 OS系统态(在 linux中,是通过中断 int 0x80h进入 OS态),再由该中断的处理函数来具体决定对不同的系统调用的具体处理。即 linux系统是通过中断处理来实现系统调用的。 在 Intel X86 芯片上运行的 Linu x 中断机制简述如下: 1.在 Linux 中中断可以分为两类: 软中断(也可称其为异常)和硬...