分类: 其他UNIX
2019-02-20 16:32:37
发展信息技术和产业对于提高我国综合国力有重要意义。操作系统作为信息领域的核心技术, 是任何计算机和智能化设备中必不可少的, 不掌握操作系统, 在操作系统上被人垄断,不但产业的发展会受到极大的制约,而且更为严重的是, 我们所有网络和系统的安全也得不到保障。在加速发展信息技术和产业时, 当前应把发展我国自主的操作系统提到议事日程上来, 尽快地摆脱在操作系统上被微软一家公司垄断的被动局面, 使我国信息产业尽早走上健康、自主的发展道路。
人才的培养是实现该目标的关键。理论教学与实验教学是现代高等教育的两个重要组成部分。培养富有创新精神和竞争意识的人才的目标, 对我们的教学从理论到实践都提出了较高的要求, 而且实践教学对于学生实际工作能力的培养起着至关重要的作用。国际一流大学的操作系统课程中, 学生毫不例外地必须参加设计小型操作系统的实习工作。实践是学习操作系统的最好途径, 通过实践, 学生会发现概念不是那么抽象的, 操作系统的结构也是可以逐步分析的。因此, 设计一个能用于教学的操作系统模型, 作为实习项目来帮助学生掌握操作系统概念和原理是非常有意义的。
计算机如果离开了软件将成为一堆废铜烂铁。有了软件,计算机可以对信息进行存储、处理和检索,可以显示多媒体文档、搜索Internet并完成其他工作。计算机软件大致分为两类:系统软件和应用软件。系统软件管理计算机本身及应用程序;应用软件执行用户最终所需要的功能。最基本的系统软件是操作系统(operating system),它控制计算机的所有资源并提供开发应用程序的基础。
现代计算机系统包含一个或多个处理器、若干内存(常称为RAM-随机存取存储器)、磁盘、打印机、网络接口及其他输入/输出设备。编写一个程序来管理所有这些器件以正确地使用它们,即使不考虑优化也是一件很困难的事情。如果每个程序员都必须处理磁盘如何工作,再加上每读一个磁盘块都有几十种因素可能导致操作出错,那么很多程序简直没法写。
许多年以前人们就认识到必须找到某种方法将硬件的复杂性同程序员分离开来。经过不断探索和改进,目前采用的方法是在裸机上加载一层软件来管理整个系统,同时给用户提供一个更容易理解和进行程序设计的接口,这被称为虚拟机(virtual machine)。这样一层软件就是操作系统。
这种处理方式如图1-1所示。底层是硬件,它本身可能包括两层或多层。最低一层是物理器件,包括集成电路芯片、连线、电源、监视器等,它们的构造和工作方式属于电气工程师的范围。
图 1-1 计算机系统由硬件、系统程序和应用程序组成。
接着是微程序(microprogram),通常存放在只读存储器中,它是一层很原始的软件,用来控制设备并向上一层提供一个更清晰的接口。微程序实际上是一个解释器,它先取得机器语言指令,如ADD, MOVE和JUMP等,然后通过一个动作序列来执行这些指令。例如为了执行一条ADD指令,微程序必须先确定运算数据的位置,然后取数,相加,最后存放得数。由微程序解释执行的这一套指令称为机器语言。机器语言并不是硬件的组成部分,但硬件制造商通常在手册中给出机器语言的完整描述,所以许多人将它认作真正的“计算机”。
采用精简指令集计算机(RISC)技术的计算机没有微程序层,其机器指令通过硬件逻辑直接执行。例如Motorola 680X0有微程序,而IBM PowerPC 则没有。
机器语言典型地有50到100条指令,大多数用来完成数据传送、算术运算和数值比较等操作。在这个层次上,通过向特殊的设备寄存器写特定的数值来控制输入/输出设备。例如将磁盘地址、内存地址、读字节数和操作类型(读/写)等值写入特定的寄存器便可完成硬盘读操作。实际操作往往需要更多的参数,而操作完成后的返回状态也非常复杂。进一步而言,对于许多I/O设备,时序在程序设计中的作用非常重要。
操作系统的主要功能之一就是将所有这些复杂性隐藏起来,同时为程序员提供一套更加方便的指令,比如,“从文件中读一个数据块”在概念上比低层的“移动磁头臂,等待旋转延迟”之类的细节来得简单、方便。
在操作系统之上是其他系统软件,包括命令解释器(shell)、窗口系统、编译器、编辑器及类似的独立于应用的程序。要注意它们本身并不是操作系统的组成部分,尽管它们通常由计算机厂商提供。这一点很重要,操作系统专指在核心态(kernel mode),或称管态(supervisor mode)下运行的软件,它受硬件保护而免遭用户的篡改。编译器和编辑器运行在用户态(user mode)。如果用户不喜欢某一个编译器,他可以自己重写一个,但他却不可以写一个磁盘中断处理程序 - 因为这是操作系统的一部分,而且硬件阻止用户对它进行修改。
系统软件之上是应用软件,这些软件可以是购买的或者是用户自行开发的,它们用来解决特定的问题,如字处理、表格处理、工程计算或者电子游戏等。
对多数计算机而言,在机器语言一级的体系结构(指令集、存储组织、I/O和总线结构)上编程是很困难的,尤其是输入输出操作。例如考虑使用多数PC机采用的NEC PD765控制器芯片(或功能等价的芯片)来进行软盘I/O操作。PD765有16条命令,它通过向一个设备寄存器装入特定的数据来执行这些命令,命令数据长度从1到9字节不等,其中包括:读写数据、移动磁头臂、格式化磁道、初始化、检测磁盘状态、复位、校准控制器及设备等。
最基本的命令是读数据和写数据。它们均需要13个参数,所有这13个参数被封装在9个字节中。这些参数指定的信息有:欲读取的磁盘块地址、每条磁道的扇区数、物理介质的数据记录格式、扇区间隙、以及对已删除数据地址标识的处理方法等。当磁盘操作结束时,控制器芯片返回23个状态及出错信息,它们被封装在7个字节中。此外,程序员还要注意步进电机的开关状态。如果电机关闭,则在读写数据前要先启动它(有一段较长的加速时间)。还要注意电机不能长时间处于开启状态,否则将损坏软盘,所以程序员必须在较长的启动延迟和可能对软盘造成损坏之间作出折衷。
显然,程序员不想涉及硬件的这些具体细节(也包括硬盘,它与软盘不同,但同样很复杂)。他需要的是一种简单的高度抽象的设备。一种典型的抽象是一张磁盘包含了一组命名的文件,每个文件可以被打开,然后进行读写,最后被关闭。其中的一些细节如数据记录格式、当前步进电机的开启状态等则对用户隐藏。
这种将硬件细节与程序员隔离开来、同时提供一个简洁的命名文件方式的程序,就是操作系统。与磁盘抽象类似,它还隐藏了其他许多低层硬件的特性,包括中断、时钟、存储器等。总之,操作系统提供的每一种抽象都较低层硬件本身更简单、更易用。
从这个角度看,操作系统的作用是为用户提供一台等价的扩展计算机,或称虚拟机,它比低层硬件更容易编程。
上述虚拟机模型是一种自顶向下的观点。按照自底向上的观点,操作系统则用来管理一个复杂系统的各个部分。现代计算机都包含处理器、存储器、时钟、磁盘、鼠标、网络接口、激光打印机以及其他许多设备,从这个角度看,操作系统的任务是在相互竞争的程序间有序地控制这些设备的分配。
设想在一台计算机上运行的三个程序同时试图在一台打印机上输出计算结果,那么可能头几行是程序1的输出,接下来几行是程序2的输出,然后又是程序3的输出等等,最终打印结果将是一团糟。操作系统采用将打印输出缓冲到磁盘上的方法可以避免这种混乱。当一个程序结束后,操作系统将暂存在磁盘文件上的输出结果送到打印机,同时其他程序可以继续运行产生新的输出结果,而这些程序并不知道这些输出没有立即送至打印机。
当一台计算机(或网络)有多个用户时,因为用户间可能相互影响,所以管理和保护存储器、I/O设备以及其他设备的需求随之增加。而且用户往往不仅需要共享硬件,还要共享信息(文件、数据库等)。总之,此时操作系统的首要任务是跟踪资源的使用状况、满足资源请求、提高资源利用率、以及协调各程序和用户对资源的使用冲突。
在国外的操作系统教学中, 使用最多的教学操作系统是NACHOS. NACHOS 有一个特殊的结构: 操作系统内核和机器模拟器被编译成一个单一可执行的任务, 它作为一个普通进程在某些主机操作系统上运行。在NACHOS 中运行的用户级进程是运行在一个MIPS 处理器的指令级模拟器上, 而NACHOS 核心却运行在主机系统的本地硬件上。这种设计方法的优点是可以使用主机系统的调试器来调试设计的操作系统内核, 操作系统的出错只影响一个用户进程。但NACHOS 只能运行在特定的MIPS 机型的模拟器上, 会存在一些其它缺点: 首先, 因为它的核心不是保存在模拟器的RAM 中, 这样, 它不会受到内存容量的限制。这意味着内核数据结构的大小不是影响系统性能的重要因素, 使得数据结构大小和空间容量的权衡不用考虑, 这在一个实际操作系统设计中是不现实的; 其次,NACHOS 是与底层硬件相隔离, 所有机器模拟器和被模拟的硬件之间的接口由C+ +对象设计。这意味着学生不需要了解要访问的真正硬件是如何工作的, 而这一点对于编写核心程序的程序员来说是很重要的。并且NACHOS 这种特殊结构很难移植到实际硬件机器上直接执行[1]。
MINIX是另一个广泛用于教学的操作系统, 它与NACHOS 不同, 它是可以运行在实际硬件上, 或X86 模拟器Bochs 上。然而,MINIX 是一个包括了虚拟内存、文件系统、设备驱动程序、网络和一整套用户模式程序的比较完整的操作系统, 它由两万多行代码组成。它对于教学有点过于庞大和复杂, 实现有一定难度。而且它已经实现了操作系统的全部基本功能,没有留下合适的练习让学生自己完成, 这不利于操作系统教学[1]。
在现实中最后的一种方式是使用一个通用的操作系统用于教学。但这样做会有许多缺点: 较难的设备驱动程序问题; 通用的操作系统结构庞大很复杂,学生短时间很难掌握, 有很少的教学价值。而且, 实际的操作系统几乎已经实现了所有功能, 学生不需要设计或实现一些子系统和自己感兴趣的部分。因此介绍涉及到核心程序的操作系统课程应避免采用通用的操作系统作为实习项目[1]。
本课题成立的目的是要开发一个实用型的教学操作系统,而要开发一个优秀的教学操作系统, 应该具备下列目标: 提供一个真实的执行环境; 便于调式; 使用简单, 符合课程的需要, 可留出一些练习作为学生的作业; 帮助学生熟悉真正操作系统的结构和设计; 在操作系统课程结束后能实现一个小的用户程序真正运行的操作系统; 提供可读性好和健壮的代码。作为一个操作系统内核的教程, 保持系统的简单易实现是非常重要的。为了实现这一目的, 在系统设计时, 尽力地限制了操作系统的功能, 仅保留操作系统最基本的功能。系统应该可以灵活的留出部分作业, 让学生去完成, 使他们能亲自参与到设计实践中去, 激发他们学习操作系统的兴趣。
根据上面的设计原则, 参照操作系统课程的主要内容和一些较难理解的知识点, 我们设计了一个实用的教学操作系统, 已经实现的功能主要有:
l 引导程序
l 进程调度
l 中断系统
l 带有段页式的虚拟存储器
l I/O系统(包括键盘驱动程序,屏幕控制,软盘驱动程序)
l 文件系统(FAT12简化版本)