操作系统实验报告1.docx

上传人:b****6 文档编号:5173044 上传时间:2022-12-13 格式:DOCX 页数:18 大小:25.99KB
下载 相关 举报
操作系统实验报告1.docx_第1页
第1页 / 共18页
操作系统实验报告1.docx_第2页
第2页 / 共18页
操作系统实验报告1.docx_第3页
第3页 / 共18页
操作系统实验报告1.docx_第4页
第4页 / 共18页
操作系统实验报告1.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

操作系统实验报告1.docx

《操作系统实验报告1.docx》由会员分享,可在线阅读,更多相关《操作系统实验报告1.docx(18页珍藏版)》请在冰豆网上搜索。

操作系统实验报告1.docx

操作系统实验报告1

华北电力大学

实验报告

|

|

 

实验名称操作系统实验

课程名称计算机操作系统

|

|

专业班级:

网络1002班学生姓名:

宋波

学号:

201009030214成绩:

指导教师:

王德文实验日期:

2012年11月

 

实验1实验环境的使用

一、实验目的

1、熟悉操作系统集成实验环境OSLab的基本使用方法。

2、练习编译、调试EOS操作系统内核以及EOS应用程序。

二、实验内容

1、启动OSLab。

双击“TevationOSLab”图标。

2、学习OSLab的基本使用方法:

2.1新建Windows控制台应用程序项目;

2.2生成项目。

在“生成”菜单中选择“生成项目”;

2.3执行项目。

在OSLab中选择“调试”菜单中的“开始执行(不调

试)”;

2.4调试项目:

2.4.1使用断点中断执行。

点击鼠标右键,在弹出的快捷菜单中选择

“插入/删除断点”。

2.4.2单步调试。

按F10,黄色箭头就指向了调用printf函数的代码行。

2.4.3查看变量的值。

在源代码编辑器中变量n的名称上点击鼠标右

键,在弹出的快捷菜单中选择“快速监视”,可以使用“快速监

视”对话框查看变量n的值。

2.4.4调用堆栈。

选择“调试”菜单窗口中的“调用堆栈”,激活“调

用堆栈”窗口。

3、EOS内核项目的生成和调试

3.1新建EOS内核项目。

在“新建项目”对话框中,选择项目模板“EOS

Kernel”。

3.2生成项目。

按F7生成项目。

3.3调试项目。

在“项目管理器”窗口的ke文件夹中找到start.c文件节

点,调试项目。

3.4查看软盘镜像文件中的内容。

双击软盘镜像文件Floppy.img。

3.5查看EOSSDK(SoftwareDevelopmentKit)文件夹

4、EOS应用程序项目的生成和调试

4.1新建EOS应用程序项目。

在“新建项目”对话框中,选择项目模板

“EOS应用程序”。

4.2生成项目。

按F7生成项目,同时查看“输出”窗口中的内容,确认

生成成功。

4.3调试项目。

调试“eosapp.c”文件。

4.4查看软盘镜像文件中的内容。

打开项目中的Floppy.img文件,查看

软盘镜像中文件。

4.5修改EOS应用程序项目名称

4.5.1在“项目管理器”窗口中,右键点击项目节点(根节点)。

在弹

出的快捷菜单中选择“重命名”,然后可以输入一个新的项目名

称,例如“MyApp”,然后按回车键使修改生效。

4.5.2按F7生成项目。

5、退出OSLab。

在“文件”菜单中选择“退出

6、保存EOS内核项目

三、实验问题解答

在实验1中,生成EOSSDK文件夹的目的和作用是什么?

答:

SDK文件夹中提供了开发EOS应用程序需要的所有文件。

debug文件夹是在

使用debug配置生成项目时生成的,其中存放了调试版本的EOS二进制文件。

release文件夹是在使用release配置生成项目时生成的,其中存放了发布

版本的EOS二进制文件(不包含调试信息)。

SDK文件夹中的inc文件夹,

此文件夹中存放了EOS用于导出API函数和重要数据类型定义的头文件,在

编写EOS应用程序时必须包含这些头文件。

每次在开发EOS应用程序之前都

应该使用EOSKernel项目的debug配置和release配置来生成EOSKernel

项目,这样才得到完全版本的SDK文件夹供EOS应用程序使用。

 

实验2操作系统的启动

一、实验目的

1、跟踪调试EOS在PC机上从加电复位到成功启动的全过程,了解操作系统的启动过程。

2、查看EOS启动后的状态和行为,理解操作系统启动后的工作方式。

二、实验内容

1、准备实验

启动OSLab,新建一个EOSKernel项目。

按F7生成项目。

2、调试EOS操作系统的启动过程

2.1使用Bochs做为远程目标机

2.2.1在“项目管理器”窗口中,右键点击项目节点,在弹出的快捷菜

单中选择“属性”。

2.2.2在弹出的“属性页”对话框右侧的属性列表中找到“远程目标机”

属性,将此属性值修改为“BochsDebug”(此时按F1可以获得关

于此属性的帮助)。

2.2调试BIOS程序

2.2.1按F5启动调试,此时会弹出两个Bochs窗口。

2.2.2标题为“Bochsforwindows-Display”的窗口相当于计算机

的显示器,显示操作系统的输出。

2.2.3标题为“Bochsforwindows-Console”的窗口是Bochs的控

制台,用来

2.2.4输入调试命令,输出各种调试信息。

在Console窗口中输入调试

命令sreg后按回车,显示当前CPU中各个段寄存器的值。

2.2.5输入调试命令r后按回车,显示当前CPU中各个通用寄存器的

值。

2.2.6输入调试命令xp/1024b0x0000,查看开始的1024个字节的物

理内存。

2.2.7输入调试命令xp/512b0x7c00,查看软盘引导扇区应该被加载

到的内存位置。

2.3调试软盘引导扇区程序

2.3.1输入调试命令vb0x0000:

0x7c00。

2.3.2输入调试命令c继续执行,在0x7c00处的断点中断。

2.3.3.输入调试命令sreg验证CS寄存器(0x0000)的值。

2.3.4.输入调试命令r验证IP寄存器(0x7c00)的值。

2.3.5.由于BIOS程序此时已经执行完毕,输入调试命令xp/1024b

0x0000验证此时BIOS中断向量表已经被载入。

2.3.6.输入调试命令xp/512b0x7c00显示软盘引导扇区程序的所有字

节码。

2.4调试加载程序

在loader.lst文件中查找到准备进入EOS操作系统内核执行的指令

(第755行),使用调试命令pb0x1513添加一个断点。

输入调试命令c继续

执行。

使用查看虚拟内存的调试命令x/1wx0x80001117查看内存中保存

的32位函数入口地址。

2.5调试内核

在OSLab的“项目管理器”窗口中打开ke文件夹中的start.c文件,

此文件中只定义了一个函数,就是操作系统内核的入KiSystemStartup。

在KiSystemStartup函数中的代码行(第61行)KiInitializePic();添

加一个断点。

现在可以在Console窗口中输入调试命令c继续调试,在刚

刚添加的断点处中断。

在start.c源代码文件中的KiSystemStartup函数

名上点击鼠标右键,在弹出的快捷菜单中选择“添加监视”。

按F5继续执

行EOS操作系统内核。

2.6EOS启动后的状态和行为

查看EOS的版本号:

在控制台中输入命令“ver”后按回车。

查看

EOS启动后的进程和线程的信息:

在控制台中输入命令“pt”后按回车。

查看有应用程序运行时进程和线程的信息:

本实验文件夹中Hello.exe

文件拖动到FloppyImageEditor工具窗口的文件列表中,待EOS启动完毕,

在EOS控制台中输入命令“hello”后按回车。

迅速按Ctrl+F2切换到控制

台2,并输入命令“pt”后按回车。

 

实验3进程的创建

一、实验目的

1、练习使用EOSAPI函数CreateProcess创建一个进程,掌握创建进程的方法,理解进程和程序的区别。

2、调试跟踪CreateProcess函数的执行过程,了解进程的创建过程,理解进程是资源分配的单位。

二、实验内容

1、准备实验

1.1新建一个EOSKernel项目。

1.2分别使用Debug配置和Release配置生成此项目。

1.3新建一个EOS应用程序项目。

1.4使用在第3步生成的SDK文件夹覆盖EOS应用程序项目文件夹中的

SDK文件夹。

2、练习使用控制台命令创建EOS应用程序的进程

2.1在FloppyImageEditor中打开Hello.exe,并“保存”。

2.2按F7生成。

按F5调试。

不调试异常。

在控制台中输“A:

\Hello.exe”

后回车。

3、练习通过编程的方式让应用程序创建另一个应用程序的进程

使用NewProc.c文件中的源代码替换EOSApp.c文件内的源代码。

按F7

生成EOS应用程。

按F5调试。

在调试异常对话框中选择“否”,继续执行。

激查看应用程序输出的内容。

4、调试CreateProcess函数

4.1按F5调试,在弹出调试异常对话框选择“是”,调试中断。

4.2在main函数中调用CreateProcess函数的代码行添加一个断点。

4.3按F5调试,中断。

4.4按F11调试。

4.5在内核的CreateProcess函数内中断执行,在“调试”菜单选择

“反汇编”。

4.6在“调用堆栈”窗口中双击main函数项。

4.7在“调用堆栈”窗口中双击CreateProcess函数项。

5、调试PsCreateProcess函数

5.1找到调用PspCreateProcessEnvironment函数的代码,并添加一个

断点。

5.2按F5调试,按F11调试。

5.3在调用ObCreateObject函数的代码行添加一个断点。

5.4按F5调试。

5.5按F10执行。

5.6将*NewProcess添加到“监视”窗口中。

在NewProcess->Pas=MmCreateProcessAddressSpace();添加一个

断点。

按F调试,按F10执行此行代码F10PspCreateProcessEnvironment

函数中后面的代码。

当从PspCreateProcessEnvironment函数返回到

PsCreateProcess函数后,停止按F10。

继续使用F10调PsCreateProcess

函数中的代码,按F5。

结束此次调试。

删除所有断点。

6、练习通过编程的方式创建应用程序的多个进程

三、实验问题解答

在实验3中,在PsCreateProcess函数中调用PspCreateProcessEnvironment函数后又先后调用了PspLoadProcessImage和PspCreateThread函数,分析这些函数的主要功能。

能够交换这些函数被调用的顺序吗?

为什么?

答:

不能调换顺序;创建进程最主要的操作就是创建进程控制块(PCB),并初始化

其中的各种信息(也就是为进程分配各种资源)。

所以在PsCreateProcess

函数中首先调用了PspCreateProcessEnvironment函数来创建进程控制块。

因为PspCreateProcessEnvironment函数的主要功能是创建进程控制块并

初始化其中的部分信息,并且为进程创建了地址空间和分配了句柄

PspLoadProcessImage是将进程的可执行映像加载到了进程的地址空间中。

PspCreateThread创建了进程的主线程。

这三个函数被调用的顺序是不能够

改变的,就向上面描述的,加载可执行映像之前必须已经为进程创建了地址

空间,这样才能够确定可执行映像可以被加载到内存的什么位置;在创建主

线程之前必须已经加载了可执行映像,这样主线程才能够知道自己要从哪里

开始执行,执行哪些指令。

实验4线程的状态和转换

一、实验目的

1、调试线程在各种状态间的转换过程,熟悉线程的状态和转换。

2、通过为线程增加挂起状态,加深对线程状态的理解。

二、实验内容

1、准备实验

1.1新建一个EOSKernel项目。

2、调试线程状态的转换过程

2.1按F7生成实验3.1中创建的EOSKernel项目,按F5调试。

2.2然后输入命令“loop”后按回车。

2.3结束调试。

2.4在ke/sysproc.c文件的LoopThreadFunction函数中,开始死循环的

代码行添加一个断点.按F5调试。

2.5在EOS控制台中输入命令“loop”后按回车。

2.6删除所有断点。

2.7打开ps/sched.c文件,在与线程状态转换相关的函数中添加断点,

按F5执行。

2.8线程由阻塞状态进入就绪状态

2.8.1在虚拟机窗口中按下一次空格键。

2.8.2选择“快速监视”,在快速监视对话框中输入达“*Thread”,

然后“重新计算”,在“调用堆栈”窗口中双击PspWakeThread

函数。

2.8.3在“调用堆栈”窗口中双击PspUnwaitThread函数对应的堆栈

项,按F10单步调试到此函数的最后,观察“*Thread”表达式

的值。

2.8.4按F5执行。

按F10调试到函数的最后,然后框中观察“*Thread”

表达式的值。

2.9线程由运行状态进入就绪状态

2.9.1按F5继续执行。

2.9.2按F10单步调试,直到对当前线程的操作完成。

2.9.3查看“*PspCurrentThread”表达式的值。

2.10线程由就绪状态进入运行状态

2.10.1按F5执行,在PspUnreadyThread函数中的断点处中断。

2.10.2查看“*Thread”表达式的值。

2.10.3关闭快速监视对话框后,激活PspSelectNextThread函数对应

的堆栈项,”激活PspUnreadyThread函数对应的堆栈项,然后

按F10调试,直到返回PspSelectNextThread函数并将线程状

态修改为Running。

2.10.4查看“*PspCurrentThread”表达式的值。

2.11线程由运行状态进入阻塞状态

2.11.1按F5执行,在PspWait函数中处中断。

2.11.2查看“*PspCurrentThread”表达式的值。

2.11.3按F10调试,直到左侧的黄色箭头指向代码第248行。

2.11.4再查看“*PspCurrentThread”表达式的值。

2.11.5按F5执行,再按F5执行,EOS不会再被断点中断。

2.11.6再次按空格键,将步骤重复一遍。

3、为线程增加挂起状态

3.1删除之前所有断点。

3.2按F5调试。

3.3输入命令“loop”后按回车。

3.4按Ctrl+F2切换到控制台2,输入命令“suspend31”后按回车。

3.5按Ctrl+1切换回控制台1,看到loop线程已经成功被挂起。

三、实验问题解答

在实验4中,当loop线程在控制台1中执行,并且在控制台2中执行suspend命令时,为什么控制台1中的loop线程处于就绪状态而不是运行状态?

答:

当在控制台2中执行suspend命令时,控制台派遣线程被唤醒,由阻塞状态进

入就绪状态。

因为其优先级(24)比当前处于运行状态的loop线程的优先级

要高,根据EOS已实现的基于优先级的抢先式调度算法,loop线程会进入就

绪状态,控制台派遣线程会抢占处理器从而进入运行状态。

实质上是优先

级为24的控制台派遣线程抢占了处理器,也就是控制台派遣线程处于运行状

态,所以此时loop线程就处于就绪状态了。

实验5进程的同步

一、实验目的

1、使用EOS的信号量,编程解决生产者——消费者问题,理解进程同步的意义。

2、调试跟踪EOS信号量的工作过程,理解进程同步的原理。

3、修改EOS的信号量算法,使之支持等待超时唤醒功能(有限等待),加深理解进程同步的原理。

二、实验内容

1、准备实验

1.1新建一个EOSKernel项目。

1.2生成EOSKernel项目。

1.3新建一个EOS应用程序项目。

1.4覆盖EOS应用程序项目文件夹中的SDK文件夹。

2、使用EOS的信号量解决生产者-消费者问题

2.1使用pc.c文件中的源代码替换之前EOS应用程序项目中EOSApp.c源

代码,按F7生成。

按F5调试,不调试异常,结束此次调试。

3、调试EOS信号量的工作过程

3.1创建信号量,按F5调试,调试异常。

3.2在main第77行添加一个断点。

3.3按F5调试,按F11调试进入CreateSemaphore函数。

3.4按F11调试进入semaphore.c文件中的PsCreateSemaphoreObject

函数。

3.5在semaphore.c文件第39行代码处添加一个断点。

3.6按F5调试。

3.7按F10调试PsInitializeSemaphore函数,查看函数的调用层次。

3.8等待、释放信号量

3.8.1等待信号量(不阻塞),删除所有的断点。

3.8.2在eosapp.c文件的Producer函数第144行添加一个断点。

3.8.3按F5调试。

3.8.4在semaphore.c文件中PsWaitForSemaphore函数的第一行添

加一个断点。

3.8.5按F5调试,到断点处中断。

3.8.6按F10调试,直到完成PsWaitForSemaphore函数中的所有操

作。

3.9释放信号量(不唤醒),删除所有的断点。

3.9.1在eosapp.c文件的第152行添加一个断点。

3.9.2按F5继续调试。

按F11调试进入ReleaseSemaphore函数。

3.9.3继续按F11调试。

3.9.4先使用F10单步调试,当黄色箭头指向第269行时使用F11

单步调试。

按F10单步调试,直到完成函数中的所有操作。

3.10等待信号量(阻塞),按F5重新启动调试。

3.10.1OSLab会首先弹出一个调试异常对话框。

3.10.2在调试异常对话框中选择是,在semaphore.c文件第78行

添加一个断点。

3.10.3按F5继续调试。

查看“调用堆栈”窗口。

3.11释放信号量(唤醒),删除所有断点。

3.11.1按F5继续调试。

3.11.2使用F10和F11调试进入PsReleaseSemaphore函数。

3.11.3按F10单步调试函数。

3.11.4查看PsWaitForSemaphore函数Empty信号量计数的值为0。

4、修改EOS的信号量算法

4.1测试方法

4.1.1用EOSKernel项目生成的SDK文件夹覆盖之前程序的SDK文件

夹,F5调试。

三、实验问题解答

实验5中,生产者线程和消费者线程是如何使用Mutex、Empty信号量和Full信号量来实现同步的?

这两个线程函数中对这三个同步对象的操作能够改变顺序吗?

答:

Mutex对象只是用来保护临界资源的,防止生产者线程和消费者线程同时

访问临界资源,从而造成混乱。

Empty信号量和Full信号量是相互合作

不可分割的,在生产者线程中,Empty信号量保证在没有空缓冲区的时候

让生产者停止生产,Full信号量保证在生产完毕一个产品后增加一个满

缓冲区;在消费者线程中,Full信号量保证在没有满缓冲区的时候让消

费者停止消费,Empty信号量保证在消费完毕一个产品后增加一个空缓冲

区。

所以对这三个同步对象的操作是不能改变顺序的。

 

实验6时间片轮转调度

一、实验目的

1、调试EOS的线程调度程序,熟悉基于优先级的抢先式调度。

2、为EOS添加时间片轮转调度,了解其它常用的调度算法。

二、实验内容

1、准备实验

1.1启动OSLab。

1.2新建一个EOSKernel项目。

2、阅读控制台命令“rr”相关的源代码

2.1按F7生成在本实验3.1中创建的EOSKernel项目。

2.2按F5启动调试。

待EOS启动完毕,在EOS控制台中输入命令“rr”后

按回车。

3、调试线程调度程序

3.1调试当前线程不被抢先的情况

3.1.1结束之前的调试。

3.1.2在ke/sysproc.c文件的ThreadFunction函数中,调用fprintf

函数的代码行添加一个断点。

3.1.3按F5启动调试。

输入命令“rr”后按回车。

3.1.4查看ThreadFunction函数中变量pThreadParameter->Y的值。

ps/sched.c文件的第384行添加一个断点。

3.1.5按F5执行,添加表达式“/tPspReadyBitmap”,在“快速监视”

对话框的“表达式”中输入表达式“*PspCurrentThread”。

3.1.6添加表达式“ListGetCount(&PspReadyListHeads[8])”按F10

调试。

3.1.7继续按F10单步调试,直到在PspSelectNextThread函数返前停

止。

3.2调试当前线程被抢先的情况

3.2.1删除所有断点,在ps/sched.c文件的第395行添加一个断点,

按F5执行在“监视”窗口中添加表达

“ListGetCount(&PspReadyListHeads[24])”,按F10调试一

次。

3.2.2继续按F10调试,直到在第444行中断执行,按F10调试一次,

继续按F10调试,直到在PspSelectNextThread函数返回前中断

执行,删除所有断点后结束调试。

4、为EOS添加时间片轮转调度

4.1修改ps/sched.c文件中的第337行,在其中实现时间片轮转调度算

法。

4.2测试方法

4.2.1代码修改完毕后,按F7生成EOS内核项目。

4.2.2按F5启动调试。

在EOS控制台中输入命令“rr”后按回车。

4.2.3应能看到20个线程轮流执行的效果。

5、修改线程时间片的大小

5.1将ps/psp.h第104行定义的TICKS_OF_TIME_SLICE的值修改为1按

F7生成EOS内核项目。

5.2按F5启动调试。

5.3在EOS控制台中输入命令“rr”后按回车。

观察执行的效果。

三、实验问题解答

在实验6中,结合线程调度执行的时机,说明在ThreadFunction函数中,为什么可以使用“关中断”和“开中断”的方法来保护控制台这种临界资源。

一般情况下,应该使用互斥信号量(MUTEX)来保护临界资源,但是在ThreadFunction函数中却不能使用互斥信号量,而只能使用“关中断”和“开中断”的方法,结合线程调度的对象说明这样做的原因。

答:

关中断后CPU就不会响应任何由外部设备发出的硬中断(包括定时计数器中

断和键盘中断等)

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 艺术

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1