计算机系统实验软件报告题目:GeekOS操作系统的研究和实现院(系):计算机科学与工程学院专业:计算机应用技术学生姓名:周洁学号:102031129指导教师:黄廷辉职称:教授2011年06月29日1目录1.Geekos概述...............................................................................................................22.实验环境..................................................................................................................23.实验目的..................................................................................................................24.项目设计要求..........................................................................................................25.项目设计原理..........................................................................................................46.项目设计的具体实现..............................................................................................67.遇到的问题及解决方法..........................................................................................178.实验总结..................................................................................................................1721.Geekos概述GeekOS是一个教育操作系统内核,它由Maryland大学DavidHovemeyer所开发的基于X86的微内核操作系统。它尽量的简化了系统,但却提供了现代操作系统必须的最基本的功能,例如,虚拟内存,一个文件系统和交互进程通信。GeekOS主要用于操作系统课程设计,目的是使学生能够实际动手参与到一个操作系统的开发工作中.出于教学目的,这个系统内核设计简单,却又兼备实用性,它可以运行在真正的X86PC硬件平台.作为一个课程设计平台,GeekOS由一个基本的操作系统内核作为基础,提供了操作系统与硬件之间的所有必备接口,实现了系统引导,实模式到保护模式的转换,中断调用及异常处理,基于段式的内存管理,FIFO进程调度算法以及内核进程,基本的输入输出(键盘作为输入设备,显示器作为输出设备),以及一个用于存放用户程序的只读文件系统PFAT。由于目前大家最通用的处理器是CISC结构的IntelIA-32或X86通用处理器,所以选用该结构的教学操作系统比较合适,GeekOS作为一个用C语言开发的操作系统,学生可以在Linux或Unix环境下对其进行功能扩充,也可以在Windows下使用Cygwin工具开发,且其针对进程、文件系统、存储管理等操作系统核心内容分别设计了7个难度逐渐增加的项目供学生选择。2.实验环境1)安装VMwareWorkstation7.1.32)建立虚拟机,在虚拟机上安装Redhat9.03)安装VMwareTools4)实现文件共享,添加桌面上名为ZJ的文件夹为共享文件,在linux下/mnt/hgfs/zj可找到5)Bochs-2.2.1的安装和使用Bochs是一个x86硬件平台的模拟器。换句话说,它可以模拟各种硬件的配置。当启动到Bochs时,看起来就好像你在自己的PC上启动了另外一个PC。Bochs模拟的是整个PC平台,包括I/O设备、内存和BIOS。更为有趣的是,甚至可以不使用PC硬件来运行Bochs。事实上,它可以在任何编译运行Bochs的平台上模拟x86硬件。通过改变配置,可以指定使用的CPU(386、486或者586),以及内存大小等。一句话,Bochs是电脑里的“PC”。根据需要,Bochs还可以模拟多台PC,此外,它甚至还有自己的电源按钮。注释行用#开头.对Bochs的手动配置主要通过Bochsrc.txt文件来实现。可通过该文件的修改来规定启动方式(软盘、硬盘),用来模拟软盘或硬盘的映像文件等。3.实验目的通过分析、编译GeekOS系统的源代码并生成磁盘映射文件,来进一步了解操作系统的原理。并在Bochs模拟器下模拟启动,来了解操作系统的基本原理和系统的启动过程。项目0:熟悉Geekos的项目编译、调试和运行环境,掌握Geekos运行工作过程。项目1:熟悉ELF文件格式,了解Geekos系统如何将ELF格式的用户可执行程序装入到内存,建立内核进程并运行的实现技术。项目2:扩充GeekOS操作系统内核,使得系统能够支持用户级进程的动态创建和执行。4.项目设计要求4.1项目0的要求(1)搭建GeekOS的编译和调试平台,掌握GeekOS的内核进程工作原理。(2)熟悉键盘操作函数,编程实现一个内核进程。该进程的功能是:接收键盘输入的字符并显示到屏幕上,当输入Ctrl+D时,结束进程的运行。4.2项目1的要求3(1)修改/geekos/elf.c文件:在函数Parse_ELF_Executable()中添加代码,分析ELF格式的可执行文件(包括分析得出ELF文件头、程序头,获取可执行文件长度,代码段、数据段等信息),并填充Exe_Format数据结构中的域值。(2)掌握GeekOS在核心态运行用户程序的原理,为项目2的实现做准备。4.3项目2的要求开始本项目前需要阅读/src/geekos目录中的以下程序:(1)Entry.c:用户程序外壳,用户程序的入口地址就在这里,此文件在编译时与用户程序一起编译。(2)Lowlevel.asm:其中HandleInterrupt是中断处理的总调度程序,该函数根据传递的中断向量查找并调用相关的中断处理程序,并实现调度进程的选择。Switch_To_Thread函数用于实现进程的切换。(3)Kthread.c:内核进程有关函数以及进程调度算法都在此实现。(4)Userseg.c:其中要关注的函数有Destroy_User_Context()函数功能是释放User_Context空间,Detach_User_Context()调用该函数。Load_User_Program()函数功能是对用户进程的User_Context结构初始化,并对用户态进程的初始化,Spawn()函数中调用该函数。项目2要求用户对以下几个文件进行修改:(1)“src/GeekOS/user.c”文件中的函数Spawn(),其功能是生成一个新的用户级进程。(2)“src/GeekOS/user.c”文件中的函数Switch_To_User_Context(),调度程序在执行一个新的进程前调用该函数以切换用户地址空间。(3)“src/GeekOS/elf.c”文件中的函数Parse_ELF_Executable(),该函数的实现要求和项目1相同。(4)“src/GeekOS/userseg.c”文件中主要是实现一些为实现“src/GeekOS/user.c”中高层操作支持的函数。Destroy_User_Context()函数的功能是释放用户态进程占用的内存资源。Load_User_Program()函数的功能通过加载可执行文件镜像创建新进程的User_Context结构。Copy_From_User()和Copy_To_User()函数的功能是在用户地址空间和内核地址空间之间复制数据,在分段存储器管理模式下,只要段有效,调用memcpy函数就可以实现这两个函数的功能。Switch_To_Address_Space()函数的功能是通过将进程的LDT装入到LDT寄存器来激活用户的地址空间。(5)“src/GeekOS/kthread.c”文件中的Start_User_Thread函数和Setup_User_Thread函数。Setup_User_Thread()函数的功能是为进程初始化内核堆栈,堆栈中是为进程首次进入用户态运行时设置处理器状态要使用的数据。Start_User_Thread()是一个高层操作,该函数使用User_Context对象开始一个新进程。(6)“src/GeekOS/kthread.c”文件中主要是实现用户程序要求内核进行服务的一些系统调用函数定义。要求用户实现的有Sys_Exit()函数、Sys_PrintString()函数、Sys_GetKey()、Sys_SetAttr()、Sys_GetCursor()、Sys_PutCursor()、Sys_Spawn()函数、Sys_Wait()函数和Sys_GetPID()函数。最后,需要在main.c文件中改写生成第一个用户态进程的函数调用:Spawn_Init_Process(void)。需要注意的是:作为与用户沟通的界面,GeekOS提供了一个简单的shell,保存在PFAT文件系统内,所以GeekOS系统启动后,应启动shell程序/c/shell.exe运行,所以需要将/c/shell.exe作为可执行文件传递给Spawn函数的program参数,创建第一个用户态进4程,然后由它来创建其他进程。添加代码运行成功后,GeekOS就可以挂载shell,并能运行测试文件c.exe和b.exe。5.项目设计原理5.1项目0的原理项目0的实现主要由以下步骤完成(/mnt/hgfs/zj/project0/src/geekos/main.c中完成):1.编写一个C语言函数,函数功能是:接收键盘输入的按键,并将键值在显示器显示出来,当输入ctrl+d就退出;2.在Main函数体内调用Start_Kernel_Thread函数,将步骤1编写的函数地址传递给参数startFunc,利用Setup_Kernel_Thread函数建立一个待运行的线程。3.在Linux环境下编译系统得到GeekOS镜像文件。4.编写一个相应的bochs配置文件。5.在bochs中运行GeekOS系统显示结果。5.2项目1的原理ELF文件格式如图4-1:图4-1文件最开始是ELF文件头结构,跟着是ProgramesHeader表,接下来是各个区段,最后是可选的区段头表。ELF文件是x86Linux系统下的一种常用目标文件(objectfile)格式,有三种主要类型:(1)适于连接的可重定位文件(relocatablefile),可与其它目标文件一起创建可执行文件和共享目标文件。(2)适于执行的可执行文件(executablefile),用于提供程序的进程映像,加载的内存执行。(3)共享目标文件(sharedobjectfile),连接器可将它与其它可重定位文件和共享目标文件连接成其它的目标文件,动态连接器又可将它与可执行文件和其它共享目标文件结合起来创建一个进程映像。为了方便和高效,ELF文件内容有两个平行的视图:一个是程序连接角度,另一个是程序运行角度。GeekOS中的用户程序全部在系统的编译阶段完成编译和连接,形成可执行文件,用户可执行文件保存在PFAT文件系统中。内存中的可执行文件镜像如图4-2:5图4-2内核线程的建立流程如图4-3:图4-3本项目要完成的就是在系统启动后,从PFAT文件系统将可执行文件装