Greekos操作系统实验

上传人:re****.1 文档编号:564927082 上传时间:2023-07-31 格式:DOCX 页数:22 大小:260.75KB
返回 下载 相关 举报
Greekos操作系统实验_第1页
第1页 / 共22页
Greekos操作系统实验_第2页
第2页 / 共22页
Greekos操作系统实验_第3页
第3页 / 共22页
Greekos操作系统实验_第4页
第4页 / 共22页
Greekos操作系统实验_第5页
第5页 / 共22页
点击查看更多>>
资源描述

《Greekos操作系统实验》由会员分享,可在线阅读,更多相关《Greekos操作系统实验(22页珍藏版)》请在金锄头文库上搜索。

1、操作系统实验报告目录1. 实验目的22. 开发环境的搭建22.1在虚拟机上安装Linux22.2安装VMware Tools和实现文件共享22.3 Bochs PC模拟器的安装23. 项目具体实现33.1项目033.1.1项目设计要求33.1.2项目设计原理33.1.3项目设计的具体实现43.1.4系统编译运行的原理及结果53.2项目163.2.1项目设计要求63.2.2项目设计原理73.2.3项目设计的具体实现83.2.4系统编译运行的原理及结果93.3 项目 2103.3.1项目设计要求103.3.2项目设计原理113.3.3项目设计的具体实现113.3.4系统编译运行的原理及结果184.

2、 遇到的问题及解决办法2 05. 实验总结2 01. 实验目的操作系统是管理系统软件,硬件资源,控制程序运行,改善人机界面及交互,提供各种服 务,合理组织计算机工作流程和为用户有效地使用计算机提供良好运行环境的系统软件,它 为用户使用计算机提供了一个方便,灵活,安全,可靠的工作环境,它也是其他运用软件赖以 存在的基础。操作系统是计算机科学与技术专业核心的课程,涉及到很多方面的知识,概念 和原理抽象。在课程学习过程中,主要是学习理论知识,而操作系统实验则从理论转向实 践,让我们亲自去编写一个操作系统内核,从而可以更加深入的理解操作系统软件的实现 过程,增强了实践动手能力。本实验主要要求我们熟悉G

3、eekOs的项目编译、调试和运行环境,掌握GeekOs运行工 作过程。熟悉ELF文件格式,了解GeekOs系统如何将ELF格式的用户可执行程序装入到内 存,建立内核线程并运行的实现技术。扩充GeekOs操作系统内核,使得系统能过支持用户 级进程的动态创建和执行。2. 开发环境的搭建在实现这个过程中。由于Geekos是开源的基于linux系统开发的操作系统,我们需要 用到linux下的编译环境。所以需要搭建linux环境。为了实现与Windows下的文件进行共 享,需要安装VMware Tools软件包。在运行的时候需要bochs pc模拟器来模拟操作系 统,所以也需要安装bochs pc模拟器

4、。2.1在虚拟机上安装Linux本次环境的搭建是采用在Windows环境下先安装一个PC虚拟机,然后在虚拟机上安装 Linux操作系统。本次实验选择安装的虚拟机软件VMware,安装过程则为首先在相应的网站下载此安装 软件,然后其根据提示安装。安装完成后就会在桌面上显示一个虚拟机图标 VMware-workstation。VMware安装完成后,可以开始建立虚拟机,每新建一个虚拟机都会要求建立一个配置文 件,这个配置文件相当于电脑中的硬件配置表,用户可以在配置文件中决定虚拟机的硬盘如 何配置,内在多大,准备运行哪种操作系统,是否有网络等。其中中安装的过程中要选取实验 需要的相应组件进行安装,其

5、中本次实验必须需要的组件是:AWK、Diff3、Egrep、gcc、 GNUbinutils、 GNUMake、 Perl、 NASM。2.2 安装 VMware Tools在虚拟机上安装VMware Tools,就相当于给Linux安装各种驱动程序。此步的主要目的 就是为了以后的工程运行时能够实现与Windows下的文件进行共享,因为bochs PC模拟器要 在Windows下运行,所以这里的文件就只能通过这一步的共享,从而达到在Linux下工程运 行后得到的build下的镜像文件替代源文件,从而使得bochs PC模拟器能够得到所需的镜像 文件。2.3安装Bochs PC模拟器Bochs

6、PC模拟器:用来运行GeekOS系统。安装此软件只需设定好想安装到的文件目录后一直点下一步就可以安装成功。最后设置 bochsrc. txt文件。根据实验的需要,一般只需要修改以下几项:(1)vgaromimage: $BXSHARE/VGABIOS-lgpl-latest(2)romimage: file=$BXSHARE/BIOS-bochs-latest, address=0xf0000(3)floppya: 1_44=fdx.img, status二inserted boot: floppy(4)做Project 1的时候,需要添加一个磁盘镜像at aO-mas ter:ty pe二d

7、isk,mode二fla t,pa th二diskx.img,cylinders=615,heads=6,sp t=17 配置完bochsrc. txt以后,而且有了从工程生成的操作系统Geekos就可以用bochs软件模 拟了。到bochs的安装目录下,输入bochs命令,选择6开始模拟。如果你的操作系统编译 成功,就可以得到想要的结果。3. 项目具体实现3.1项目0本项目主要目的是要熟悉GeekOS的项目编译、调试和运行环境,掌握GeekOS运行工作 过程。3.1.1项目设计要求(1) 搭建GeekOS的编译和调试平台,掌握GeekOS的内核进程工作原理。(2) 熟悉键盘操作函数,编程实现

8、一个内核进程。该进程的功能是:接收键盘输入的字 符并显示到屏幕上,当输入Ctrl+D时,结、束进程的运行。3.1.2项目设计原理在这个项目里面主要了解两部分的内容:内核线程和键盘处理,相应的文件是thread.c 和 keyboard.c。Geekos系统的默认内核只支持内核态的线程,在系统初始化的时候,main函数分别执 行了 4个内核函数,一个内核函数负责软驱中断,一个复杂键盘中断,还有两个负责进程 调度。函数St ar t_Kernel_Thread()其可以生成一个内核线程:1 内核线程结构的定义如下: struct Kernel_Thread unsigned long esp;vo

9、latile unsigned long numTicks; int priority;DEFINE_LINK( Thread_Queue, Kernel_Thread ); void* stackPage;struct User_Context* userContext;struct Kernel_Thread* owner;int refCount; Boolean alive;struct Mutex joinLock;struct Condition joinCond; ;esp字段用来存放一个线程挂起的堆栈指针;stackPage字段指向内核线程的堆栈页面numTicks和prior

10、ity分别被调度程序用来实现基于先占权和基于优先权的时间片调 度。DEFINE_LINK宏定义一个内核线程在线程队列上时的前一个和后一个字段。userContext字段如果不为空,则指向一个线程用户环境,它是一个允许线程执行用 户模式的代码和数据的组合段。内核线程有两种方式创建。在内核里独立运行的线程可通过St ar t_Kernel_Thread () 函数来创建,该函数通过一个指针指向一个执行线程体的启动函数。线程所执行的用户模 式的程序由St ar t_ User_Thread ()函数创建,并且用一指针指向一个用户环境和用户环境内存中代码入口点的地址。调用Exit ()函数销毁内核线程

11、。入口参数分别为:函数地址,函数参数(无参数就写0),优先级设定,线程属性(false 为内核线程,true为用户线程),返回值Mythread的数据类型是static structKernel_Thread* thread2. St ar t_Kernel_Thread 完成的工作:/根据优先级创建一条线程 /为线程分配内存空间detached)kthread)Create_Thread(priority, detached)kthread = Alloc_Page()stackPage = Alloc_Page()Init_Thread(kthread, stackPage, priori

12、ty,arg)/配置内核线程的初始化/设置线程运行的原子性操作/禁止中断/线程运行/使能中断Add_To_Back_Of_All_Thread_List(&s_allThreadList, Setup_Kernel_Thread(kthread, startFunc.Make_Runnable_Atomic(kthread); Disable.Interrupts();Make_Runnable(kthread);Enable.Interrupts();3. Geekos处理键盘代码在keyboard.c里面提供了一个功用函数Keycode Wait_For_Key(void),循环等待一个

13、键盘事件,然后返回一个16位的数据Keycode型的,在keyboard.h里定义了所有的键盘代 码。Read_Key(Keycode* keycode)函数可以处理队列键盘按键,可以保存到队列中并输出。 关于Keycode的定义是:低8位用来表示键盘值,通过s_scanTableNoShif t和 s_scanTableWithShift这两个数组来转换相应的键盘码为所表示字符的ASCII码,高六位分 别是:KEY_SPECIAL_FLAG (特殊键,比如F1,F2)用返回的值key&0x0100就可以判断是否按下 特殊健,1为有效,说明是特殊健,0则不是,以下的几种情况类似KEY_KEYP

14、AD_FLAG(小键盘键)0x0200KEY_SHIFT_FLAG(左,右 SHIFT)0x1000KEY_ALT_FLAG(左,右 ALT)0x2000KEY_CTRL_FLAG(左,右 CTRL)0x4000KEY_RELEASE_FLAG(键弹起来标志位)0x80003项目设计的具体实现projcet0项目主要是对main.c文件中的键盘相应的实现。我们创建函数 keyboard()。下面是具体的代码。void keyboard(ulong_t arg)Keycode key;Print(Please Enter the characters. press Ctrl+d to exitn

15、n); while(true)Set_Current_Attr(ATTRIB(BLACK, RED|BRIGHT); key=Wait_For_Key();if(key=(KEY_CTRL_FLAG+d)Print(nnKey Endn);break;if(!(key &KEY_RELEASE_FLAG )& !(key &KEY_SPECIAL_FLAG)Pri nt( %c,key); void Main(struct Boot_Info* bootinfo)Ini t_BSS();Init_ Screen();Init_Mem(bootInfo);Ini t_CRC32();Ini t_ TSS();Init_Interrupts();Init_ Scheduler。;Init_ Traps();Init_ Timer();Init_ Keyboard。;Set_Current_Attr(ATTRIB(BLACK, GREEN|BRIGHT);Print(nnWelcome to su

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 学术论文 > 其它学术论文

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号