LINUX系统调用的exit实例分析.doc
文本预览下载声明
LINUX系统调用及exit实例分析
计算机系962班 黄山松 9615158
序言: 计算机操作系统课程即将结束, 经过这一学期的学习,我对操作系统 , 尤其是Linux系统有了初步认识 ,虽然限于英语水平, 对外籍参考书较少涉及, 但也深有收获. 特别是分析系统调用的源码 , 揭开了系统核心的神密的面纱.
Linux系统的结构
在清华大学出版的操作系统基础 (屠立德.屠祁 编著) 曾经见过这样一幅 Unix 结构图,我觉得对 Linux 同样适用, 经少量改动, 示意如下:
裸机
汇编子程序
全局变量
进程管理(包括对换进程)
存贮管理
文件管理
IO中断
设备管理与
163个系统调用命令
应用程序包子程序
Shell 命令解释程序
用户一
用户二
用户三
:::::::::::::::::::::::: 例图 Linux 系统的结构
Linux 系统 由内核和用户层组成. 内核是Linux 系统的心脏. 由汇编文件和C 语言文件构成. 汇编文件主要用于系统初启 . 中断处理等与硬件细节密切相关的部分, 此处本文不作详解 . 内核按以下功能分块:
存贮管理
进程管理
进程通信
中断 .陷阱 与系统调用 ( 此处陷阱仅狭义为异常 )
输入输出管理
文件系统
由例图及上面的分类 , 我们至少知道了为什么要有系统调用 . 用最简单的话来说 , 系统调用就是硬件与软件的接口. 或者说 内核与外壳的接口.
实际上, Linux 的系统核心的所有程序都是作为进程的一部分而运行的,被包括在每一个进程的虚拟地址空间里, so 每一个进程都包含着两个部分: 系统程序部分和用户程序部分. 一进程在用户态运行时, 执行的是用户程序;若中断而转入核心态, 执行系统核心程序.
下面就让我们进入
系统调用的流程
大致流程如下:
start_kernel ( ) 函数 ( i386/main.c )
trap_init ( ) 函数 ( kernel/trap.c )
宏 set_grap_gate ( ) 函数 ( asm/system.h )
start_kernel ( ) 提供了各种 trap 入口 . 通过调用 trap_init ( ) 函数 设置, 而 trap_init ( ) 又通过调用 set_ system_gate( 0x80,system_call ) 实现具体操作.
在 Linux 系统调用中, 首先由0x80 号中断进入系统调用入口, 通过系统调用表保存系统调用服务函数的入口地址来实现,那好就从中断开始吧.
1.1关于中断
在386体系结构中,承认两类事件。
异常(exceptions)
中断(interrupts)
他们都会引起“ 上下文转换 ” ,(context switch) 同时建立一个过程 (procedure)或任务(task)
中断可以随时随地发生(包括在执行程序时)所以用来响应硬件信号。
而异常则由指令内部错误引起。
在80386中,又把中断分为两种:
可屏蔽中断(Miscible Interrupt) 如 IO 中断 等
不可屏蔽中断(NonMaskable Interrupt)如 机器内部故障 . 掉电中断 等
异常也分为两种:
处理器异常 如overflow 等
编程(调试)异常 如 trap 指令 或 INT 中断指令 等
0x80 号中断的设置
在Linux中,系统调用的执行是通过中断或异常的方式来进行的,他将
执行相应的机器代码指令,来产生中断或异
显示全部