操做系统接口编程
不一样的OS,其联机用户接口是不一样的,即它们的命令形式和用法各不相同,甚至在同一系统中,命令的不一样形式构成了不一样的用户界面,通常可分为字符显示式联机用户接口和图形化联机用户接口两类。安全
1. 命令行方式数据结构
该方式是以行为单位,输入和显示不一样的命令。每行长度通常不超过256个字符,通常状况下,以回车符做为一个命令的结束标记。一般,命令的执行采用的是间断式的串行执行方式,即后一个命令的输入通常需等到前一个命令执行结束,如用户键入的一条命令处理完成后系统发出新的命令输入提示符,用户才能够继续输入下一条命令。函数
2. 批命令方式工具
在操做命令的实际使用过程当中,常常遇到须要对多条命令的连续使用、或对若干条命令的重复使用、或对不一样命令进行选择性使用的状况,若是用户每次都采用命令行方式将命令一条条由键盘输入,既浪费时间,又容易出错。所以,操做系统都支持一种称为批命令的特别命令方式,容许用户预先把一系列命令组织在一种称为批命令文件的文件中,一次创建,屡次执行。使用这种方式可减小用户输入命令的次数,既节省了时间,减小了出错几率,又方便了用户。post
1. 图形用户接口GUI(Graphics User Interface)的引入操作系统
虽然用户能够经过命令行方式和批命令方式,取得操做系统的服务,并控制本身的做业运行,但却要牢记各类命令的动词和参数,必须严格按规定的格式输入命令,并且不一样操做系统所提供的命令语言的词法、语法、语义及表达形式是不同的,这样既不方便又花费时间。因而,图形化用户接口GUI(Graphics User Interface)便应运而生。命令行
2. 使用WIMP技术指针
GUI采用了图形化的操做界面,使用WIMP 技术,该技术将窗口(Window)、图标(Icon)、菜单(Menu)、鼠标(Pointing device)和面向对象技术等集成在一块儿,引入形象的各类图标,将系统的各项功能、各类应用程序和文件直观、逼真地表示出来,造成一个图文并茂的视窗操做环境。code
3. Windows的GUI简介
以Microsoft公司的Windows 操做系统为例,在系统初始化后,OS为终端用户生成了一个运行explorer.exe的进程,它运行一个具备窗口界面的命令解释程序,该窗口是一个特殊的窗口,即桌面。
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) 批命令。
在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。
根据简单命令功能的不一样,可将它们分红以下五大类:
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。
1. 重定向命令
在Linux系统中,由系统定义了三个文件。其中,有两个分别称为标准输入和标准输出的文件,各对应于终端键盘输入和终端屏幕输出。它们是在用户注册时,由Login程序打开的。这样,在用户程序执行时,隐含的标准输入是键盘输入,标准输出即屏幕(输出)显示。但用户程序中可能不要求从键盘输入,而是从某个指定文件上读取信息供程序使用;一样,用户可能但愿把程序执行时所产生的结果数据写到某个指定文件中而非屏幕上。
2. 管道命令
人们又进一步把重定向思想加以扩充,用符号“|”来链接两条命令,使其前一条命令的输出做为后一条命令的输入。
1. 信箱通讯命令mail
信箱通讯是做为在UNIX的各用户之间进行非交互式通讯的工具。发信者把要发送的消息写成信件,“邮寄”到对方的信箱中。
2. 对话通讯命令write
用这条命令可使用户与当前在系统中的其余用户直接进行联机通讯。
3. 容许或拒绝接收消息的mesg命令
其格式为:
mesg[-n][-y]
有些命令须要执行很长的时间,这样,当用户键入该命令后,便会发现本身已无事可作,要一直等到该命令执行完毕,方可再键入下一条命令。这时用户天然会想到应该利用这段时间去作些别的事。UNIX系统提供了这种机制,用户能够在这种命令后面再加上“&”号,以告诉Shell将该命令放在后台执行,以便用户能在前台继续键入其它命令,完成其它工做。
9.3 联机命令接口的实现
在微机或终端上所配置的键盘终端处理程序应具备下述几方面的功能:① 接收用户从终端上打入的字符;② 字符缓冲,用于暂存所接收的字符;③ 回送显示;④ 屏幕编辑;⑤ 特殊字符处理。
1. 字符接收功能
为了实现人机交互,键盘终端处理程序必须可以接收从终端输入的字符,并将之传送给用户程序。有两种方式可实现字符接收功能:
(1) 面向字符方式。
(2) 面向行方式。
2. 字符缓冲功能
为了能暂存从终端键入的字符,以下降中断处理器的频率,在终端处理程序中,还必须具备字符缓冲功能。字符缓冲可采用如下两种方式之一:
(1) 专用缓冲方式。
(2) 公用缓冲方式。
图9-1 两种缓冲方式
3. 回送显示
回送显示(回显)是指每当用户从键盘输入一个字符后,终端处理程序便将该字符送往屏幕显示。有些终端的回显由硬件实现,其速度较快,但每每会引发麻烦。如当用户键入口令时,为防止口令被盗用,显然不应有回显。此外,用硬件实现回显也缺少灵活性,于是近年来多改用软件来实现回显,这样能够作到在用户须要时才回显。
4. 屏幕编辑
用户常常但愿能对从键盘打入的数据(字符)进行修改,如删除(插入)一个或多个字符。为此,在终端处理程序中,还应能实现屏幕编辑功能,包括能提供若干个编辑键。经常使用的编辑键有:
(1) 删除字符键。
(2) 删除一行键。
(3) 插入键。
(4) 移动光标键。
(5) 屏幕上卷或下移键等。
5. 特殊字符处理
终端处理程序必须能对若干特殊字符进行及时处理,这些字符是:
(1) 中断字符。
(2) 中止上卷字符。
(3) 恢复上卷字符。
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的工做流程
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基本执行过程及父子进程之间的关系
在计算机系统中,一般运行着两类程序:系统程序和应用程序。为了防止应用程序对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,应用程序经过该中断获取操做系统的服务。
1. 进程控制类系统调用
主要用于对进程控制的系统调用有:
(1) 建立和终止进程的系统调用。
(2) 得到和设置进程属性的系统调用。
(3) 等待某事件出现的系统调用。
2. 文件操纵类系统调用
对文件进行操纵的主要系统调用以下:
(1) 建立和删除文件。
(2) 打开和关闭文件的系统调用。
(3) 读和写文件的系统调用。
3. 进程通讯类系统调用
在单处理机系统中,OS常常采用消息传递方式和共享存储区方式。当采用消息传递方式时,在通讯前需先打开一个链接。为此,应由源进程发出一条打开链接的系统调用,而目标进程则应利用接受链接的系统调用表示赞成进行通讯;而后,在源和目标进程之间即可开始通讯。能够利用发送消息的系统调用或者用接收消息的系统调用来交换信息。通讯结束后,还须再利用关闭链接的系统调用结束通讯。
目前许多操做系统都提供了上面所介绍的各类类型的系统调用,实现的功能也相相似,但在实现的细节和形式方面却相差很大,这种差别给实现应用程序与操做系统平台的无关性带来了很大的困难。为解决这一问题,国际标准化组织ISO给出的有关系统调用的国际标准POSIX1003.1(Portable Operating System IX),也称为“基于UNIX的可移植操做系统接口”。
图9-7 UNIX/Linux系统程序、库函数、系统调用的分层关系
该类系统调用包括建立进程的系统调用fork、终止进程的系统调用exit、等待子进程结束的系统调用wait等十多条。
1. 进程的建立和终止
(1) 建立进程(fork)。
(2) 终止进程(exit)。
2. 改变进程映像和等待
(1) 执行一个文件(exec)。
(2) 等待子进程结束(wait)。
3. 其它进程调用
(1) 得到进程ID。
(2) 得到用户ID。
(3) 进程暂停(pause)。
用于对文件进行操纵的系统调用是数量最多的一类系统调用,其中包括建立文件、 打开文件、关闭文件、读文件及写文件等二十多条。
1. 文件的建立和删除
(1) 建立文件(creat)。
(2) 删除文件。
2. 文件的打开和关闭
(1) 打开文件(open)。
(2) 关闭文件(close)。
3. 文件的读和写
读和写文件的系统调用是read和write。仅当用户利用open打开指定文件后,方可调用read或write对文件执行读或写操做。两个系统调用都要求用户提供三个输入参数:① 文件描述符fd。② buf缓冲区首址。对读而言,这是用户所要求的信息传送的目标地址;对写而言,则是信息传送的源地址。③ 用户要求传送的字节数nbyte。
4. 创建与文件的链接和去链接
(1) 链接(link)。
(2) 去链接(unlink)。
1. 进程通讯
(1) 消息机制。
(2) 共享存储器机制。
(3) 信号量机制。
2. 信息维护
在UNIX系统中,设置了许多条用于系统维护的系统调用,下面介绍经常使用的几条。
(1) 设置和得到时间。
(2) 得到进程和子进程时间(times)。
(3) 设置文件访问和修改时间(utime)。
(4) 得到当前UNIX系统的名称(uname)。
系统调用的实现与通常过程调用的实现相比,二者间有很大差别。对于系统调用,控制是由原来的用户态转换为系统态,这是借助于陷入机制来完成的,在该机制中包括陷入硬件机构及陷入处理程序两部分。
1. 系统调用号和参数的设置
每每在一个系统中设置了许多条系统调用,并赋予每条系统调用一个惟一的系统调用号。在系统调用命令(陷入指令)中把相应的系统调用号传递给中断和陷入机制的方法有不少,在有的系统中,直接把系统调用号放在系统调用命令(陷入指令)中,如 IBM 370和早期的UNIX系统,是把系统调用命令的低8位用于存放系统调用号;在另外一些系统中,则将系统调用号装入某指定寄存器或内存单元中,如MS-DOS是将系统调用号放在AH寄存器中,Linux则是利用EAX寄存器来存放应用程序传递的系统调用号。
每一条系统调用都含有若干个参数,在执行系统调用时,如何设置系统调用所需的参数,即如何将这些参数传递给陷入处理机构和系统内部的子程序(过程),经常使用的实现方式有如下几种:
(1) 陷入指令自带方式。
(2) 直接将参数送入相应的寄存器中。
(3) 参数表方式。
图9-8 系统调用的参数形式
2. 系统调用的处理步骤
在设置了系统调用号和参数后,即可执行一条系统调用命令。不一样的系统可采用不一样的执行方式。在UNIX系统中,是执行CHMK命令;而在MS-DOS中则是执行INT 21软中断。
3. 系统调用处理子程序的处理过程
系统调用的功能主要是由系统调用子程序来完成的。对于不一样的系统调用,其处理程序将执行不一样的功能。
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调度程序,再去从全部的就绪进程中选择优先级最高的进程,把处理机让给该进程去运行。
与UNIX类似,Linux采用相似技术实现系统调用。Linux系统在CPU的保护模式下提供了四个特权级别,目前内核都只用到了其中的两个特权级别,分别为“特权级0”(即内核态)和“特权级3”(即用户态)。用户对系统调用不能任意拦截和修改,以保证内核的安全性。Linux最多能够有190个系统调用。应用程序和Shell须要经过系统调用机制访问Linux内核(功能)。
首先须要说明的是应用程序接口(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系统中配置了什么样的数据结构?