一个简易操作系统的设计与实现.pdf
第2 l 卷(增)(2 6)内江师范学院学报J o U R N A LO FN E I A N GT E A C H E R SC O L L E G ES 1 2 1(2 0 0 6)一个简易操作系统的设计与实现曾建周,李尧(内江师范学院计算机与信息科学系,四川内江6 4 1 1 1 2)摘要:根据操作系统的原理,分析操作系统的逻辑结构,设计出一个简易操作系统模型。并利用N A S M 汇编语言和C 语言编写其源代码。实现了一个可以从软盘启动计算机的简易操作系统。关键词:操作系统;引导:内核:进程:I o中图分类号:1 1 3 1 6文献标识码:A文章编号:1 6 7 l 一1 7 8 5(2 0 0 6)s l 0 2 3 8 0 51引言操作系统(O S)是计算机体系里面最基础、最重要的系统软件,它是用户与计算机硬件系统之间的接口,是计算机系统资源的管理者,更是用户使用的平台。真正意义上的操作系统主要有以下四个特点:用户依靠操作系统方便的使用计算机软件、硬件设备,提高计算机的效率,操作系统必须具有良好的扩充性,操作系统必须具有优良的移植性、互操作性和统一的开放环境。操作系统体系是一个非常复杂的知识体系,它牵涉到的知识很多很复杂,比如内核研究、进程调度和管理、存储器管理、文件管理和设备管理等技术。目前对于操作系统教材上都只讲其原理,不讲实际动手操作及其实现,所以学生在学习它时感到非常抽象。国内外一些著名高校通常是鼓励学生在学习这门课程的同时自己动手开发一个能实现O S 基本功能的微型操作系统来加强对该课程的掌握通过实践对于学生充分掌握书本知识、打下扎实的基本功有非常大的好处。在此基础之上,我提出了一个具体的操作系统。2 总体设计2 1 问题的提出计算机操作系统是一个结构化体系,它主要有几大模块构成:引导模块、模式转换模块、内核模块、进程模块、I o 模块、设备管理模块等。2 2 设计框架根据软件项目工程的做法逐步设计出模块。2 5 设计环境一台安装有W i n d o w sX P 和L i n u)(内含N A S M、G C C 工具)双系统P C 机、虚拟机软件(v i n u a lP C)、调试软件(B o c h s)、绝对扇区读写工具(F l o p p y w r i t c r)等。3 详细设计5 1 引导模块B O O T 设计引导盘(本文是以软盘为引导盘)的设计。计算机电源被打开时,B I O S 首先会加电自检,然后寻找位于磁盘的第收稿日期:2 0 0 6 _ _ 0 4 _ 1 3基金项目:内江师范学院大学生科研项目(0 5 N S 珈9 8)作者简介:曾建周(1 9 8 4 一),男,四川南充人,内江师范学院计算机与信息科学系2 0 0 3 级学生。万方数据第2 1 卷(增)l曾建周,李尧:一个简易操作系统的设计与实现2 3 9 O 面O 磁道l 扇区弓I 导代码,B 1 0 S 若发现此扇区代码是以0 x A A 5 5 结束,则认为它就是一个引导扇区。此外,为了能让微软识别引导扇区还要加上一个数据结构为B P B 的头信息。写好此代码之后在L i n u x 系统中用命令n 嬲m B 0 0 t a s m oB o o t-b i n 编译成二进制文件即可运行,然后用软盘绝对扇区读写工具写到软盘或软盘映像即可运行。有了以上软盘引导代码,现在需要解决的问题是将B o o t B i n 写进内存,于是可用一段名为L o a d e r b i n 的代码把B o o t b j n 写迸内存。L o a d e r b i n 生成的方法如下:用虚拟机软件v i r t u a lP C 捕获某个I M G(磁盘映象文件),并将它格式化,于是I M G 中留下了L 0 a d e r b i n。为了简单起见,可规定B o o t b i n 只能放在根目录区。最后把它复制到软盘根目录区中即可。这个阶段还须解决如何寻找L o a d e r-b i n。方法是在软盘的根目录区从头到尾寻找名为L o a d e r b i n 的文件,找到后跳转到L o a d e r-b i n 代码所在地址。最后软盘中文件存放位置的示意图如图1:写好这段代码后,在L i n u x 系统中用命令n a s mB o o t a s m oB o o t b i n编译生成B o o t b i n,然后用软盘绝对扇区读写工具写到软盘或软盘映像即可运行。运行结果如图2 数据区(长度非固定)根目录区(长度非固定)F A T 2(长度固定)即汀l(长度固定)引导扇区(长度固定)图1注:上图打印出B o o t i n g 表示已经将B o o t 调入了内存,然后进入了准备好状态R e a d y图25 2 内核模块K e r n e I 的设计将内核加载到主存。在启动引导扇区代码以后、它会自动寻找L o a d e r 代码,并将L o a d e r 代码加入内存。接着L o a d e r 代码将加载内核到内存。在设计内核这段代码时,主要参考了A n d r c wS 1 柚e n b 删m 和A 1 b e r ts w o o d h u l l 所著操作系统:设计与实现 以及于渊的 自己动手写操作系统扩:内核代码主要包括四个文件:k e r n e l a s m、s t r i n g 觞m、k I i b 弱m、s t a r t c,将这些文件编译链接后得到了内核k e m e l b i n o编译连接方法:i【r o o t X x xX x x】撑瑚-f k e r n e l b i n【r o o t x x xX x x】撑n a s m fe l f-ok e r n e I ok e m e l a s m【r o o t X X xX x x】撑n 硒m-f e l f os t r i n g os t r i n g a s m【r 0 0 t x x xX x x】撑n 硒m f e I f ok l i b ok l i b a s m【r o o t x x xx x x】撑g c c-cf n o-b u i l t i n os t a n os t a r t c【r o o t x x xX x x】撑I d s T t e x tO x 3 0 4 0 0-ok e r n e I b i nk e m e l os t r i n g os t a n ok l i b o然后在V i n u a JP C 中用虚拟D o s 将编译生成的k e m e l b i n 复制到B o o t b i n 所在得到软盘或软盘映像即可运行,到此内核模块制作完成。5 5 实模式转到保护模式当把内核加载进内存后就自动从实模式转到保护模式,为了简化,笔者设计了分页机制,在实模式下,描述内存的地址是逻辑地址(S c g m e n t:O 凰e t),它经过计算后得到的物理地址是线性的,即逻辑地址转换成物理地址遵循这样的计算公式:万方数据2 4 0 内江师范学院学报第2 l 卷(增)l物理地址(P h y s i c a lA d d r e s s)=段值(s e g m e n t)+1 6+偏移(O f f s e t)而分页机制下(保护模式),段值所在的寄存器还是没变,但是此时它变成了一个索引,这个索引指向页表,在页表中详细的定义了页面的起始地址、界限、属性等内容。分页机制示意图如图3:图3按上述原理编写代码,启动分页机制,并且假设有一个任务,没有局部描述符表和中断描述符表,不允许中斯,也不考虑发生异常,甚至没有使用堆栈。则该任务实例执行步骤如下:(1)在实模式下为进入保护模式作初始化:(2)切换到保护模式后进入临时代码段,把部分演示代码传送到预定的内存,然后转演示代码段;(3)建立页目录表:(4)建立页表;(5)启用分页管理机制:(6)演示在分页管理机制启用后的程序执行和数据存取;、(7)关闭分页管理机制:(8)退出保护模式,结束。运行结果如下图:注:上图显示总共有5 段内存被列了出来图40 0 0 0 0 h 9 F B F F hT y p e 值为l 表示可以被该系统使用9 F C 0 0 h 9 F F F F h1 帅e 值为2 表示不能被该系统使用E 0 0 0 0 h F F F F F h1 0 0 0 0 0 h l F F F F F F hF F F C O O O O h F F F F F F F F h内存(R A M)大小:2 0 0 0 0 0 0 h=3 2 M B“c s t a r t”是一个全局函数,起一个复制页表中的属性的作用。5 4 进程模块的设计 万方数据第2 l 卷(增)l曾建周。李尧:一个简易操作系统的设计与实现2 4 1 进程是操作系统中最重要最基本的概念之一。进程主要是由若干代码段、数据段和堆栈段和P C B 等部分组成进程实体,设计进程的关键技术有:(1)进程的哪些状态需要保持;(2)进程状态的完整性保存;(3)如何恢复进程状态:(4)进程队列的调度管理;(5)进程的优先级(特权级)管理。该模块程序主要参考了其他书籍的思想与代码。但诸多进程的性能还未实现,有待在今后的毕业设计中继续完成。根据进程其结构,设计了进程A 和进程B,如图5。它们韵进程调流程如下:(1)进程A 运行;(2)I n t e r 8 2 5 9 发生时钟中断,进程A 被置r i n g l 为r i n g O(在中断程序中设置进程的两个特权级。分别为高特权级r i n g l 和低特权级f i n 9 0);(3)进程调度下一个要运行的进程B;(4)进程B 被置r i n 9 0 为r i n g l:(5)进程B 运行。根据上面流程写出其代码。从总体上讲进程模块主要包括三项代码:(1)时钟中断处理程序:(2)进程调度程序;(3)若干进程程序。随着源代码的增多,编译链接代码的命令也越来越多,又由于代码文件分进程A进程B回回田 田困 困_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 一进程渭度开放在不同的文件夹里,要想编译它就比较困难。因此,在演示程序中设计了三个打印函数交替打印,以代替三个进程的调度问题。运行结果如图6:注:上面演示了三个打印函数(充当三个进程)随机交替打印。图65 5I O 模块的设计无疑现代操作系统必须将进程、I O 设备、内存管理等模块紧密联系在一起。首先,我们从最简单的I,o 设备键盘做起。从敲击键盘到显示器显示出字符大致分为这几个步骤:敲击键盘、扫描并编码、接受并解码、与I n t e l 8 2 5 9 通信、响应结束。在键盘中有一枚编码芯片,通常是I n t e l 8 0 4 8 或其它兼容芯片,它负责监视键盘的输入,并把数据传到计算机主板上的解码芯片I n t e l 8 0 4 2,经过I n t e l 8 0 4 2 解码后并将其放入输入缓冲区,然后与I n t c l 8 2 5 8 通信,当允许I n t e l 8 2 5 9 中断(I R Q l)时,若键盘又有新的键被按下,则I n t e l 8 0 4 2 不会再接受,一直到输入缓冲区被清空,I n t e l 8 0 4 2 才会接受更多的扫描码。按上述原理设计I O 中断程序的流程如下:1)初始化I n t e r 8 2 5 9 的I R Q l 时钟中断类型,使之响应键盘:2)通过键盘申请I o 中断;3)关中断;4)允许I R Q l 中 万方数据2 4 2 内江师范学院学报第2 l 卷(增)l断;5)设置中断内容(其中最重要的是键盘按下的键与对应字符的转换);6)通过显示器输出。根据上面流程编写出代码使用m a k e n l e 自动化编译,然后同上在把生成的b i n 拷贝到软盘即可运行。运行结果如图7:注:上图中弱d 堤作者自己通过键盘输上去的。图74 其它说明由于篇幅有限,文中没有给出每个模块的源代码资料。【参考文献】1 汤子瀛,等计算机操作系统 M 西安:西安电子科技大学出版社,2 0 0 1 8 2 沈美明,等汇编语言程序设计眺 北京:清华大学出版社,2 0 0 1 8 3 于渊自己动手写操作系统 M 北京:电子工业出版社。2 0 0 5 8 4 梁肇新编程高手箴言 M 北京:电子工业出版社,2 0 0 3 1 1 5 王鹏等译中文版操作系统:设计与实现 M j 匕京:电子工业出版社,2 0 0 4(责任编辑:胡蓉)万方数据一个简易操作系统的设计与实现一个简易操作系统的设计与实现作者:曾建周,李尧作者单位:内江师范学院,计算机与信息科学系,四川,内江,641112刊名:内江师范学院学报英文刊名:JOURNAL OF NEIJIANG TEACHERS COLLEGE年,卷(期):2006,21(z1)参考文献(5条)参考文献(5条)1.王鹏 中文版操作系统:设计与实现 20042.梁肇新 编程高手箴言 20033.于渊 自己动手写操作系统 20054.沈美明;温冬婵 汇编语言程序设计 20015.汤子瀛 计算机操作系统 2001 本文链接:http:/