操作系统接口
9.1 用 户 接 口
9.1.1 字符显示式联机用户接口
不同的OS,其联机用户接口是不同的,即它们的命令形式和用法各不相同,甚至在同一系统中,命令的不同形式构成了不同的用户界面,一般可分为字符显示式联机用户接口和图形化联机用户接口两类。
1. 命令行方式
该方式是以行为单位,输入和显示不同的命令。每行长度一般不超过256个字符,一般情况下,以回车符作为一个命令的结束标记。通常,命令的执行采用的是间断式的串行执行方式,即后一个命令的输入一般需等到前一个命令执行结束,如用户键入的一条命令处理完成后系统发出新的命令输入提示符,用户才可以继续输入下一条命令。
2. 批命令方式
在操作命令的实际使用过程中,经常遇到需要对多条命令的连续使用、或对若干条命令的重复使用、或对不同命令进行选择性使用的情况,如果用户每次都采用命令行方式将命令一条条由键盘输入,既浪费时间,又容易出错。因此,操作系统都支持一种称为批命令的特别命令方式,允许用户预先把一系列命令组织在一种称为批命令文件的文件中,一次建立,多次执行。使用这种方式可减少用户输入命令的次数,既节省了时间,减少了出错概率,又方便了用户。
9.1.2 图形化联机用户接口
1. 图形用户接口GUI(Graphics User Interface)的引入
虽然用户可以通过命令行方式和批命令方式,取得操作系统的服务,并控制自己的作业运行,但却要牢记各种命令的动词和参数,必须严格按规定的格式输入命令,而且不同操作系统所提供的命令语言的词法、语法、语义及表达形式是不一样的,这样既不方便又花费时间。于是,图形化用户接口GUI(Graphics User Interface)便应运而生。
2. 使用WIMP技术
GUI采用了图形化的操作界面,使用WIMP 技术,该技术将窗口(Window)、图标(Icon)、菜单(Menu)、鼠标(Pointing device)和面向对象技术等集成在一起,引入形象的各种图标,将系统的各项功能、各种应用程序和文件直观、逼真地表示出来,形成一个图文并茂的视窗操作环境。
3. Windows的GUI简介
以Microsoft公司的Windows 操作系统为例,在系统初始化后,OS为终端用户生成了一个运行explorer.exe的进程,它运行一个具有窗口界面的命令解释程序,该窗口是一个特殊的窗口,即桌面。
9.1.3 联机命令的类型
1. 系统访问类
在多用户系统中,为了保证系统的安全性,都毫无例外地设置注册命令Login。凡要在多用户系统的终端上上机的用户,都必须先在系统管理员处获得一合法的注册名和口令。以后,每当用户在接通其所用终端的电源后,便由系统直接调用,并在屏幕上显示出以下的注册命令:
Login: /提示用户键入自己的注册名
当用户键入正确的注册名并按下回车键后,屏幕上又会出现:
Password: /提示用户键入自己的口令
2. 文件操作命令
(1) 显示文件命令type,用于将指定文件内容显示在屏幕上。
(2) 拷贝文件命令copy,用于实现文件的拷贝。
(3) 文件比较命令comp,该命令用于对两个指定文件进行比较,两文件可以在同一个或不同的驱动器上。
(4) 重新命名命令Rename,该命令用于将以第一参数命名的文件改成用第二参数给定的名字。
(5) 删除文件命令erase,该命令用于删除一个或一组文件,例如,当参数路径名为*.BAK时,表示删除指定目录下的所有其扩展名为 .Bak的文件。
3. 目录操作命令
(1) 建立子目录命令mkdir,用于建立指定名字的新目录。
(2) 显示目录命令dir,显示指定磁盘中的目录项。
(3) 删除子目录命令rmdir,用于删除指定的子目录文件,但不能删除普通文件,而且一次只能删除一个空目录(其中仅含“.”和“..”两个文件),不能删除根及当前目录。
(4) 显示目录结构命令tree,显示指定盘上的所有目录路径及其层次关系。
(5) 改变当前目录命令chdir,将当前目录改变为由路径名参数给定的目录。用“..”作参数时,表示应返回到上一级目录下。
4. 其它命令
(1) 输入输出重定向命令。
(2) 管道连接。
(3) 过滤命令。
(4) 批命令。
9.2 Shell 命令语言
9.2.1 简单命令简介
在Shell命令语言中提供了许多不同形式的命令,并允许在一条命令行中有多个命令。如果在一条命令行中仅有一个命令,就把它称为简单命令。实际上,一条简单命令便是一个能完成某种功能的目标程序的名字。
1. 简单命令的格式
简单命令的格式比较*,包括命令名字符的个数及用于分隔命令名、选项、各参数间的空格数等,都是任意的。在UNIX和Linux系统中都规定,命令由小写字母构成,命令可带有参数表,用于给出执行命令时的附加信息,每个参数是一个单词。命令名与参数表之间还可使用一种称为选项的自变量,用减号开始,后跟一个或多个字母、数字。一条命令可有多个选项,用于改变命令执行动作的类型。
2. 简单命令的分类
在Linux或UNIX系统中,一般把简单命令分为两类:
(1) 系统提供的标准命令,包括调用各种语言处理程序、实用程序等,其数量随系统版本的不同而有所差异,系统管理员可以增添新的系统标准命令。
(2) 用户自定义的命令。系统管理员和用户自行定义的命令的执行方式与系统标准命令的执行方式相同。
对于简单命令,还可根据命令是否包含在Shell内部,即是否常驻内存,而分为内部命令和外部命令两类:
(1) 内部命令。Shell中少数标准命令,如改变工作目录命令cd等,是包含在Shell内部的,作为内部命令常驻内存。
(2) 外部命令。Shell中大多数的命令如拷贝命令cp和移动命令rm等,均保存于外存(盘)上,即每个命令是存在于文件系统中某个目录下的单独程序。这样做的好处在于,可以很大程度地节省内存空间。
3. Shell的种类
现在流行的Shell有多种类型,下面简单介绍几种流行的Shell:
(1) ourne Shell。
(2) Shell。C Shell是一种比B Shell更适于编程的Shell,是标准BSD(Berkeley System Distribution)命令解释。
(3) Korn Shell。Korn Shell集合了C Shell和B Shell的优点,并且和B Shell完全兼容,它的名字是K Sh。
9.2.2 简单命令的类型
根据简单命令功能的不同,可将它们分成如下五大类:
1. 进入与退出系统
(1) 进入系统,也称为注册。
(2) 退出系统。
2. 文件操作命令
(1) 显示文件内容命令cat。
(2) 复制文件副本的命令cp。
(3) 对已有文件改名的命令mv。
(4) 撤消文件的命令rm。
(5) 确定文件类型的命令file。
3. 目录操作命令
(1) 建立目录的命令mkdir(简称md)。
(2) 撤消目录的命令rmdir(简称rd)。
(3) 改变工作目录的命令cd。
4. 系统询问命令
(1) 访问当前日期和时间命令date。
(2) 询问系统当前用户的命令who。
(3) 显示当前目录路径名的命令pwd。
9.2.3 重定向与管道命令
1. 重定向命令
在Linux系统中,由系统定义了三个文件。其中,有两个分别称为标准输入和标准输出的文件,各对应于终端键盘输入和终端屏幕输出。它们是在用户注册时,由Login程序打开的。这样,在用户程序执行时,隐含的标准输入是键盘输入,标准输出即屏幕(输出)显示。但用户程序中可能不要求从键盘输入,而是从某个指定文件上读取信息供程序使用;同样,用户可能希望把程序执行时所产生的结果数据写到某个指定文件中而非屏幕上。
2. 管道命令
人们又进一步把重定向思想加以扩充,用符号“|”来连接两条命令,使其前一条命令的输出作为后一条命令的输入。
9.2.4 通信命令
1. 信箱通信命令mail
信箱通信是作为在UNIX的各用户之间进行非交互式通信的工具。发信者把要发送的消息写成信件,“邮寄”到对方的信箱中。
2. 对话通信命令write
用这条命令可以使用户与当前在系统中的其他用户直接进行联机通信。
3. 允许或拒绝接收消息的mesg命令
其格式为:
mesg[-n][-y]
9.2.5 后台命令
有些命令需要执行很长的时间,这样,当用户键入该命令后,便会发现自己已无事可做,要一直等到该命令执行完毕,方可再键入下一条命令。这时用户自然会想到应该利用这段时间去做些别的事。UNIX系统提供了这种机制,用户可以在这种命令后面再加上“&”号,以告诉Shell将该命令放在后台执行,以便用户能在前台继续键入其它命令,完成其它工作。
9.3 联机命令接口的实现
9.3.1 键盘终端处理程序
在微机或终端上所配置的键盘终端处理程序应具有下述几方面的功能:① 接收用户从终端上打入的字符;② 字符缓冲,用于暂存所接收的字符;③ 回送显示;④ 屏幕编辑;⑤ 特殊字符处理。
1. 字符接收功能
为了实现人机交互,键盘终端处理程序必须能够接收从终端输入的字符,并将之传送给用户程序。有两种方式可实现字符接收功能:
(1) 面向字符方式。
(2) 面向行方式。
2. 字符缓冲功能
为了能暂存从终端键入的字符,以降低中断处理器的频率,在终端处理程序中,还必须具有字符缓冲功能。字符缓冲可采用以下两种方式之一:
(1) 专用缓冲方式。
(2) 公用缓冲方式。
图9-1 两种缓冲方式
3. 回送显示
回送显示(回显)是指每当用户从键盘输入一个字符后,终端处理程序便将该字符送往屏幕显示。有些终端的回显由硬件实现,其速度较快,但往往会引起麻烦。如当用户键入口令时,为防止口令被盗用,显然不该有回显。此外,用硬件实现回显也缺乏灵活性,因而近年来多改用软件来实现回显,这样可以做到在用户需要时才回显。
4. 屏幕编辑
用户经常希望能对从键盘打入的数据(字符)进行修改,如删除(插入)一个或多个字符。为此,在终端处理程序中,还应能实现屏幕编辑功能,包括能提供若干个编辑键。常用的编辑键有:
(1) 删除字符键。
(2) 删除一行键。
(3) 插入键。
(4) 移动光标键。
(5) 屏幕上卷或下移键等。
5. 特殊字符处理
终端处理程序必须能对若干特殊字符进行及时处理,这些字符是:
(1) 中断字符。
(2) 停止上卷字符。
(3) 恢复上卷字符。
9.3.2 MS-DOS解释程序
1. 命令解释程序的作用
在联机操作方式下,终端处理程序把用户键入的信息送键盘缓冲区中保存。一旦用户键入回车符,便立即把控制权交给命令解释程序。显然,对于不同的命令,应有能完成特定功能的命令处理程序与之对应。可见,命令解释程序的主要作用是在屏幕上给出提示符,请用户键入命令,然后读入该命令,识别命令,再转到相应命令处理程序的入口地址,把控制权交给该处理程序去执行,并将处理结果送屏幕上显示。若用户键入的命令有错,而命令解释程序未能予以识别,或在执行中间出现问题时,则应显示出某一出错信息。
2. 命令解释程序的组成
MS-DOS是1981年由Microsoft公司开发的、 配置在微机上的OS。随着微机的发展,MS-DOS的版本也在不断升级,由开始时的1.0版本升级到1994年的6.X版本。在此期间,它已是事实上的16位微机OS的标准。我们以MS-DOS操作系统中的COMMAND.COM处理程序为例来说明命令解释程序的组成。它包括以下三部分:
(1) 常驻部分。
(2) 初始化部分。
(3) 暂存部分。
3. 命令解释程序的工作流程
系统在接通电源或复位后,初始化部分获得控制权,对整个系统完成初始化工作,并自动执行AUTOEXEC.BAT文件,之后便把控制权交给暂存部分。暂存部分首先读入键盘缓冲区中的命令,判别其文件名、扩展名及驱动器名是否正确。若发现有错,在给出出错信息后返回;若无错,再识别该命令。
图9-2 COMMAND.COM的工作流程
9.3.3 Shell解释程序
1. Shell命令的特点
前面我们介绍了MS-DOS的命令解释程序,它非常简单。而Shell命令解释程序就复杂得多,这主要是因为Shell命令的类型多而复杂所致。主要表现如下:
(1) 一条命令行中含有多个命令。
(2) 具有不同的分隔符。
2. 二叉树结构的命令行树
1) 命令表型结点
Shell命令解释程序按命令行语句的结构顺序进行检查,每当遇到“;”及“&”分隔符时便为之建立一个命令表型结点,将分隔符左面部分构成该结点的左子树,右面部分构成右子树。例如下面的命令行所构成的命令树如图9-3所示:
Command 1;Command 2;& Command 3
图9-3 命令表型结点及其左、右子树
2) 管道文件型结点
当Shell命令解释程序遇到管道算符“Ι”时,先为之建立一个管道文件型结点,再将分隔符左面部分构成该结点的左子树,右面部分构成右子树。例如对下面的命令行所构成的命令树如图9-4所示:
Command 1 Ι Command 2 Ι Command 3
图9-4 管道文件型结点及其左、右子树
3) 简单命令型结点
对于简单命令,在命令行中仅有一条命令,它是属于可以立即执行的命令,系统无需为它建立二叉树结构的命令行树。当命令解释程序读入键盘缓冲区中的命令后,若判定它是简单命令,再进一步确定是否是内部命令。
3. Linux命令解释程序的工作流程
在Linux系统中,系统初启后,内核为每个终端用户建立一个进程,去执行Shell解释程序。
图9-5 Shell基本执行过程及父子进程之间的关系
9.4 系统调用的概念和类型
9.4.1 系统调用的基本概念
在计算机系统中,通常运行着两类程序:系统程序和应用程序。为了防止应用程序对OS的破坏,应用程序和OS的内核是运行在不同的状态,即OS的内核是运行在系统态,而应用程序是运行在用户态。
1. 系统态和用户态
如在2.3.1小节中所述,在计算机系统中设置了两种状态:系统态(或称为核心态)和用户态。在实际运行过程中,处理机会在系统态和用户态间切换。相应地,现代多数OS将CPU的指令集分为特权指令和非特权指令两类。
(1) 特权指令。
(2) 非特权指令。
2. 系统调用
在OS中提供系统调用的目的,是使应用程序可以通过它间接调用OS中的相关过程,取得相应的服务。系统调用在本质上是应用程序请求OS内核完成某功能时的一种过程调用,但它是一种特殊的过程调用,它与一般的过程调用有下述几方面的明显差别:
(1) 运行在不同的系统状态。
(2) 状态的转换。
(3) 返回问题。
(4) 嵌套调用。
图9-6 系统功能的调用
3. 中断机制
系统调用是通过中断机制实现的,并且一个操作系统的所有系统调用,都通过同一个中断入口来实现。如MS-DOS提供了INT 21H,应用程序通过该中断获取操作系统的服务。
9.4.2 系统调用的类型
1. 进程控制类系统调用
主要用于对进程控制的系统调用有:
(1) 创建和终止进程的系统调用。
(2) 获得和设置进程属性的系统调用。
(3) 等待某事件出现的系统调用。
2. 文件操纵类系统调用
对文件进行操纵的主要系统调用如下:
(1) 创建和删除文件。
(2) 打开和关闭文件的系统调用。
(3) 读和写文件的系统调用。
3. 进程通信类系统调用
在单处理机系统中,OS经常采用消息传递方式和共享存储区方式。当采用消息传递方式时,在通信前需先打开一个连接。为此,应由源进程发出一条打开连接的系统调用,而目标进程则应利用接受连接的系统调用表示同意进行通信;然后,在源和目标进程之间便可开始通信。可以利用发送消息的系统调用或者用接收消息的系统调用来交换信息。通信结束后,还须再利用关闭连接的系统调用结束通信。
9.4.3 POSIX标准
目前许多操作系统都提供了上面所介绍的各种类型的系统调用,实现的功能也相类似,但在实现的细节和形式方面却相差很大,这种差异给实现应用程序与操作系统平台的无关性带来了很大的困难。为解决这一问题,国际标准化组织ISO给出的有关系统调用的国际标准POSIX1003.1(Portable Operating System IX),也称为“基于UNIX的可移植操作系统接口”。
图9-7 UNIX/Linux系统程序、库函数、系统调用的分层关系
9.5 UNIX系统调用
9.5.1 进程控制
该类系统调用包括创建进程的系统调用fork、终止进程的系统调用exit、等待子进程结束的系统调用wait等十多条。
1. 进程的创建和终止
(1) 创建进程(fork)。
(2) 终止进程(exit)。
2. 改变进程映像和等待
(1) 执行一个文件(exec)。
(2) 等待子进程结束(wait)。
3. 其它进程调用
(1) 获得进程ID。
(2) 获得用户ID。
(3) 进程暂停(pause)。
9.5.2 文件操纵
用于对文件进行操纵的系统调用是数量最多的一类系统调用,其中包括创建文件、 打开文件、关闭文件、读文件及写文件等二十多条。
1. 文件的创建和删除
(1) 创建文件(creat)。
(2) 删除文件。
2. 文件的打开和关闭
(1) 打开文件(open)。
(2) 关闭文件(close)。
3. 文件的读和写
读和写文件的系统调用是read和write。仅当用户利用open打开指定文件后,方可调用read或write对文件执行读或写操作。两个系统调用都要求用户提供三个输入参数:① 文件描述符fd。② buf缓冲区首址。对读而言,这是用户所要求的信息传送的目标地址;对写而言,则是信息传送的源地址。③ 用户要求传送的字节数nbyte。
4. 建立与文件的连接和去连接
(1) 连接(link)。
(2) 去连接(unlink)。
9.5.3 进程通信和信息保护
1. 进程通信
(1) 消息机制。
(2) 共享存储器机制。
(3) 信号量机制。
2. 信息维护
在UNIX系统中,设置了许多条用于系统维护的系统调用,下面介绍常用的几条。
(1) 设置和获得时间。
(2) 获得进程和子进程时间(times)。
(3) 设置文件访问和修改时间(utime)。
(4) 获得当前UNIX系统的名称(uname)。
9.6 系统调用的实现
系统调用的实现与一般过程调用的实现相比,两者间有很大差异。对于系统调用,控制是由原来的用户态转换为系统态,这是借助于陷入机制来完成的,在该机制中包括陷入硬件机构及陷入处理程序两部分。
9.6.1 系统调用的实现方法
1. 系统调用号和参数的设置
往往在一个系统中设置了许多条系统调用,并赋予每条系统调用一个唯一的系统调用号。在系统调用命令(陷入指令)中把相应的系统调用号传递给中断和陷入机制的方法有很多,在有的系统中,直接把系统调用号放在系统调用命令(陷入指令)中,如 IBM 370和早期的UNIX系统,是把系统调用命令的低8位用于存放系统调用号;在另一些系统中,则将系统调用号装入某指定寄存器或内存单元中,如MS-DOS是将系统调用号放在AH寄存器中,Linux则是利用EAX寄存器来存放应用程序传递的系统调用号。
每一条系统调用都含有若干个参数,在执行系统调用时,如何设置系统调用所需的参数,即如何将这些参数传递给陷入处理机构和系统内部的子程序(过程),常用的实现方式有以下几种:
(1) 陷入指令自带方式。
(2) 直接将参数送入相应的寄存器中。
(3) 参数表方式。
图9-8 系统调用的参数形式
2. 系统调用的处理步骤
在设置了系统调用号和参数后,便可执行一条系统调用命令。不同的系统可采用不同的执行方式。在UNIX系统中,是执行CHMK命令;而在MS-DOS中则是执行INT 21软中断。
3. 系统调用处理子程序的处理过程
系统调用的功能主要是由系统调用子程序来完成的。对于不同的系统调用,其处理程序将执行不同的功能。
9.6.2 UNIX系统调用的实现
1. CPU环境保护
当用户程序处在用户态,且在执行系统调用命令(即CHMK命令)之前,应在用户空间提供系统调用所需的参数表,并将该参数表的地址送入R0寄存器。在执行CHMK命令后,处理机将由用户态转为核心态,并由硬件自动地将处理机状态长字(PSL)、程序计数器(PC)和代码操作数(code)压入用户核心栈,继而从中断和陷入向量表中取出trap.S的入口地址,然后便转入中断和陷入总控程序trap.S中执行。
2. AP和FP指针
为了实现系统调用的嵌套使用,在系统中还设置了两个指针,其一是系统调用参数表指针AP,用于指示正在执行的系统调用所需参数表的地址,通常是把该地址放在某个寄存器中,例如放在R12中;再者,还须设置一个调用栈帧指针。所谓调用栈帧(或简称栈帧),是指每个系统调用需要保存而被压入用户核心栈的所有数据项;而栈帧指针FP则是用于指示本次系统调用所保存的数据项。每当出现新的系统调用时,还须将AP和FP303压入栈中,图9-9示出了在trap.S总控程序执行后用户核心栈的情况。
图9-9 用户核心栈
3. 确定系统调用号
由上所述得知,在中断和陷入发生后,应先经硬件陷入机构予以处理,再进入中断和陷入总控程序trap.S,在保护好CPU现场后再调用trap.C继续处理。
4. 参数传送
参数传送是指由trap.C程序将系统调用参数表中的内容从用户区传送到User结构的U.U-arg中,供系统调用处理程序使用。
5. 利用系统调用定义表转入相应的处理程序
在UNIX系统中,对于不同(编号)的系统调用,都设置了与之相应的处理子程序。为使不同的系统调用能方便地转入其相应的处理子程序,也将各处理子程序的入口地址放入了系统调用定义表即Sysent[]中。
6. 系统调用返回前的公共处理
在UNIX系统中,进程调度的主要依据是进程的动态优先级。随着进程执行时间的加长,其优先级将逐步降低。每当执行了系统调用命令并由系统调用处理子程序返回到trap.C后,都将重新计算该进程的优先级;另外,在系统调用执行过程中,若发生了错误使进程无法继续运行时,系统会设置再调度标志。处理子程序在计算了进程的优先级后,又去检查该再调度标志是否已又被设置。若已设置,便调用switch调度程序,再去从所有的就绪进程中选择优先级最高的进程,把处理机让给该进程去运行。
9.6.5 Linux系统调用
与UNIX相似,Linux采用类似技术实现系统调用。Linux系统在CPU的保护模式下提供了四个特权级别,目前内核都只用到了其中的两个特权级别,分别为“特权级0”(即内核态)和“特权级3”(即用户态)。用户对系统调用不能任意拦截和修改,以保证内核的安全性。Linux最多可以有190个系统调用。应用程序和Shell需要通过系统调用机制访问Linux内核(功能)。
9.6.6 Win32的应用程序接口
首先需要说明的是应用程序接口(API)与系统调用的区别和联系。API是一个函数的定义,说明如何获得一个给定的服务,而系统调用是通过中断向内核发出的一个请求。一个API函数可能不与任何系统调用相对应,也可以调用若干个系统调用,不同的API函数可能封装了相同的系统调用。
习 题 8:
1. 操作系统用户接口中包括哪几种接口? 它们分别适用于哪种情况?
2. 什么是WIMP 技术? 它被应用到何种场合?
3. 联机命令通常有哪几种类型? 每种类型中包括哪些主要命令?
4. 什么是输入输出重定向? 举例说明之。
5. 何谓管道联接? 举例说明之。
6. 为了将已存文件改名,应用什么UNIX命令?
7. 要想将工作目录移到目录树的某指定结点上,应使用什么命令?
8. 如果希望把file 1的内容附加到原有的文件file 2的末尾,应用什么命令?
9. 试比较mail和write命令的作用有何不同。
10. 联机命令接口由哪几部分组成?
11. 终端设备处理程序的主要作用是什么? 它具有哪些功能?
12. 命令解释程序的主要功能是什么?
13. 试说明MS-DOS的命令处理程序COMMAND.COM的工作流程。
14. Shell命令有何特点? 它对命令解释程序有何影响。
15. 试举例说明如何建立二叉树结构的命令行树。
16. 试比较一般的过程调用与系统调用。
17. 系统调用有哪几种类型?
18. 如何设置系统调用所需的参数?
19. 试说明系统调用的处理步骤。
20. 为什么在访问文件之前,要用open系统调用先打开该文件?
21. 在UNIX系统中是否设置了专门用来删除文件的系统调用? 为什么?
22. 在IPC软件包中包含哪几种通信机制? 在每种通信机制中设置了哪些系统调用?
23. rap.S是什么程序? 它完成哪些主要功能?
24. 在UNIX系统内,被保护的CPU环境中包含哪些数据项?
25. rap.C是什么程序? 它将完成哪些处理?
26. 为方便转入系统调用处理程序,在UNIX系统中配置了什么样的数据结构?