最新GeekOS课程设计报告.doc
《最新GeekOS课程设计报告.doc》由会员分享,可在线阅读,更多相关《最新GeekOS课程设计报告.doc(112页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、Four short words sum up what has lifted most successful individuals above the crowd: a little bit more.-author-dateGeekOS课程设计报告设计项目0编号: GeekOS操作系统的研究与实现 题 目: GeekOS操作系统的研究与实现 系 别: 计算机科学与工程学院 专 业: 网络工程 学生姓名: 学 号: 指导教师: 2011年 3 月 5 日目 录(三号、黑体、居中、目录两字空四格、与正文空一行)一、课程设计环境 4二、设计项目0 5三、设计项目1 7四、设计项29五、遇到问题
2、及解决方法.23六、总结24一、课程设计环境本次课设是在虚拟机上安装Linux进行开发调试,具体安装使用方法如下:、安装linux虚拟机本次课设的虚拟机是运行在Vmware WorkStation上的,网上下载及安装好 Vmware 后,下载Linux镜像文件后,即可按提示即可安装。、GeekOS:是一个基于X86架构的PC机上运行的微操作系统内核,由美国 马理兰大学的教师开发,是一个用C语言开发的操作系统, GeekOS主要用于操作系统课程设计,目的是使学生能够实际动手参与到一个操作系统的开发工作中。GeekOS的使用:打开linux虚拟机,直接解压GeekOS压缩包就可使用,无需安装。、B
3、ochs安装和使用:在Linux系统中需先解压软件包,然后再配置编译生成系统文件。二、设计项目0一、项目设计目的 熟悉GeekOS的项目编译、调试和运行环境,掌握GeekOS运行工作过程。二、设计任务 熟悉键盘操作函数,编程实现一个内核进程。该进程的功能是:接收键盘输入的字符并显示到屏幕上,当输入ctrl+d时,结束进程的运行。三、具体过程 1、 -修改main.c的代码- /在main.c内增加该函数void project0() Print(To Exit hit Ctrl + d.n); Keycode keycode; while(1) if( Read_Key(&keycode) )
4、 /读取键盘按键状态 if(!( (keycode & KEY_SPECIAL_FLAG) | (keycode & KEY_RELEASE_FLAG) ) /只处理非特殊按键的按下事件 int asciiCode = keycode & 0xff; /低位为Ascii码 if( (keycode & KEY_CTRL_FLAG)=KEY_CTRL_FLAG & asciiCode=d) /按下Ctrl键 Print(n-BYE!-n); Exit(1); else Print(%c,(asciiCode=r) ? n : asciiCode); /在main函数体内调用Start_Kerne
5、l_Thread函数struct Kernel_Thread *thread;thread = Start_Kernel_Thread(&project0,0,PRIORITY_NORMAL,false);-2、在build目录下编译得到镜像文件fd.img #make3、 编写brochs 配置文件 vgaromimage: file=/usr/share/bochs/VGABIOS-lgpl-latestromimage: file=/usr/share/bochs/BIOS-bochs-latest, address=0xf0000megs: 8boot: afloppya: 1_44=
6、fd.img, status=inserted#floppya: 1_44=fd_aug.img, status=insertedlog: ./bochs.outkeyboard_serial_delay: 200floppy_command_delay: 500vga_update_interval: 300000ips: 1000000mouse: enabled=0private_colormap: enabled=0i440fxsupport: enabled=0 4、在brochs中运行GeekOS系统显示结果 三、 设计项目1一、项目设计目的 熟悉ELF文件格式,了解GeekOS系
7、统如何将ELF格式的可执行程序装 入到内存,建立内核进程并运行的实现技术。二、 具体过程 修改/geekos/elf.c文件:在函数Parse_ELF_Executable( )中添加代码,分析 ELF格式的可执行文件(包括分析得出ELF文件头、程序头,获取可执行文 件长度,代码段、数据段等信息),并填充Exe_Format数据结构中的域值1、elf.c:将ELF格式的可执行程序装入到内存,建立内核进程并运行.-elf.c- int Parse_ELF_Executable(char *exeFileData, ulong_t exeFileLength, struct Exe_Format
8、*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
9、-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-segmentListi.protFlags=proHeader-flags; proHe
10、ader+;return 0; -2、 编译,成功后生成两个镜像文件:fd.img和diskc.img。 其中,Diskc.img为模拟器能引导的操作系统镜像 。3、编写相应的bochs配置文件 由于生成了diskc.img,因此配置文件需加上以下内容config_interface: textconfigmegs: 8vgaromimage: file=$BXSHARE/VGABIOS-lgpl-latestromimage: file=$BXSHARE/BIOS-bochs-latestfloppya: 1_44=./fd.img, status=insertedata0: enabled
11、=1, ioaddr1=0x1f0, ioaddr2=0x3f0, irq=14ata1: enabled=0, ioaddr1=0x170, ioaddr2=0x370, irq=15#ata2: enabled=0, ioaddr1=0x1e8, ioaddr2=0x3e0, irq=11#ata3: enabled=0, ioaddr1=0x168, ioaddr2=0x360, irq=9ata0-master: type=disk, path=diskc.img, mode=flat, cylinders=40, heads=8, spt=64#ata0-slave: type=cd
12、rom, path=/dev/cdrom, status=insertedboot: aips: 1000000log:./bochs.outvga_update_interval: 300000keyboard_serial_delay: 250keyboard_paste_delay: 100000private_colormap: enabled=0 4、在brochs中运行GeekOS系统显示结果四、 设计项目二一、项目设计目的 扩充GeekOS操作系统内核,使得系统能够支持用户级进程的动态创建和执行。二、项目2要求用户对以下几个文件进行修改: (1)“user.c” 文件中的函数Sp
13、awn(),其功能是生成一个新的用户级进程;(2)“user.c” 文件中的函数Switch_To_User_Context(),调度程序在执行 一个新的进程前调用该函数以切换用户地址空间;(3)“elf.c” 文件中的函数Parse_ELF_Executable() 。该函数的实现要求 和项目1 相同。 (4)“userseg.c”文件中主要是实现一些为实现对“src/GeekOS/user.c”中高层 操作支持的函数。 Destroy_User_Context()函数的功能是释放用户态进程占用的内存资源。 Load_User_Program()函数的功能通过加载可执行文件镜像创建新进程的
14、User_Context结构。 Copy_From_User()和Copy_To_User()函数的功能是在用户地址空间和内核地址空间之间复制数据,在分段存储器管理模式下,只要段有效,调用memcpy函数就可以实现这两个函数的功能。 Switch_To_Address_Space()函数的功能是通过将进程的LDT装入到LDT寄存器来激活用户的地址空间;三、 具体代码修改情况 -elf.c-int Parse_ELF_Executable(char *exeFileData, ulong_t exeFileLength,struct Exe_Format *exeFormat) int i; e
15、lfHeader *hdr =(elfHeader*) exeFileData; programHeader *phdr=(programHeader *)(exeFileData + hdr-phoff); struct Exe_Segment * segment= exeFormat-segmentList; for( i=0; iphnum; i+) segment-offsetInFile = phdr-offset; segment-lengthInFile = phdr-fileSize; segment-startAddress = phdr-vaddr; segment-siz
16、eInMemory = phdr-memSize; phdr+; segment+; exeFormat-numSegments = hdr-phnum; exeFormat-entryAddr = hdr-entry; return 0; TODO(Parse an ELF executable image);-kthred.c-/kthread.c文件中主要是实现用户程序要求内核进行服务的一些系统调用函数定义-/为进程初始化内核堆栈/堆栈中是为进程首次进入用户态运行时设置处理器状态要使用的数据/该函数内部调用Attach_User_Context加载用户上下文 void Setup_Use
17、r_Thread(struct Kernel_Thread* kthread, struct User_Context* userContext) /TODO(Create a new thread to execute in user mode); ulong_t eflags = EFLAGS_IF; unsigned csSelector=userContext-csSelector;/CS选择子 unsigned dsSelector=userContext-dsSelector;/DS选择子 Attach_User_Context(kthread, userContext);/调用A
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 最新 GeekOS 课程设计 报告
限制150内