linux系统使用实验报告操作系统_Linux操作系统:系统调用处理方式

1.陷入事件的处理方式

在UNIX/Linux系统中,对异常的处理称做陷入。

引起陷入的事件可以分为两组:一组是自愿进入陷入,称做自陷,如使用系统调用和断点跟踪;另一组是由于程序运行过程中出现软、硬件故障或错误,如转换无效、访问违章和非法指令等,也称做捕俘。

陷入处理的基本过程与中断处理基本相同。当执行到陷入指令(如系统调用)或出现捕俘事件时,硬件首先做出中断响应,根据取得的中断(陷入)向量进入系统核心,即该进程由用户态转到核心态。各种陷入经过断点现场保存等简单处理后,统一进入陷入处理子程序(trap)。按照参数中给出的陷入类型及陷入时处理机状态等,trap子程序对所有陷入事件按如下4种方式分别进行处理:

(1)请求系统管理人员干预。如果发生陷入时进程处于核心态,则认为出现故障。此时,系统打印若干现场信息,然后等待系统管理员干预。

(2)按用户规定方式进行处理。在用户态方式下产生的各种陷入,除系统调用和转换无效外,一般转成信号交由用户处理。

(3)用户栈自动扩充。当用户栈装满,引起转换无效故障时,系统为该进程的用户栈增加两个页面。若操作成功,该进程继续运行;否则,向该进程发信号。

(4)系统调用处理。当执行到用户程序中的系统调用时,就对陷入按系统调用方式处理。

2.系统调用的处理方式

在UNIX/Linux系统中,系统调用像C语言的普通函数调用那样出现在程序中。但是,一般的函数调用序列并不能把进程的运行模式从用户态变为核心态,而系统调用却可以做到这一点。如果说外部中断是使CPU被动、异步地进入系统空间的一种手段,那么系统调用就是CPU主动、同步地进入系统空间的手段。因为系统调用是由用户预先安排在程序的确切位置上的。

不同版本的UNIX系统提供的系统调用的数目不同,如UNIX第7版提供约50个系统调用,SVR4提供约120个系统调用。而在Linux系统中共定义了221个系统调用。这些系统调用的外在使用形式与C语言的函数调用形式相同,但实现它们的汇编代码形式通常以trap指令开头(在Linux系统中是通过中断指令“INT 0X80”实现的)。trap指令有这样一种性质:当CPU执行到trap指令时,CPU的状态就从用户态变为核心态。

trap指令的一般格式是:

trap xx

其中,xx表示系统调用号。如,系统调用fork的编号是2,read的编号是3,write的编号是4,等等。多数系统调用带有一个或几个参数。传递参数的方式一般有两种:通过通用寄存器(如r0、r1)的直接传送和在trap指令后自带参数。Linux内核在系统调用时通过寄存器传递参数。自带参数又分为直接和间接两种形式。直接形式是参数直接跟在trap指令之后,如上面一般形式所示;间接形式是trap指令后是一个指针,该指针指向另一条直接带参数的trap指令。

当CPU执行到trap指令时,产生陷入事件。发生中断和陷入时,硬件执行的动作基本相同,即trap指令产生陷入信号,导致CPU停止对当前用户程序的继续执行;保存当前程序计数器(PC)和处理机状态字(PSW)的值;利用相应的中断向量(所有的系统调用都对应一个中断向量)转到相应的处理程序。

所有的陷入事件有一个总的服务程序,即陷入总控程序。由于系统调用只出现在用户程序中,当时CPU必定在用户空间中运行,而陷入总控程序属于内核。所以,一旦运行陷入总控程序,CPU的运行状态就从用户态转入核心态,也就是从用户空间转入系统空间。但是,在处理系统调用的整个过程中并不自动关闭中断,即中断是开放的。

首先,陷入总控程序将有关参数压入系统栈中,以备返回用户空间、恢复现场时使用。然后,调用陷入处理程序trap。trap程序根据陷入事件的不同类型做不同的处理。对于非法指令、跟踪陷入、指令故障、算术陷入、访问违章、转换无效等事件,转入信号机构进行处理;对于系统调用事件,调用system_call(系统调用处理函数)进行处理。系统调用处理函数根据trap指令后面的系统调用号去查系统调用入口表,然后转入各个具体的系统调用处理程序。

系统调用入口表sysent的项数与系统调用号一样多。每项有3个部分:自带参数个数、标志位(如果执行setjmp函数,则置为0;否则,置为1)和相应处理程序的入口地址。

6f80647afc7a76583b2663bb9f2018cf.png

当该系统调用工作完成后,就回到陷入处理程序trap。它计算有关进程的优先级。如果存在比当前进程优先级更高的就绪进程,则发生进程调度,恢复另外那个进程的现场,令其投入运行,而当前进程放入就绪队列中排队。如果本进程优先级最高,则不发生重新调度。在回到本进程的用户空间之前,要判断当前进程是否收到信号。如果收到信号,则执行信号规定的动作,最后返回用户空间,执行被中断的用户程序;如果没有收到信号,则直接回到用户空间。

3.系统调用实现过程

操作系统是一个整体,各个部分的运转不是孤立的,而是相互关联、密切配合的。下面通过一个系统调用实现的全过程,说明整个操作系统是如何动态协调工作的。为了叙述简明,对系统中的进程数目、状态、资源使用等都做了简化,所以,实际系统的活动要比示例中的情况复杂得多。另外,本示例主要是介绍系统调用的一般实现过程,其中还涉及到文件管理、设备管理等内容,在后面章节中会讲到。

设用户进程A在运行中要向已打开的文件(用fd表示)写一批数据,为此在用户C源程序中可用如下系统调用语句:

rw=write (fd,buf,count);

这条语句经编译以后形成的汇编指令形式如下:

trap 4

参数1

参数2

参数3

k1:……

其中,参数1,2,3分别对应该文件的文件描述字fd,用户信息所在内存始址buf,传送字节数count。这个系统调用的执行过程见如下7步。

(1)CPU执行到trap 4指令时,产生陷入事件,硬件做出中断响应:保留进程A的PSW和PC的值,取中断向量并放入寄存器(PSW和PC)中;程序控制转向一段核心代码,将进程状态改为核心态;进一步保留现场信息(各通用寄存器的值等),然后进入统一的处理程序trap。trap程序根据系统调用号4查找系统调用入口表,得到相应处理子程序的入口地址write。

(2)转入文件系统管理。根据文件描述字fd找到该文件的控制结构—— 活动I节点,进行权限验证等操作之后,如果都合法,则调用相应的核心程序将文件的逻辑地址映射到物理块号;再申请和分配缓冲区,将进程A内存区buf中的信息传送到所分配的缓冲区中。然后,经由内部控制结构(即块设备转接表)进入设备驱动程序。

(3)启动设备驱动程序(即磁盘驱动程序),将缓冲区中的信息写到相应的盘块上。在进行磁盘I/O工作时,进程A要等待I/O完成,所以进程A让出CPU,处于睡眠状态。

(4)处理机管理做调度工作。进程调度程序从就绪队列中选中一个合适的进程,例如B,为它恢复现场,使其在CPU上运行。此时CPU在进程B的用户空间运行。

(5)当写盘工作完成后(即缓冲区中的信息都传送到盘块上),磁盘控制器发出I/O中断信号。该信号中止进程B的继续运行,硬件做出中断响应,然后转入磁盘中断处理程序。

(6)磁盘中断处理程序运行。它验证中断来源,如传输无错,则唤醒因等待盘I/O而睡眠的进程A。

(7)设进程A比进程B的优先级更高,则中断处理完成后,执行进程调度程序,选中进程A,为进程A恢复现场,然后进程A的程序接着向下执行。

ba956ae47d4c59d54c40c29b4673b474.png

由上面分析可见,利用中断和陷入方式,CPU的运行状态就由用户态转到核心态。当中断、陷入处理完成后,再回用户态执行用户程序。如果说系统初启是激活操作系统的原动力,那么中断和陷入就是激活操作系统的第2动力。利用上述方式使操作系统程序得以执行,对系统的各种资源进行管理,为用户提供服务。

1.什么是Linux操作系统Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的UNIX工具软件、应用程序和网络协议。它支持32位和64位硬件。Linux继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。它主要用于基于Intel x86系列CPU的计算机上。这个系统是由全世界各地的成千上万的程序员设计和实现的。其目的是建立不受任何商品化软件的版权制约的、全世界都能自由使用的Unix兼容产品 !   Linux以它的高效性和灵活性著称。Linux模块化的设计结构,使得它既能在价格昂贵的工作站上运行,也能够在廉价的PC机上实现全部的Unix特性,具有多任务、多用户的能力。Linux是在GNU公共许可权限下免费获得的,是一个符合POSIX标准的操作系统Linux操作系统软件包不仅包括完整的Linux操作系统,而且还包括了文本编辑器、高级语言编译器等应用软件。它还包括带有多个窗口管理器的X-Windows图形用户界面,如同我们使用Windows NT一样,允许我们使用窗口、图标和菜单对系统进行操作。   Linux具有Unix的优点:稳定、可靠、安全,有强大的网络功能。在相关软件的支持下,可实现WWW、FTP、DNS、DHCP、E-mail等服务,还可作为路由器使用,利用ipchains/iptables可构建NAT及功能全面的防火墙。 2.Linux的目录结构
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值