OS上机实验报告李晶.docx
- 文档编号:16746980
- 上传时间:2023-07-17
- 格式:DOCX
- 页数:27
- 大小:1.06MB
OS上机实验报告李晶.docx
《OS上机实验报告李晶.docx》由会员分享,可在线阅读,更多相关《OS上机实验报告李晶.docx(27页珍藏版)》请在冰点文库上搜索。
OS上机实验报告李晶
实验报告
|
|
实验名称EOS操作系统实验
课程名称计算机操作系统
|
|
计科1102班李晶
学号:
************
实验1实验环境的使用
一、实验目的
熟悉操作系统集成实验环境OSLab的基本使用方法。
练习编译、调试EOS操作系统内核以及EOS应用程序。
二、实验内容
2.1启动OSLab
1.在安装有OSLab的计算机上,可以使用两种不同的方法来启动OSLab:
?
在桌面上双击“TevationOSLab”图标。
或者
?
点击“开始”菜单,在“程序”中的“TevationOSLab”中选择“TevationOSLab”。
2.OSLab每次启动后都会首先弹出一个用于注册用户信息的对话框(可以选择对话框标题栏上的
“帮助”按钮获得关于此对话框的帮助信息)。
在此对话框中填入学号和姓名后,点击“确定”
按钮完成本次注册。
3.观察OSLab主窗口的布局。
OSLab主要由下面的若干元素组成:
菜单栏、工具栏以及停靠在左
侧和底部的各种工具窗口,余下的区域用来放置编辑器窗口。
2.2学习OSLab的基本使用方法
练习使用OSLab编写一个Windows控制台应用程序,熟悉OSLab的基本使用方法(主要包括新建项
目、生成项目、调试项目等)。
2.2.1新建Windows控制台应用程序项目
新建一个Windows控制台应用程序项目的步骤如下:
1.在“文件”菜单中选择“新建”,然后单击“项目”。
2.在“新建项目”对话框中,选择项目模板“控制台应用程序(c)”。
3.在“名称”中输入新项目使用的文件夹名称“oslab”。
4.在“位置”中输入新项目保存在磁盘上的位置“C:
\test”。
5.点击“确定”按钮。
新建完毕后,OSLab会自动打开这个新建的项目。
在“项目管理器”窗口中(如图9-1所示),树的根节点是项目节点,项目的名称是“console”,各个子节点是项目包含的文件夹或者文件。
此项目的源代码主要包含一个头文件“console.h”和一个C语言源文件“console.c”。
使用Windows资源管理器打开磁盘上的“C:
\test\oslab”文件夹查看项目中包含的文件(提示,在“项目管理器”窗口的项目节点上点击右键,然后在弹出的快捷菜单中选择“打开所在的文件夹”即可)。
2.2.2生成项目
使用“生成项目”功能可以将程序的源代码文件编译为可执行的二进制文件,方法十分简单:
在“生
成”菜单中选择“生成项目”。
在项目生成过程中,“输出”窗口会实时显示生成的进度和结果。
如果源代码中不包含语法错误,会
在最后提示生成成功,如图9-2:
如果源代码中存在语法错误,“输出”窗口会输出相应的错误信息(包括错误所在文件的路径错误在文件中的位置,以及错误原因),并在最后提示生成失败。
此时在“输出”窗口中双击错误信息所在的行,OSLab会使用源代码编辑器打开错误所在的文件,并自动定位到错误对应的代码行。
可以在源代码文件中故意输入一些错误的代码(例如删除一个代码行结尾的分号),然后再次生成项目,然后在“输出”窗口中双击错误信息来定位存在错误的代码行,将代码修改正确后再生成项目。
生成过程是将每个源代码文件(.c、.cpp、.asm等文件)编译为一个对象文件(.o文件),然后再将多个对象文件链接为一个目标文件(.exe、.dll等文件)。
成功生成Windows控制台应用程序项目后,默认会在“C:
\test\oslab\debug"目录下生成一个名称为“console.o”的对象文件和名称为“console.exe”的Windows控制台应用程序,可以使用Windows资源管理器查看这些文件。
2.2.3执行项目
在OSLab中选择“调试”菜单中的“开始执行(不调试)”,可以执行刚刚生成的Windows控制台应用程序。
启动执行后会弹出一个Windows控制台窗口,显示控制台应用程序输出的内容。
按任意键即可关闭此Windows控制台窗口。
2.2.4调试项目
OSLab提供的调试器是一个功能强大的工具,使用此调试器可以观察程序的运行时行为并确定逻辑错误的位置,可以中断(或挂起)程序的执行以检查代码,计算和编辑程序中的变量,查看寄存器,以及查看从源代码创建的指令。
为了顺利进行后续的各项实验,应该学会灵活使用这些调试功能。
在开始练习各种调试功能之前,首先需要对刚刚创建的例子程序进行必要的修改,步骤如下:
1.右键点击“项目管理器”窗口中的“源文件”文件夹节点,在弹出的快捷菜单中选择“添加”中
的“添加新文件”。
2.在弹出的“添加新文件”对话框中选择“C源文件”模板。
3.在“名称”中输入文件名称“func”。
4.点击“添加”按钮,添加并自动打开文件func.c,此时的“项目管理器”窗口会如图9-3:
5.在func.c文件中添加函数:
intFunc(intn)
{
n=n+1;
returnn;
}
6.点击源代码编辑器上方的console.c标签,切换到console.c文件。
将main函数修改为:
intmain(intargc,char*argv[])
{
intFunc(intn);//声明Func函数
intn=0;
n=Func(10);
printf("HelloWorld!
\n");
return0;
}
代码修改完毕后按F7(“生成项目”功能的快捷键)。
注意查看“输出”窗口中的内容,如果代码中存在语法错误,就根据错误信息进行修改,直到成功生成项目。
2.2.4.1使用断点中断执行
1.在main函数中定义变量n的代码行
intn=0;
上点击鼠标右键,在弹出的快捷菜单中选择“插入/删除断点”,会在此行左侧的空白处显示一个红色圆点,表示已经成功在此行代码添加了一个断点,如图9-4:
2.在“调试”菜单中选择“启动调试”,Windows控制台应用程序开始执行,随后OSLab窗口被自动激活,并且在刚刚添加断点的代码行左侧空白中显示一个黄色箭头,表示程序已经在此行代码处中断执行(也就是说下一个要执行的就是此行代码),如图9-5:
3.激活Windows控制台应用程序的窗口,可以看到窗口中没有输出任何内容,因为printf函数还没有被执行。
其他的一些操作截图:
三、思考与练习
1.练习使用单步调试功能(逐过程、逐语句),体会在哪些情况下应该使用“逐过程”调试,在哪些情况下应该使用“逐语句”调试。
练习使用各种调试工具(包括“监视”窗口、“调用堆栈”窗口等)。
答:
逐语句,就是每次执行一条语句,如果碰到函数调用,它就会进入到函数里面。
而逐过程,碰到函数,不进入函数,把函数调用当成一条语句执行。
因此在需要进入函数体时用逐语句调试,而不需要进入函数体时用逐过程调试。
2.思考生成EOSSDK文件夹的目的和作用。
查看EOSSDK文件夹中的内容,明白文件夹的组织结构和各个文件的来源和作用。
查看EOS应用程序包含了SDK文件夹中的哪些头文件,是如何包含的?
答:
EOSSDK是为应用程序调用系统API提供服务,可作为用户编程中可使用的工具包集合。
EOSSDK文件夹主要包括INC头文件、LIB文件夹、导入库文件和BIN文件夹、动态链接库、可执行程序、二进制文件。
EOSSDK包含头文件有:
eos.h负责到处API函数声明;eosdef.h负责导出函数类型的定义;error.h负责导出错误代码。
实验2操作系统的启动
一、实验目的
跟踪调试EOS在PC机上从加电复位到成功启动的全过程,了解操作系统的启动过程。
查看EOS启动后的状态和行为,理解操作系统启动后的工作方式。
二、预备知识
阅读本书第3章,了解EOS操作系统的启动过程。
阅读第2章中的第2.4节,复习汇编语言的相关知识,并掌握NASM汇编代码的特点。
阅读附录A,了解Bochs和VirtualPC这两款虚拟机软件的特点,重点熟悉Bochs的调试命令。
三、实验内容
3.1准备实验
1.启动OSLab。
2.新建一个EOSKernel项目。
3.在“项目管理器”窗口中打开boot文件夹中的boot.asm和loader.asm两个汇编文件。
boot.asm
是软盘引导扇区程序的源文件,loader.asm是loader程序的源文件。
简单阅读一下这两个文件
中的NASM汇编代码和注释。
4.按F7生成项目。
5.生成完成后,使用Windows资源管理器打开项目文件夹中的Debug文件夹。
找到由boot.asm生
成的软盘引导扇区程序boot.bin文件,该文件的大小一定为512字节(与软盘引导扇区的大小
一致)。
找到由loader.asm生成的loader程序loader.bin文件,记录下此文件的大小1566字
节,在下面的实验中会用到。
找到由其它源文件生成的操作系统内核文件kernel.dll。
3.2调试EOS操作系统的启动过程
3.2.1使用Bochs做为远程目标机
按照下面的步骤将调试时使用的远程目标机修改为Bochs:
1.在“项目管理器”窗口中,右键点击项目节点,在弹出的快捷菜单中选择“属性”。
2.在弹出的“属性页”对话框右侧的属性列表中找到“远程目标机”属性,将此属性值修改为“Bochs
Debug”(此时按F1可以获得关于此属性的帮助)。
3.点击“确定”按钮关闭“属性页”对话框。
接下来就可以使用Bochs模拟器调试BIOS程序和软
盘引导扇区程序了。
3.2.2调试BIOS程序
按F5启动调试,此时会弹出两个Bochs窗口。
标题为“Bochsforwindows-Display”的窗口相当于计算机的显示器,显示操作系统的输出。
标题为“Bochsforwindows-Console”的窗口是Bochs的控制台,用来输入调试命令,输出各种调试信息。
启动调试后,Bochs在CPU要执行的第一条指令(即BIOS的第一条指令)处中断。
此时,Display窗口没有显示任何内容,Console窗口显示要执行的BIOS第一条指令的相关信息,并等待用户输入调试命令,如图10-1:
图10-1:
Console窗口显示在BIOS第一条指令处中断
从Console窗口显示的内容中,我们可以获得关于BIOS第一条指令的如下信息:
?
行首的[0xfffffff0]表示此条指令所在的物理地址。
?
f000:
fff0表示此条指令所在的逻辑地址(段地址:
偏移地址)。
?
jmpfarf000:
e05b是此条指令的反汇编代码。
?
行尾的ea5be000f0是此条指令的十六进制字节码,可以看出此条指令有5个字节。
接下来可以按照下面的步骤,查看CPU在没有执行任何指令之前主要寄存器中的数据,以及内存中的数据:
1.在Console窗口中输入调试命令sreg后按回车,显示当前CPU中各个段寄存器的值,如图10-2。
其中CS寄存器信息行中的“s=0xf000”表示CS寄存器的值为0xf000。
2.输入调试命令r后按回车,显示当前CPU中各个通用寄存器的值,如图10-3。
其中“rip:
0x00000000:
0000fff0”表示IP寄存器的值为0xfff0。
3.输入调试命令xp/1024b0x0000,查看开始的1024个字节的物理内存。
在Console中输出的这1K物理内存的值都为0,说明BIOS中断向量表还没有被加载到此处。
4.输入调试命令xp/512b0x7c00,查看软盘引导扇区应该被加载到的内存位置。
输出的内存值都为0,说明软盘引导扇区还没有被加载到此处。
可以验证BIOS第一条指令所在逻辑地址中的段地址和CS寄存器值是一致的,偏移地址和IP寄存器的值是一致的。
由于内存还没有被使用,所以其中的值都为0。
3.2.6EOS启动后的状态和行为
查看EOS的版本号:
1.在控制台中输入命令“ver”后按回车。
2.输出EOS版本后的控制台如图10-4所示。
查看EOS启动后的进程和线程的信息:
1.在控制台中输入命令“pt”后按回车。
2.输出的进程和线程信息如图10-5所示。
四、思考与练习
1.为什么EOS操作系统从软盘启动时要使用boot.bin和loader.bin两个程序?
使用一个可以吗?
它们各自的主要功能是什么?
如果将loader.bin的功能移动到boot.bin文件中,则boot.bin文件的大小是否仍然能保持小于512字节?
答:
boot文件夹包含了两个汇编文件boot.asm和loader.asm。
这两个文件生成的二进制文件boot.bin和loader.bin会被写进软盘镜像文件中。
操作系统启动时boot.bin和loader.bin引导软盘加载程序,二者缺一不可。
使用Boot.bin的主要功能是引导软盘;loader.bin的主要功能是加载程序。
如果把loader.bin功能移动到boot.bin程序中,必然会导致程序规模扩大,可能使其大于512字节。
2.软盘引导扇区加载完毕后内存中有两个用户可用的区域,为什么软盘引导扇区程序选择将loader.bin加载到第一个可用区域的0x1000处呢?
这样做有什么好处?
这样做会对loader.bin文件的大小有哪些限制。
答:
首先用户只用两个可用区域,加载位置非此即彼。
第一个可用用户区是低地址区,且空间大小比较小,适合容纳小文件,所以我们选择将占用空间小的loader.bin加载到第一用户区。
优点:
由底地址开始,便于检索查找。
小文件占用小空间,节约资源。
限制:
loader.bin文件必须小于1c00k
实验3进程的创建
一、实验目的
练习使用EOSAPI函数CreateProcess创建一个进程,掌握创建进程的方法,理解进程和程序的区别。
调试跟踪CreateProcess函数的执行过程,了解进程的创建过程,理解进程是资源分配的单位。
三、预备知识
阅读本书第5.1节,重点理解程序和进程的关系,熟悉进程控制块结构体以及进程创建的过程。
仔细学习CreateProcess函数和其它与创建进程相关的函数的说明,注意理解这些函数的参数和返回值的意义。
三、实验内容
3.1练习使用控制台命令创建EOS应用程序的进程
练习使用控制台命令创建EOS应用程序进程的具体步骤如下:
1.在EOS应用程序项目的“项目管理器”窗口中双击Floppy.img文件,使用FloppyImageEditor
工具打开此软盘镜像文件。
2.将本实验文件夹中的Hello.exe文件拖动到FloppyImageEditor工具窗口的文件列表中释放,
Hello.exe文件即被添加到软盘镜像文件中。
Hello.exe一个EOS应用程序,其源代码可以参见
本实验文件夹中的Hello.c源文件。
3.在FloppyImageEditor中选择“文件”菜单中的“保存”后关闭FloppyImageEditor。
4.按F7生成EOS应用项目。
5.按F5启动调试。
OSLab会弹出一个调试异常对话框,并中断应用程序的执行。
6.在调试异常对话框中选择“否”,忽略异常继续执行应用程序。
7.激活虚拟机窗口,待该应用程序执行完毕后,在EOS的控制台中输入命令“A:
\Hello.exe”后回
车。
8.Hello.exe应用程序开始执行,观察其输出如图11-1。
3.3练习通过编程的方式让应用程序创建另一个应用程序的进程
使用OSLab打开本实验文件夹中的NewProc.c文件(将此文件拖动到OSLab窗口中释放即可),细阅读此文件中的源代码和注释,main函数的流程图可以参见图11-3。
按照下面的步骤查看应用程序创建另一个应用程序的进程的执行结果:
1.使用NewProc.c文件中的源代码替换之前创建的EOS应用程序项目中的EOSApp.c文件内的源代码。
2.按F7生成修改后的EOS应用程序项目。
3.按F5启动调试。
OSLab会首先弹出一个调试异常对话框。
4.在调试异常对话框中选择“否”,继续执行。
5.激活虚拟机窗口查看应用程序输出的内容,如图11-2。
实验4线程的状态和转换
一、实验目的
调试线程在各种状态间的转换过程,熟悉线程的状态和转换。
通过为线程增加挂起状态,加深对线程状态的理解。
二.实验内容
3.1调试线程状态的转换过程
1.按F7生成在本实验3.1中创建的EOSKernel项目。
2.按F5启动调试。
3.待EOS启动完毕,在EOS控制台中输入命令“loop”后按回车。
4.结束此次调试。
loop命令执行的效果可以参见图12-1。
3.2为线程增加挂起状态
EOS已经实现了一个suspend命令,其命令函数为ConsoleCmdSuspendThread(在ke/sysproc.c文件的第843行)。
在这个命令中调用了Suspend原语(在ps/psspnd.c文件第27行的PsSuspendThread函数中实现)。
Suspend原语可以将一个处于就绪状态的线程挂起。
以loop线程为例,当使用suspend命令将其挂起时,loop线程的执行计数就会停止增长。
按照下面的步骤观察loop线程被挂起的情况:
1.删除之前添加的所有断点。
2.按F5启动调试。
3.待EOS启动完毕,在EOS控制台中输入命令“loop”后按回车。
此时可以看到loop线程的执行
计数在不停增长,说明loop线程正在执行。
记录下loop线程的ID。
4.按Ctrl+F2切换到控制台2,输入命令“suspend31”(如果loop线程的ID是31)后按回车。
命令执行成功的结果如图12-2所示。
5.按Ctrl+1切换回控制台1,可以看到由于loop线程已经成功被挂起,其执行计数已经停止增长
了。
此时占用处理器的是EOS中的空闲线程。
3.3.1要求
EOS已经实现了一个resume命令,其命令函数为ConsoleCmdResumeThread(在ke/sysproc.c文件的第898行)。
在这个命令中调用了Resume原语(在ps/psspnd.c文件第87行的PsResumThread函数中实现)。
Resume原语可以将一个被Suspend原语挂起的线程(处于静止就绪状态)恢复为就绪状态。
但是PsResumThread函数中的这部分代码(第119行)还没有实现,要求读者在这个练习中完成这部分代码。
3.3.2测试方法
待读者完成Resume原语后,可以先使用suspend命令挂起loop线程,然后在控制台2中输入命令“Resume31”(如果loop线程的ID是31)后按回车。
命令执行成功的结果如图12-3所示。
如果切换回控制台1后,发现loop线程的执行计数恢复增长就说明Resume原语可以正常工作了。
当然,也可以在控制台2中反复交替使用suspend和resume命令来进行测试。
实验5进程的同步
一、实验目的
使用EOS的信号量,编程解决生产者—消费者问题,理解进程同步的意义。
调试跟踪EOS信号量的工作过程,理解进程同步的原理。
二、预备知识
阅读本书第5章中的5.3节,学习EOS内核提供的三种同步对象(该实验没有涉及到Event同步对象)。
重点理解各种同步对象的状态与使用方式。
同时学习经典的生产者-消费者问题。
阅读5.2节,学习在EOS应用程序中调用EOSAPI函数CreateThread创建线程的方法。
三、实验内容
3.1使用EOS的信号量解决生产者-消费者问题
按照下面的步骤查看生产者-消费者同步执行的过程:
1.使用pc.c文件中的源代码,替换之前创建的EOS应用程序项目中EOSApp.c文件内的源代码。
2.按F7生成修改后的EOS应用程序项目。
3.按F5启动调试。
OSLab会首先弹出一个调试异常对话框。
4.在调试异常对话框中选择“否”,继续执行。
5.立即激活虚拟机窗口查看生产者-消费者同步执行的过程,如图13-2。
6.待应用程序执行完毕后,结束此次调试。
实验6时间片轮转调度
一、实验目的
调试EOS的线程调度程序,熟悉基于优先级的抢先式调度。
为EOS添加时间片轮转调度,了解其它常用的调度算法。
三、实验内容
3.2阅读控制台命令“rr”相关的源代码
按照下面的步骤执行控制台命令“rr”,查看其在没有时间片轮转调度时的执行效果:
1.按F7生成在本实验3.1中创建的EOSKernel项目。
2.按F5启动调试。
3.待EOS启动完毕,在EOS控制台中输入命令“rr”后按回车。
命令开始执行后,观察其执行效果(如图14-1),会发现并没有体现“rr”命令相关源代码的设计意图。
通过之前对这些源代码的学习,20个新建的线程应该在控制台对应的行中轮流地显示它们的计数在增加,而现在只有第0个新建的线程在第0行显示其计数在增加,说明只有第0个新建的线程在运行,其它线程都没有运行。
造成上述现象的原因是:
所有20个新建线程的优先级都是8,而此时EOS只实现了基于优先级的抢先式调度,还没有实现时间片轮转调度,所以至始至终都只有第0个线程在运行,而其它具有相同优先级的线程都没有机会运行,只能处于“就绪”状态。
3.4为EOS添加时间片轮转调度
3.4.1要求
修改ps/sched.c文件中的PspRoundRobin函数(第337行),在其中实现时间片轮转调度算法。
3.4.2测试方法
1.代码修改完毕后,按F7生成EOS内核项目。
2.按F5启动调试。
3.在EOS控制台中输入命令“rr”后按回车。
应能看到20个线程轮流执行的效果,如图14-2。
实验7物理存储器与进程逻辑地址空间的管理
一、实验目的
通过查看物理存储器的使用情况,并练习分配和回收物理内存,从而掌握物理存储器的管理方法。
通过查看进程逻辑地址空间的使用情况,并练习分配和回收虚拟内存,从而掌握进程逻辑地址空间的管理方法。
二、预备知识
阅读本书第6章。
重点阅读第6.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- OS 上机 实验 报告
![提示](https://static.bingdoc.com/images/bang_tan.gif)