This is a small school assignment demo about Operating System(OS) course in my last semester. It took me more than one month to finish it. I have tried my best to get more innovations and add more new features for this small demo. Finally, I accomplished it in 2008-10-12, and luckily I got a 93 on the OS course :) .
Most of my codes are assembly language. Some are C language. And I use ELF format code to link C language and assembly language. I develop this project in the Linux(Ubuntu) development platform , and use Vmware to run my RPOS.
Project: RPOS English Name: Runtime Programmable Operating System Chinese Name: 运行时可编程操作系统 Key Word:
Authors:
The effect of my demo :
http://img2.jintiankansha.me/get5?src=http://ww4.sinaimg.cn/mw1024/005vnwcQtw1eey425ds1zj30b4076mxi.jpg
我们以软盘作为启动盘,把Boot模块写入引导扇区,作为RPOS的启动模块。 我们主要实现了以下功能模块
启动模块。
启动模块由boot.bin 和 loader.bin两个文件组成。主要用于将操作系统引导到内核模块下。
进程管理模块
实现了普通的用户进程、任务进程。实现了最简单的进程调度管理
终端管理模块
实现了简单的Shell命令行处理系统 实现了大部分键盘中断的响应处理 实现了简单的系统调用方式printf
我们有三个终端,通过ALT键+F1/F2/F3可以实现终端的切换。如:
为了演示我们的进程调度状况,我们在终端2下演示了3个进程的轮循调度:
我们实现的进程调度是没有优先级的。我们采用的是按序调度进程。由于我们在Demo中对进程的执行采取了延迟的作法(为了让打印的速度变慢,以让用户便于观察),而我们实现的延迟是不精确的,因此,进程在打印数据时,有可能出现乱序的情形。
我们还实现了若干Shell操作,如:
clear执行前系统的运行情况:
clear执行后:
1、 背景
操作系统作为软硬件交互的桥梁,在计算机的应用和研究中,有着举足轻重的作用。了解操作系统的构成和原理也是很有价值的。我们组希望能够通过高级操作系统这门课及课程项目,加深对操作系统原理的理解。因此决定在裸机上实现一个简单的操作系统,按我们的能力尽可能多的实现功能。另外在项目开始前,初步构想了另外一种操作系统结构。不去考虑其可行性和价值性,单从某些需求出发,构建和提出新的概念,此所谓运行时可编程操作系统。也就是说,希望操作系统在运行时提供更多用户体验,用户可根据自身的需要尽可能多的操作操作系统。 最早这一想法来源于目前计算机软件和硬件系统的发展趋势。
从编译系统来看,早期的C语言类程序,是被编译为本地可执行程序,它独立于各个操作系统。也就是说,不同的操作系统需要不同的编译器和连接器来编译C语言的程序,生成本地代码。以JAVA为代表的另一类解释器体现出它的优势,即JAVA程序可以通过JAVA虚拟机在不同的操作系统上执行。两者的区别在于运行时解释执行和本地代码的运行。很显然JAVA给与了我们更方便,更灵活的程序方式。其实单从C++和C语言的发展来看。更多的NEW关键字也体现了这一优势。它通过动态的分配内存,提高存储空间的运行效率。而类似dynamic_cast 这类运行时检查程序,也在一定程度上提高了程序的鲁棒性。
从硬件系统来看,GPU是一个很好的例子,早期的GPU拥有固定的管线,用来处理顶点信息,几何变换和像素着色等。这些固定的管线的确简化了GPU的设计,也减轻了程序员的负担。但是它的灵活性却受到了很大的限制,由于给与用户层次操作的权限过少。使得芯片在功能和效率上大大折扣。可编程管线的出现,几乎完全替代了固定管线的架构。它让GPU变得更强大,其实这正是由于它极大的提高了用户层面的体验。通过高级语言编程,充分控制硬件,使得芯片在灵活性和效率上突飞猛进。
从操作系统来看,操作系统从UNIX这个里程碑开始,就不断的在发展。但是至今为止,它的架构却仍然大同小异(嵌入式操作系统不在讨论范围内)。然而它也突露出内核动态化的一面,但是这一趋势还不能动摇整个操作系统的结构。于是我们思考是否有可能存在这样一种结构,使得操作系统也管线化。AO(面向方面)的兴起也许是一种可行的思考方法,程序设计从过程氏到面向对象,再到AO,有越来越多的人从事研究。如果说早期的windows 和 dos 采用更多过程化思想的化,那么未来的操作系统能否更多的采用AO的思想。这里讨论的不是编程,而是操作系统的结构是否可以在内核结构上就采取类似AO的方式? 对于这样一个课题,就目前的知识水平来说,要有可上台面的成果。对于我们目前的技术基础和时间精力来说,还是相当困难的,而在这里我们希望可以通过两个方面,探索动态可编程操作系统的可行性和可能的结构方案。从构建一个简单的操作系统开始,在学习和实现的同时,尽可能的容入我们的思想。
2、 猜想
对于现有常见的操作系统结构,无论是UNIX,还是DOS,还是WINDOWS等等,它们的总体结构是一致的,也就是说,把应用程序或一个进程作为一个单元来说,他们从产生到被杀死,一系列过程,都受到操作系统内核的制约和管理。而当应用程序在执行过程中,也会去调用系统指定好的接口,比如设备交互,连接网络等等。如果把应用程序或进程做为一个对象,那么它生存的空间,就是整个操作系统。我们把这样的模型定义为“监狱模型”,也就是类似养猪场,养鸡场一样。他们的特点是,应用程序的自由度被严格的限制,就拿我们较为熟悉的WINDOWS来说,当你创建一个进程(一个犯人),操作系统为其分配空间(牢房),当然也许犯人体积较大,或犯的罪很严重,那么系统会根据犯人本身的属性,分配合适的牢房。而当这个进程需要被调度时,操作系统按照优先级等现有的调度算法对各个进程进行调度,以运行(出牢活动),当进程执行完毕,将被系统自动清理(刑满释放),而某些进程因为运行时错误,出错,而被操作系统提前终结(越狱)。而在犯人服刑的过程中,需要新陈代谢,牢长会根据作息统一定制计划,比如排队就餐,15分钟内完毕回房等等。也就类似文件系统的读写操作,而系统本身的方式也是定死的,所有的应用程序需要按照定死的标准,访问主存,进行存取。 那么现在的问题出在哪里呢?为什么把监狱和饲养场归为一类?根本原因就是在于个体的“无差别性”这个词汇上。而监狱里的人真的是无差别的吗?饲养场呢?我想前者显而易见,后则,也许对于一个宠物爱好者来说,那些动物也是有很大差别的。因此我们问题的本质显而易见了,正是因为能动对象的转移,导致有差别的个体,被当作无差别的个体对待。因为对于监狱来说,里面的人都是犯人,就应该用应有的规矩管制他们。那么这样带来的危害是什么呢?那就是这些个体(犯人) 失去了能动性,失去了自由。所以,运行时可编程系统,正是一个要解放应用程序,让应用程序尽可能获得自由的系统。
3、 运行时可编程操作系统可能的模型
A、商场模型
这里的商场主要是指超市这类场所,也可以称作为超市模型。超市的特点是,超市有许多顾客,有许多商品,顾客进入超市,首先是选择一个购物篮,然后在不同的区域,选购需要的物品,选择物品以后,排队进入缴费区。在清算物品价格后,方可离开超市。 以上便是一个典型的商场模型,当然其中还有许多细节。这里先不予讨论,因为我们更关注的是如何使商场模型适用于操作系统。 我已经声明了,我们应该更多的面向用户,面向进程。那么这里的顾客其实就是我们商场模型操作系统的进程。而商品就是进程所需要的资源。商场中的人是自由的,他似乎不受管束,但是实际上,还是有规则的。比如顾客不能偷东西,不能砸坏东西等等。在操作系统中我们就把这些规律规定为系统进程或后台进程。它管束着其他的进程。那么这个模型和现有的操作系统的区别在哪里呢?这正是体现在客户的能动性上面。在现有的操作系统从进程如要申请资源如打印机,那么肯定要遵循独占模式的前提下,配置和使用打印机。或者说,当进程需要申请一块存储空间时,他必须在系统的监控下申请一块内存。而如今,我们可以不需要这么做。在商场中,有许多商品,顾客可以自主选择的选取这些商品。然后来到柜台缴费。柜台是一个一个人通过的。如果说,有N种有限的资源,那么就有N个柜台。为了简化期间,我们设这个柜台只有一个,也就是说只有一台打印机。每个顾客必须轮流的使用这个打印机。但是就每一个顾客来说(进程),它已经选择了这个商品,而不需要等待系统分配给他。 于是,我们的实现可以体现于,如果在存储空间的分配中,就可以体现为不同区块的不同大小,而不是使用既定的模式。在文件系统中,不同文件可以采取不同的页大小,而不是局限于单一的页大小。更多的配置,更多的能动性。即,进程可以对各个服务逐一通过,选择使用或不使用,在创建,到申请资源,使用,释放等环节,直到消亡(缴费后离开)。
B、 餐厅模型
餐厅模型,这里并不是指自助餐厅。而是主要指有服务员的那种点菜式餐厅。餐厅里有许多座位,客人来到一个座位,他可以选择喜欢的空位坐下。然后服务员来到客户旁边,客户按需要点菜,点完以后上菜。吃了一般也许需要加点,也许需要退菜。这是要求服务员服务,服务员来后继续点菜或退菜等操作。 餐厅模型与商场模型的不同点在哪呢?其实就在于客户的状态,对商场模型来说没,他不需要服务员服务,自己亲自出马,挑选商品。而餐厅模型则是客户必须等待有空的服务员前来服务。那么体现在操作系统上来说,两者的区别也就显而易见了。还是以申请资源来做例子。如果一个新进程需要被创建,如果系统允许(餐厅有空位置),那么该进程就被创建,在运行的过程中,他需要申请资源,那么这个时候我们该怎么办呢?在现有的操作系统中,我们没有服务员这个概念,因为所有的进程都是被统一管理的。那么我们需要加入一个概念,叫系统子,系统子的作用是提供进程服务,进程需要某些操作,分配资源,读取文件时,都有系统子传达给操作系统。系统子的数目和效率是由操作系统本身决定的。取决于构架和硬件能力。它是现有系统模式和商场模式之间的一个中间类型,也是一种妥协成果。即没有被服务的进程必须等待,这和以前等待使用打印机是一样的。系统子相当于一种代理,它同样可以有效提高进程的灵活性与主动性。
1、 关于操作系统管线的构想
以面向应用程序为原子的流水线化,即操作系统对其进行的运行时内存管理,文件管理,至用户表现形式等一系列过程管线化。而进程管理不包含其中。就如同前面提到的两种模式,这里借助了AO和GPU管线的结构,如果我们能够把操作系统现在的内核结构分功能给与管线化,那么在一定程度上可以提高进程在每一个管线结点的可操作性。但是就目前的管线结构,我们还希望能够做一些改进,也就是说,进程可以有选择的通过管线。而不是必需通过全部管线,这样就需要将原来的一条通路转化为多条通路。或借助AO的思想将其整合。就如同客户选择商品和委托服务员订菜一样,并不是每种商品都必须买。把管线中的各个点看作为各个商品。可以提高用户的能动性。
2、 关于松动内核的构想
Flexible Core,所体现的思想就是内核可以根据应用程序的要求,用户的要求,以及自适应的方式对现有的内核在运行时进行更改和配置。也就是说,当一个进程从创建开始,在运行,读取,申请资源等多个阶段,对内核进行配置。内核相对于现在的内核结构来说,它有更多的活动性。虽然这必然会消耗许多资源,但是在硬件系统不断发展的今天。也许我们更多的关注应用的灵活性和鲁棒性。除了配置以外,内核模块还可以在运行时被重组,删减和挂载
3、小结
也许这些都只是空想,但是这些都是反映如今需求的趋势。而我们能做的就是从Boot开始,深入了解内核架构。也许我们参考的资料,学的课程都是遵循原操作系统架构体系。我们的所思,所想,所做,所为都无法逃避原思维结构的束缚。但是一种尝试和大胆的猜想,说不定在未来,就会被印证,采纳,发展。
To be continue……
Knight
RPOS GROP
2008年10月12日星期日
原文地址: http://knightliao.blogspot.jp/2009/04/rpos-runtime-programable-operating.html