GeekOS操作系统的研究与实现.docx
- 文档编号:28357076
- 上传时间:2023-07-10
- 格式:DOCX
- 页数:11
- 大小:44.04KB
GeekOS操作系统的研究与实现.docx
《GeekOS操作系统的研究与实现.docx》由会员分享,可在线阅读,更多相关《GeekOS操作系统的研究与实现.docx(11页珍藏版)》请在冰豆网上搜索。
GeekOS操作系统的研究与实现
一实验目的--------------------------------------------------------------------3
二项目的设计要求-----------------------------------------------------------3
三开发环境的建立-----------------------------------------------------------3
四项目设计原理--------------------------------------------------------------5
五项目设计的具体实现-----------------------------------------------------6
六系统编译运行的原理及结果--------------------------------------------8
七遇到的问题及解决方法-------------------------------------------------10八课程设计总结--------------------------------------------------------------11
一实验目的
实践出真知!
这是马克思的至理名言。
经过一个学期的操作系统理论学习,我们基本上掌握了操作系统的理论基础知识,但是,操作系统课程的内容不仅仅涉及理论、算法,更重要的是用技术去实现算法并对其加以实现和应用。
此次课程设计,通过搭建Linux实验平台,对专门为操作系统课程教学而设计的操作系统——GeekOS的项目代码的补充和完善,从浅到深,由表面到内涵地去理解操作系统的设计思想,理解操作系统内核工作的基本原理。
在完成项目的过程中,通过动手操作,使得我们能够在动手查阅资料、思考排难等探索性活动中进一步理解操作系统的抽象概念,并进一步理解操作系统复杂的结构和工作原理。
具体的来说,对于项目0,应该熟悉GeekOS的项目编译,调试和运行环境,掌握GeekOS的运行工作过程,对于项目1,应该熟悉ELF文件格式,了解GeekSO系统如何将ELF格式的用户可执行程序装入到内存,建立内核进程并运行的实现技术。
二项目的设计要求
1Project0项目设计要求:
(1)搭建GeekOS的编译和调试平台,掌握GeekOS的内核进程工作原理。
(2)熟悉键盘操作函数,编程实现一个内核进程。
该进程的功能是:
接受键盘输入的字符并显示在屏幕上,当按ctrl+D时,结束进程的运行。
2Project1项目设计要求:
(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系统进行安装。
首先先安装VMwareworkstation,运行Vmware,新建一个虚拟机,以便安装Linux系统。
然后在虚拟机上安装Ubuntu系统。
系统安装的时候会默认安装了GCC,所以后面不必再重新安装GCC。
2安装c/c++编译环境
(1)修改使用国内镜像更新源。
在命令行终端中输入sudogedit/etc/apt/sources.list,打开“文本编辑器编辑源列表”。
在最后一行添加下列国内镜像更新源:
保存,即可。
(2)终端中输入sudoapt-getupdate重新获取软件包列表。
(3)在终端输入sudoapt-getintallbuild-essential下载安装build-essential包。
(4)安装NASM
在终端执行udoapt-getinstallnasm,
(5)安装Bochs:
在终端执行sudoapt-getinstallbochs
在终端执行sudoapt-getinstallbochs-x
(6)编译GeekOS
/src/project0/build目录
执行makedepend
执行make
成功之后在build目录下生成fd.img文件。
(7)修改Makefile
1)搜索到“-werror”,进行注释或者删掉。
2)搜索到“TARGET_CC:
=$(TARGET-CC-PREFIX)gcc”
在后面添加“-fno-stack-peotector”,保存。
(8)1.编辑boches配置文件
输入gedit.bochsrc
在中修改模拟器的BIOS和显示系统的BIOS文件的路径:
romimage:
file=/usr/share/bochs/BIOS-bochs-latest
vgaromimage:
file=/usr/share/vgabios/vgabios.bin
保存,退出gedit
(8)在Bochs中运行GeekOS
在build目录中执行“bochs”命令,即可看见“WelcometoGeekOS!
”的绿色标语等信息。
此时,说明GeekOS启动运行成功。
四项目设计原理
对于项目0:
1利用bochs模拟计算机执行一个操作系统软件。
其中BIOS-bochs-lastest文件模拟bochs硬件的BIOS。
VGABIOS-lgpl-lastest文件模拟bochs显示系统的BIOS。
bochsrc.txt描述模拟器硬件配置的配置。
2利用GeekOS提供的键盘处理函数keyboard.h与keyboard.c等进行键盘常用功能的模拟。
其中,在里面提供了一个功用函数KeycodeWait_For_Key(void),循环等待一个键盘事件,然后返回一个16位的数据Keycode型的,在里定义了所有的键盘代码。
Read_Key(Keycode*keycode)函数可以处理队列键盘按键,可以保存到队列中并输出。
另外,需要重点关Start_Kernel_Thread函数。
函数的参数startFunc是一个Thread_Start_Func类型的函数指针,其定义在kthread.h中:
Typedefvoid(*Thread_Start_Func)(ulong_t,arg);
该函数指针指向一个无返回值,参数为ulong_t类型的函数。
函数的功能是以参数Start_Func指向的代码为进程体生成一个内核进程。
再有,对于Read_Key()函数,其定义为:
boolRead_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()等函数的功能,完成用户上下文的创建、删除,用户堆栈初始化等。
可执行文件是通过源程序被编译成目标文件,多给目标文件连接生成的,然后被加载到内存运行。
可执行文件包含一些基本的要素——代码、数据、重定位信息和符合信息。
以及一些可选辅助信息,如调试信息、硬件信息等。
因此,通过分析可执行文件的信息,然后为其分配内存并载入建立内核线程,供系统调度运行。
五项目设计的具体实现
1Project0项目的具体实现
根据实验原理,可以知道项目0的实现主要分为两个步骤完成(主要工作都在项目0的/src/geekos/main.c中完成)
(1)编写一个函数,在中添加进去。
函数的功能是:
接收键盘输入的按键,并将键值显示到显示器的函数,当输入Ctrl+D就退出。
函数代码如下:
voidProject0()
{Print("ToExithitCtrl+d.\n");
Keycodekeycode;
while
(1)
{
if(Read_Key(&keycode))
{
if(!
((keycode&KEY_SPECIAL_FLAG)||(keycode&KEY_RELEASE_FLAG)))
{intasciiCode=keycode&0xff;
if((keycode&KEY_CTRL_FLAG)==KEY_CTRL_FLAG&&asciiCode=='d')
{Print("\n---------SEEYOU!
--------\n");
Exit
(1);
}else
{
Print("%c",(asciiCode=='\r')?
'\n':
asciiCode);
}
}
}
}
}
(2)首先注释Main()函数中TODO宏,并调用Start_Kernel_Thread函数,将步骤1编写的函数地址传递给参数,建立一个内核级进程
structKernel_Thread*thread;
thread=Start_Kernel_Thread(&project0,0,PRIORITY_NORMAL,false);
(3)保存main()函数。
2Project1项目的具体实现
1完成配置文件的修改
config_interface:
textconfig
romimage:
file=/usr/share/bochs/BIOS-bochs-latest
megs:
8
vgaromimage:
file=/usr/share/vgabios/vgabios.bin
floppya:
1_44=./fd.img,status=inserted
ata0:
enabled=1,ioaddr1=0x1f0,ioaddr2=0x3f0,irq=14
ata1:
enabled=0,ioaddr1=0x170,ioaddr2=0x370,irq=15
ata0-master:
type=disk,path="diskc.img",mode=flat,cylinders=40,heads=8,spt=64
boot:
a
log:
./bochs.out
vga_update_interval:
300000
keyboard_serial_delay:
250
keyboard_paste_delay:
100000
private_colormap:
enabled=0
2完成makefile文件的修改,步骤同Project0。
3完成/geekos/elf.C中函数Parse_ELF_Executable()。
intParse_ELF_Executable(char*exeFileData,
ulong_texeFileLength,
structExe_Format*exeFormat)
{
inti;
elfHeader*head=(elfHeader*)exeFileData;
programHeader*proHeader=(programHeader*)(exeFileData+head->phoff);
KASSERT(exeFileData!
=NULL);
KASSERT(exeFileLength>head->ehsize+head->phentsize*head->phnum)
KASSERT(head->entry%4==0);
exeFormat->numSegments=head->phnum;
exeFormat->entryAddr=head->entry;
for(i=0;i
{
exeFormat->segmentList[i].offsetInFile=proHeader->offset;
exeFormat->segmentList[i].lengthInFile=proHeader->fileSize;
exeFormat->segmentList[i].startAddress=proHeader->vaddr;
exeFormat->segmentList[i].sizeInMemory=proHeader->memSize;
exeFormat->segmentList[i].protFlags=proHeader->flags;
proHeader++;
}
return0;
}
六系统编译运行的原理及结果
1Project0运行结果:
(1)修改main()函数以后,重新生成镜像文件。
在终端,Build目录下:
输入以下命令
$makeclear
$makedepend
$make
此时geekos-\src\project0\build生成镜像文件。
(4)启动bochs
在终端,Build目录下:
输入以下命令
$bochs
即可看见如下的Geekos界面。
(5)按下ctrl+d键,此时出现如下的界面。
原理:
系统正常运行,调度第一个内核级进程,完成键盘输入并在回车后输出敲击键盘次数。
Ctrl+d退出程序。
2Project1运行结果
Project1运行结果:
原理:
系统启动完成,创建一个内核级进程,执行一个EXE程序。
具体过如下:
首先将指定的文件读入内存缓冲区,并且调用函数对文件格式进行分析。
分析完成就把可执行程序的程序段和数据段装入内存,开始执行。
在项目1的./src/user目录先有一个a.c文件,编译Geekos后,即是make后,可以获得可执行程序a.exe,并写入PFAT文件系统,路径为/c/a.exe、项目将此作为袋装入的可执行文件,启动bochs就可看到以上的内容,说明,项目1完成。
七遇到的问题及解决方法
1bochsrc配置文件出错
刚开始仅仅只是修改了.bochsrc配置文件中模拟器的BIOS和显示系统的BIOS文件的路径:
真正执行的时候,发现多了提示出错。
后来发现是没有必要留下以下配置内容,把它们一一注释掉就可以了。
对于project1遇到同样的问题也一样进行解决。
2修改了main()函数等以后,新添加的功能没有实现
这主要是因为没有重新生成镜像文件。
在build目录下,输入以下命令
$makeclear
$makedepend
$make
此时geekos-\src\project0\build即可生成新的镜像文件。
如果不先执行makeclear命令进行清空的话,直接执行make命令就会出现“make:
nothingtobedonefor“all”的出错信息。
3没有进行makefile文件的修改,也不能顺利执行完成任务。
八课程设计总结
这么课设是在时间十分的紧张,一方面进行期末考试,一方面进行CCNA培训测试,的情况下完成的。
总的来说自己感觉不太满意,因为时间有限,仅仅只是完成了Project0和Project1两个项目。
没有能够对后面的几个项目进行研究分析。
在完成前面两个项目的过程中,还是发现了不少的问题。
一是自己对LINUX操作系统没有达到十分熟悉的程度。
只能按照一般的步骤进行一步步搭建,二是在构建项目的环境时,发现自己其实很多东西不太理解,经过多次向周围同学请教才完成了各项配置。
但是经过这次的课程设计,自己加深了对LINUX的了解是使用。
总的来说,此次课程设计,不仅仅是对操作系统理论知识的一次实践活动,不仅仅了解的Geekos系统的环境搭建,也进一步了解了操作系统的运行工作机制,也对我们自学能力的一种考验,让我们很好的发挥了自己的自学能力,锻炼了我们的的思考解决问题的能力,也锻炼的了我们的耐心。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- GeekOS 操作系统 研究 实现