2024年4月29日发(作者:)

Linux系统调用分析

计算机962班 周从余

一. 与系统调用有关的一些基本知识

1.

系统调用的定义

在OS的核心中都设置了一组用于实现各种系统共能的子程序,并将它们提供

给用户程序调用.每当用户在程序中需要OS提供某种服务时,便可利用一条系统

调用命令,去调用所需的系统过程.所以说系统调用在本质上是一种过程调用.系统

调用是进程和操作系统之间的接口,这些调用一般就是一些汇编指令集,在Linux

系统中这些调用是用C语言和汇编编写的。用户只有通过这些系统调用才能使

用操作系统提供的一些功能.

2.

系统调用与过程调用的区别

过程调用调用的是用户程序,它运行在用户态;其被调用过程是系统过程,运行在系

统态下.

系统调用是通过软中断机制进入OS核心,经过核心分析后,才能转向响应的命令

处理程序.系统调用返回时通常需要重新调度.系统调用允许嵌套调用.

3.

中断与异常

中断(interrupt)是由外部事件的,可以随时随地发生(包括在执行程序时)所以

用来响应硬件信号。在80386中,又把中断分为两种:

可屏蔽中断(Miscible Interrupt) MI

不可屏蔽中断(NonMaskable Interrupt) NMI

异常(exception)是响应某些系统错误引起的,也可以是响应某些可以在程序中

执行的特殊机器指令引起的. 异常也分为两种:

处理器异常,(指令内部异常 如overflow 等)

编程(调试)异常(debugger)

每一个异常或中断都有一个唯一的标识符,在linux文献中被称为向量。指令内 部

异常和NMI(不可屏蔽中断)的中断向量的范围从0—31。32-255的任何向量都 可

以用做

可屏蔽中断

编程(调试)异常

至于可屏蔽中断则取决于该系统的硬件配置。外部中断控制器(External interrupt

controler)在中断响应周期(interrtupt acknowledge cycle)把中断向量放到总线上。

中断和异常的优先级:

最高

:除调试错误以外的所有错误

最低

: INTR中断。

中断指令INTO,INTn,INT3

当前指令的调试中断

下一指令的调试中断

不可屏蔽中断

386

提供的功能

Intel386认识两种事件类:异常与中断。两者都会强制性创建一个进程或任务。

中断能在任何不可预料的时间发生,来响应硬件的信号.386能辨认两种中断来源

可屏蔽中断和不可屏蔽中断.并能辨认两种异常来源:处理器检测异常和程序异常

每一个中断和异常都有一个号码,都对应着一个相应的矢量地址,不可屏蔽中断

和处理器检测异常都已经被安排在0到31的矢量表中了,可屏蔽中断的矢量地

址由硬件决定,外部中断控制器在中断认可时钟周期时将矢量地址放到总线上。

任何在32到255范围内的矢量,都可以作为可屏蔽中断和程序异常用。以下是所

有可能的中断和异常的列表:

0 Divide error

1 Debug exception

3 NMI interrupt

4 INTO-detected overflow

5 Bound range exceeded

6 Invalid opcode

7 coprocessor not available

8 double fault

9 coprocessor segment overrun

10 invalid task state segment

11 segment not present

12 stack fault

13 general protection

14 page fault

15 reserved

16 coprocessor error

17-31 reserved

32-255 maskable interrupt

二. Linux系统调用的流程

系统调用的简单流程

通常,在OS的核心中都设置了一组用于实现各种系统功能的子程序(过程),

并将它们提供给用户调用。每当用户在程序中需要OS提供某种服务时,变可利用

一条系统调用命令,去调用系统过程。它一般运行在系统态;通过中断进入;返回

时通常需要重新调度(因此不一定直接返回到调用过程)。

Linux系统调用的流程非常简单,它由0x80号中断进入系统调用入口,通过使

用系统调用表保存系统调用服务函数的入口地址来实现.