GeekOS操作系统的研究与实现.doc_第1页
GeekOS操作系统的研究与实现.doc_第2页
GeekOS操作系统的研究与实现.doc_第3页
GeekOS操作系统的研究与实现.doc_第4页
GeekOS操作系统的研究与实现.doc_第5页
免费预览已结束,剩余5页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

目 录一 实验目的- 3二 项目的设计要求-3三 开发环境的建立-3四 项目设计原理-5五 项目设计的具体实现-6六 系统编译运行的原理及结果-8七 遇到的问题及解决方法-10八 课程设计总结-11一 实验目的实践出真知!这是马克思的至理名言。经过一个学期的操作系统理论学习,我们基本上掌握了操作系统的理论基础知识,但是,操作系统课程的内容不仅仅涉及理论、算法,更重要的是用技术去实现算法并对其加以实现和应用。 此次课程设计,通过搭建Linux实验平台,对专门为操作系统课程教学而设计的操作系统GeekOS的项目代码的补充和完善,从浅到深,由表面到内涵地去理解操作系统的设计思想,理解操作系统内核工作的基本原理。在完成项目的过程中,通过动手操作,使得我们能够在动手查阅资料、思考排难等探索性活动中进一步理解操作系统的抽象概念,并进一步理解操作系统复杂的结构和工作原理。 具体的来说,对于项目0,应该熟悉GeekOS的项目编译,调试和运行环境,掌握GeekOS的运行工作过程,对于项目1,应该熟悉ELF文件格式,了解GeekSO系统如何将ELF格式的用户可执行程序装入到内存,建立内核进程并运行的实现技术。二 项目的设计要求1 Project0项目设计要求:(1) 搭建GeekOS的编译和调试平台,掌握GeekOS的内核进程工作原理。(2) 熟悉键盘操作函数,编程实现一个内核进程。该进程的功能是:接受键盘输入的字符并显示在屏幕上,当按ctrl+D时,结束进程的运行。2 Project1项目设计要求:(1) 修改/GeekOS/elf.c文件:在函数Parse_ELF_Executable()中添加代码,分析ELF格式的可执行文件(包括分析得出ELF文件头、程序头、获取可执行文件长度,代码段、数据段等信息),并填充Exe_Format数据结构中的域值。(2) 掌握GeekOS在核心态运行用户程序的原理,为Project2的实现做准备三 开发环境的建立1 在虚拟机上安装Linux操作系统GeekOS是一个基于X86架构的PC机上运行的微操作系统内核,内核简单却又兼备实用性,是一个用C语言开发的操作系统,可以运行在真正的X86PC硬件平台。每个项目需要在Linux环或者UNIX环境下对其进行功能扩充。Ubuntu 是一个由社区开发的基于linux的操作系统,其包含了我们一般所需的所有程序:无论是文字处理和电子邮件,还是 Web 服务和编程工具。所以选择其作为Linux系统进行安装。首先先安装VMware workstation,运行Vmware,新建一个虚拟机,以便安装Linux系统。然后在虚拟机上安装Ubuntu系统。系统安装的时候会默认安装了GCC,所以后面不必再重新安装GCC。2 安装c/c+编译环境(1)修改使用国内镜像更新源。在命令行终端中输入sudo gedit /etc/apt/sources.list,打开“文本编辑器编辑源列表”。在最后一行添加下列国内镜像更新源:deb-src /Ubuntu/ jaunty-updates main multiverse restricted universe 保存,即可。(2)终端中输入sudo apt-get update 重新获取软件包列表。(3)在终端输入 sudo apt-get intall build-essential 下载安装 build-essential包。(4)安装NASM在终端执行udo apt-get install nasm,(5)安装Bochs:在终端执行 sudo apt-get install bochs在终端执行 sudo apt-get install bochs-x(6)编译GeekOS1.进入geekos-0.3.0/src/project0/build目录执行 make depend执行 make成功之后在build 目录下生成fd.img文件。(7)修改Makefile1) 搜索到“-werror”,进行注释或者删掉。2) 搜索到“TARGET_CC :=$(TARGET-CC-PREFIX)gcc”在后面添加“-fno-stack-peotector”,保存。(8)1.编辑boches配置文件 输入 gedit .bochsrc在打开的.bochsrc配置文件中修改模拟器的BIOS和显示系统的BIOS文件的路径:romimage: file=/usr/share/bochs/BIOS-bochs-latestvgaromimage: file=/usr/share/vgabios/vgabios.bin保存,退出 gedit(8)在Bochs中运行GeekOS在build目录中执行“bochs ”命令,即可看见“Welcome to GeekOS!”的绿色标语等信息。此时,说明GeekOS启动运行成功。四 项目设计原理对于项目0:1 利用bochs模拟计算机执行一个操作系统软件。其中BIOS-bochs-lastest文件模拟bochs硬件的BIOS。VGABIOS-lgpl-lastest文件模拟bochs显示系统的BIOS。bochsrc.txt描述模拟器硬件配置的配置。2 利用GeekOS提供的键盘处理函数keyboard.h与keyboard.c等进行键盘常用功能的模拟。其中,在keyboard.c里面提供了一个功用函数Keycode Wait_For_Key(void),循环等待一个键盘事件,然后返回一个16位的数据 Keycode型的, 在keyboard.h里定义了所有的键盘代码。Read_Key(Keycode* keycode)函数可以处理队列键盘按键,可以保存到队列中并输出。另外,需要重点关Start_Kernel_Thread函数。函数的参数startFunc是一个Thread_Start_Func类型的函数指针,其定义在kthread.h中:Typedef void (*Thread_Start_Func) (ulong_t,arg);该函数指针指向一个无返回值,参数为ulong_t类型的函数。函数的功能是以参数Start_Func指向的代码为进程体生成一个内核进程。再有,对于Read_Key()函数,其定义为:bool Read_Key(Keycode *keycode);作用是轮查键盘事,如果捕获到键盘事件,则返回true,并且将按键码保存到参数 keycode地址中。对于项目1: 该项目要完成对用户进程的支持。实现Destroy_User_Context(),Load_User_Programe(),Copy_From_User(),Copy_To_User(),Spawn(),Switch_To_Address_Space(),Start_User_Thread(),Setup_User_Thread()等函数的功能,完成用户上下文的创建、删除,用户堆栈初始化等。可执行文件是通过源程序被编译成目标文件,多给目标文件连接生成的,然后被加载到内存运行。可执行文件包含一些基本的要素代码、数据、重定位信息和符合信息。以及一些可选辅助信息,如调试信息、硬件信息等。因此,通过分析可执行文件的信息,然后为其分配内存并载入建立内核线程,供系统调度运行。五 项目设计的具体实现1 Project0项目的具体实现根据实验原理,可以知道项目0的实现主要分为两个步骤完成(主要工作都在项目0的/src/geekos/main.c中完成)(1) 编写一个函数,在/src/geekos/main.c中添加进去。函数的功能是:接收键盘输入的按键,并将键值显示到显示器的函数,当输入Ctrl+D就退出。函数代码如下:void Project0() Print(To Exit hit Ctrl + d.n); Keycode keycode; while(1) if( Read_Key(&keycode) ) if(!( (keycode & KEY_SPECIAL_FLAG) | (keycode & KEY_RELEASE_FLAG) ) int asciiCode = keycode & 0xff; if( (keycode & KEY_CTRL_FLAG)=KEY_CTRL_FLAG & asciiCode=d) Print(n-SEE YOU !-n); Exit(1); else Print(%c,(asciiCode=r) ? n : asciiCode); (2) 首先注释Main()函数中TODO宏,并调用Start_Kernel_Thread函数,将步骤1编写的函数地址传递给参数,建立一个内核级进程 struct Kernel_Thread *thread; thread = Start_Kernel_Thread(&project0,0,PRIORITY_NORMAL,false);(3) 保存main()函数。2 Project1项目的具体实现1 完成配置文件的修改config_interface: textconfigromimage: file=/usr/share/bochs/BIOS-bochs-latestmegs: 8vgaromimage: file=/usr/share/vgabios/vgabios.binfloppya: 1_44=./fd.img, status=insertedata0: enabled=1, ioaddr1=0x1f0, ioaddr2=0x3f0, irq=14ata1: enabled=0, ioaddr1=0x170, ioaddr2=0x370, irq=15ata0-master: type=disk, path=diskc.img, mode=flat, cylinders=40, heads=8, spt=64boot: alog:./bochs.outvga_update_interval: 300000keyboard_serial_delay: 250keyboard_paste_delay: 100000private_colormap: enabled=02 完成makefile文件的修改,步骤同Project0。3 完成/geekos/elf.C中函数Parse_ELF_Executable()。int Parse_ELF_Executable(char *exeFileData,ulong_t exeFileLength, struct Exe_Format *exeFormat) int i; elfHeader *head=(elfHeader*)exeFileData; programHeader *proHeader=(programHeader*)(exeFileData+head-phoff); KASSERT(exeFileData!=NULL); KASSERT(exeFileLengthhead-ehsize+head-phentsize*head-phnum) KASSERT(head-entry%4=0); exeFormat-numSegments=head-phnum; exeFormat-entryAddr=head-entry; for(i=0;iphnum;i+) exeFormat-segmentListi.offsetInFile=proHeader-offset; exeFormat-segmentListi.lengthInFile=proHeader-fileSize; exeFormat-segmentListi.startAddress=proHeader-vaddr; exeFormat-segmentListi.sizeInMemory=proHeader-memSize; exeFormat-segmentLtFlags=proHeader-flags; proHeader+; return 0; 六 系统编译运行的原理及结果1 Project0运行结果:(1) 修改main()函数以后,重新生成镜像文件。在终端,Build目录下:输入以下命令$ make clear$ make depend$ make 此时geekos-0.3.0srcproject0build生成镜像文件fd.img。(4) 启动bochs在终端,Build目录下:输入以下命令$ bochs即可看见如下的Geekos界面。(5)按下ctrl+d键,此时出现如下的界面。原理:系统正常运行,调度第一个内核级进程,完成键盘输入并在回车后输出敲击键盘次数。Ctrl+d退出程序。2 Project1运行结果Project1运行结果:原理:系统启动完成,创建一个内核级进程,执行一个EXE程序。具体过如下:首先将指定的文件读入内存缓冲区,并且调用函数对文件格式进行分析。分析完成就把可执行程序的程序段和数据段装入内存,开始执行。在项目1的./src/user目录先有一个a.c文件,编译Geekos后,即是make后,可以获得可执行程序a.exe,并写入PFAT文件系统,路径为/c/a.exe、项目将此作为袋装入的可执行文件,启动bochs就可看到以上的内容,说明,项目1完成。七 遇到的问题及解决方法1 bochsrc配置文件出错刚开始仅仅只是修改了.bochsrc配置文件中模拟器的BIOS和显示系统的BIOS文件的路径:romimage: file=/usr/share/bochs/BIOS-bochs-latestvgaromimage: file=/usr/share/vgabios/vgabios.bin真正执行的时候,发现多了提示出错。后来发现是没有必要留下以下配置内容,把它们一一注释掉就可以了。对于 project1遇到同样的 问题也一样进行解决。2 修改了mai

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论