华北电力大学操作系统实验报告.docx
- 文档编号:26917399
- 上传时间:2023-06-24
- 格式:DOCX
- 页数:22
- 大小:179.94KB
华北电力大学操作系统实验报告.docx
《华北电力大学操作系统实验报告.docx》由会员分享,可在线阅读,更多相关《华北电力大学操作系统实验报告.docx(22页珍藏版)》请在冰豆网上搜索。
华北电力大学操作系统实验报告
华北电力大学
实验报告
|
|
实验名称操作系统综合实验
课程名称操作系统
|
|
专业班级:
网络学生姓名:
学号:
成绩:
指导教师:
王德文/姜丽梅实验日期:
2015年11月4日
实验一实验环境的使用
一、实验目的
1.熟悉操作系统集成实验环境OSLab的基本使用方法。
2.练习编译、调试EOS操作系统内核以及EOS应用程序。
二、实验内容
1.启动OSLab;
2.学习OSLab的基本使用方法:
练习使用OSLab编写一个Windows控制台应用程序,熟悉OSLab的基本使用方法(主要包括新建项目、生成项目、调试项目等);
3.EOS内核项目的生成和调试:
对EOS内核项目的各种操作(包括新建、生成和各种调试功能等)与对Windows控制台项目的操作是完全一致的;
4.EOS应用程序项目的生成和调试;
5.退出OSLabo
三、实验内容问题及解答
1.练习使用单步调试功能(逐过程、逐语句),体会在哪些情况下应该使用“逐过程”调试,在哪些情况下应该使用“逐语句”调试。
练习使用各种调试工具(包括“监视”窗口、“调用堆栈”窗口等)。
答:
逐语句,就是每次执行一行语句,如果碰到函数调用,它就会进入到函数里面。
而逐过程,碰到函数时,不进入函数,把函数调用当成一条语句执行。
因此,在需要进入函数体时用逐语句调试,而不需要进入函数体时用逐过程调试。
四、实验过程
1.新建Windows控制台应用程序
生成项目:
执行项目:
调试项目:
intFunc(Int口〕,//芦明Fuek函数
i.nxn-0,n=FunjcdO);
printfCHelloWorld
查看EOSSDK(SoftwareDevelopmentKit)文件夹:
修改EOS应用程序项目名称:
pflMSni-E-l(PrftssCtrl+FVFRswitclicorisnlfiuiitdnu...)UcleonetoEOSshell
五、实验心得
这次是验证性试验,具体步骤和操作方法都是与实验教程参考书上一致,实验很顺利,实验过程没有遇到困难。
通过这次实验,我掌握了OSLab启动和退出操作;练习使用OSLab编写一个Windows控制台应用程序,熟悉OSLab的基本使用方法新建项目、生成项目、调试项目等。
实验2操作系统的启动
一、实验目的
1.跟踪调试EOS在PC机上从加电复位到成功启动的全过程,了解操作系统的启动过程。
2.查看EOS启动后的状态和行为,理解操作系统启动后的工作方式。
二、使用仪器
二、实验内容
1.准备实验。
2.调试EOS操作系统的启动过程。
<0>[0x£ff£fff0Jctxt):
jmpfit*
Kboclis
3.调试加载程序。
Loader程序的主要任务是将操作系统内核(kernel.dll文件)加
载到内存中,然后让CPUS入保护模式并且启用分页机制,最后进入操作系统内核开始执行(跳转到kernel.dll的入口点执行)。
4.调试内核。
5.EOS启动后的状态和行为。
查看EOS的版本号:
1)在控制台中输入命令“ver”后按回车。
2)输出EOS版本后的控制台如下图所示。
6.查看有应用程序运行时进程和线程的信息:
1)待EOS启动完毕,在EOS控制台中输入命令“hello”后按回车。
此时Hello.exe应用程序就开始执行。
2)迅速按Ctrl+F2切换到控制台2,并输入命令“pt”后按回车。
输出的进程和线程信息如下图所示
三、实验内容问题及解答
1.为什么EOS操作系统从软盘启动时要使用boot.bin和loader.bin两个程序?
使用一个可以吗?
它们各自的主要功能是什么?
如果将loader.bin的功能移动到boot.bin文件中,则boot.bin文件的大小是否仍然能保持小于512字节?
答:
在IDE环境启动执行EOS操作系统时,会将boot.bin、loader.bin和kernel.dll三个二进制写入软盘镜像文件中,然后让虚拟机来执行软盘中的EOS操作系统。
仅使用
其中一个是不能运行的。
实验3进程的创建
一、实验目的
1.练习使用EOSAPI函数CreateProcess创建一个进程,掌握创建进程的方法,理解进程和程序的区别。
2.调试跟踪CreateProcess函数的执行过程,了解进程的创建过程,理解进程是资源分配的单位。
2.实验内容
1.准备实验。
启动OSLabo
2.练习使用控制台命令创建EOS应用程序的进程。
使用控制台命令创建EO阪用程
序的进程如图:
9OSL^bPC-MicrosoftVirtualPC2007巳
3.练习通过编程的方式让应用程序创建另一个应用程序的进程。
应用程序创建另一个应用程序的进程的执行结果如图:
5»OSLabPC-MicrosoftVirtualPC2007
4.调试CreateProcess函数。
5.调试PsCreateProcess函数”。
6.练习通过编程的方式创建应用程序的多个进程
3.实验内容问题及解答
1.在源代码文件NewTwoProc.c提供的源代码基础上进行修改,要求使用hello.exe
同时创建10个进程。
提示:
可以使用PROCESS_INFORMATI类型定义一个有10个元素的数组,每一个元素对应一个进程。
使用一个循环创建10个子进程,然后再使用一个循环等待10个子进程结束,得到退出码后关闭句柄。
答:
修改代码为:
STARTUPINFOStartupInfo;
PROCESS」NFORMATIONProcInfo[10];
ULONGulExitCode;
INTnResult=0;。
inti,j;//#ifdef_DEBUG__asm("int$3\nnop");#endif
printf("Create10p//rocessesandwaitfortheprocessesexit...\n\n");
StartupInfo.Stdlnput=GetStdHandle(STD_INPUT_HANDLE);
StartupInfo.StdOutput=GetStdHandle(STDOUTPUTHANDLE);
Startuplnfo.StdError=GetStdHandle(STD_ERROR_HANDLE);
for(i=0;i<10;i++){
if(CreateProcess("A:
\\Hello.exe",NULL,0,&StartupInfo,&ProcInfo[i]));
else{
for(j=0;j
WaitForSingleObject(Proclnfo[j].ProcessHandle,INFINITE);
GetExitCodeProcess(Proclnfo[j].ProcessHandle,
printf("\nTheprocess%dexitwith%d.\n",j,ulExitCode);
CloseHandle(ProcInfo[j].ProcessHandle);
CloseHandle(ProcInfo[j].ThreadHandle);
}
printf("CreateProcessFailed,Errorcode:
0x%X.\n",
GetLastError());
nResult=1;returnnResult;
}
for(i=0;i<10;i++){
WaitForSingleObject(ProcInfo[i].ProcessHandle,INFINITE);
GetExitCodeProcess(ProcInfo[i].ProcessHandle,&ulExitCode);
}
for(i=0i<10;i++){
printf("\nTheprocess%dexitwith%d.\n",i,ulExitCode);
CloseHandle(Proclnfo[i].ProcessHandle);
CloseHandle(ProcInfo[i].ThreadHandle);
}
returnnResult;&ulExitCode);
}
4.实验心得
本实验主要的问题就是用hello.exe同时创建10个进程:
因为编程基础不好,刚开始的程序很难通过编译•最后使用PROCESS_INFORMAT类型定义一个有10个元素的数组,每一个元素对应一个进程。
使用一个循环创建10个子进程,然后再使用一个循环等待10个子进程结束,得到退出码后关闭句柄。
并对细节做了部分修正才成功。
实验4线程的状态和转换
「、实验目的和要求
1.调试线程在各种状态间的转换过程,熟悉线程的状态和转换
2.通过为线程增加挂起状态,加深对线程状态的理解。
[、实验内容及步骤
1.准备实验。
启动OSLabo
2.调试线程状态的转换过程。
3.线程由阻塞状态进入就绪状态
4.线程由运行状态进入就绪状态
5.线程由就绪状态进入运行状态
6.线程由运行状态进入阻塞状态
7.为线程增加挂起状态。
COKSOLE-2(PressCtrI+F1*F8toswitchconsolewindoiii
UclcametoECSshel1
Suspend31
SuspendthreadOl)success,
8.完成Resume原语后,可以先使用suspend命令挂起loop线程,然后在控制台2中输入命令“Resume31'(如果loop线程的ID是31)后按回车。
命令执行成功的结果如下图所示。
如果切换回控制台1后,发现loop线程的执行计数恢复增长就说明Resume原语可以正常工作。
COMSDLE-2(PressCtrI+F1*F8toswitchconsolewindaw.»+)UcleonetoEOSshel1
>suspend31
Suspendtbread(31)success・
三、实验内容问题及解答
1.思考一下,在本实验中,当loop线程处于运行状态时,EOS^还有哪些线程,它们分别处于什么状态。
可以使用控制台命令pt查看线程的状态。
■
■
IcflNSni-E—1iikHlii-Lnin^nJrsu>£iyrlrru7.->
籾u1uuimefLuECUS匕11
士n**〜nwPf'ocjcs®L-1s*t.C1Pr-ocess-1乂**——******—
TDI1T't*i-nr1-■tijEriCncitti±IPr*iirnusT'ijTlir'iiT-flKlID1Ii^irtrjmNj»in
!
_¥2-41LX2NVA
—士nx——p—丁11沪00<1IL电貝ihC11I■—ppiNN
ID1JSijstrsm?
1F't*i-nr11ityiSf?
t«±e1t'ittitF!
T'n<^ N£QRyaclyJLiGjcESOOIHJLVC p: e¥N-iuchii;mgr丄oxtpeoxSE'gn btlv2-4Unj-t-lnrf11flQG事 乂三¥N弓RihmiinyiIOscHGOlB^fiU 戸勻¥NT;U<&ir1■ly.1OjcB-OOiK^fjB L-l¥2-1I4oii-titm£0X000XB2d6I> 任匸V^-4Uni-Llnri10^0001fl^r-Tl LZEs¥N理U *丁VN咆U<&illalyXOmUOOt>£k KB¥N理UI^Ll-tlrifv1Ox&GOlBZ&D pivn: RceH.io^ficm1non<±i 头验5进程的同步 一、实验目的和要求 1.使用EOS的信号量,编程解决生产者一消费者问题,理解进程同步的意义。 2.通过为线程增加挂起状态,加深对线程状态的理解。 2.调试跟踪EOS信号量的工作过程,理解进程同步的原理。 3.修改EOS的信号量算法,使之支持等待超时唤醒功能(有限等待),加深理解进程同步的原理。 二、实验内容及步骤 1.实验准备 1)启动OSLabb 2)新建一个EOSKernel项目。 3)生成EOSKernel项目,从而在该项目文件夹中生成SDK文件夹。 4)新建一个EOS应用程序项目。 5)使用在第3步生成的SDK文件夹覆盖EO阪用程序项目文件夹中的SDK文件夹。 2.使用EOS的信号量解决生产者-消费者问题 1)使用pc.c文件中的源代码,替换之前创建的EOS应用程序项目中EOSApp.c文件内的源代码。 2)按F7生成修改后的EOS应用程序项目。 3)按F5启动调试。 OSLab会首先弹出一个调试异常对话框。 4)在调试异常对话框中选择“否”,继续执行。 5)立即激活虚拟机窗口查看生产者—消费者同步执行的过程,如图1b 6)待应用程序执行完毕后,结束此次调试。 图1 3.调试EOS信号量的工作过程。 1)创建信号量: 信号量结构体(SEMAPHORED的各个成员变量是由API函数CreateSemaphore的对应参数初始化的,查看main函数中创建Empty和Full信号量使用的参数有哪些不同,又有哪些相同,思考其中的原因。 2)等待、释放信号量 a.等待信号量(不阻塞): 生产者和消费者刚开始执行时,用来放产品的缓冲区都是空的,所以生产者在第一次调用WaitForSingleObject函数等待Empty信号量时,应该不需要阻塞就可以立即返回。 b.释放信号量(不唤醒): 生产者线程通过等待Empty信号量使空缓冲区数量减少了1,通过释放Full信号量使满缓冲区数量增加了1,这样就表示生产者线程生产了一个产品并占用了一个缓冲区。 c.等待信号量(阻塞): 由于开始时生产者线程生产产品的速度较快,而消费者线 程消费产品的速度较慢,所以当缓冲池中所有的缓冲区都被产品占用时,生产者在生产 新的产品时就会被阻塞. d.释放信号量(唤醒): 只有当消费者线程从缓冲池中消费了一个产品,从而产生 一个空缓冲区后,生产者线程才会被唤醒并继续生产14号产品. 4.修改EOS的信号量算法 1)要求: 在目前EOSKernel项目的ps/semaphore.c文件中,PsWaitForSemaphore函数的Milliseconds参数只能是INFINITE,PsReleaseSemaphore函数的ReleaseCount参数只能是1。 现在要求同时修改PsWaitForSemaphore函数和PsReleaseSemaphore函数中的代码,使这两个参数能够真正起到作用,使信号量对象支持等待超时唤醒功能和 批量释放功能。 2)测试: a.使用修改完毕的EOSKernel项目生成完全版本的SDK文件夹,并覆盖之前的生产者—消费者应用程序项目的SDK文件夹。 b.按F5调试执行原有的生产者-消费者应用程序项目,结果必须仍然与图1一致。 如果有错误,可以调试内核代码来查找错误,然后在内核项目中修改,并重复步骤a。 三、实验内容问题及解答 1.思考在ps/semaphore.c文件内的PsWaitForSemaphore和PsReleaseSemaphore 函数中,为什么要使用原子操作? 可以参考本书第2章中的第2.6节。 答: 在执行释放信号量和等待信号量时,是不允许CPJ向应外部中断的,否则,会产 生不可预料的结果。 2.绘制ps/semaphore.c文件内PsWaitForSemaphore和PsReleaseSemaphore函数的流程图。 实验六时间片轮转调度 「、实验目的及要求 1•调试EOS的线程调度程序,熟悉基于优先级的抢先式调度 2•为EOS添加时间片轮转调度,了解其它常用的调度算法。 [、实验内容及步骤 1.准备实验 3.调试线程调度程序 a)调试当前线程不被抢先的情况 b)调试当前线程被抢先的情况 4.为EOS添加时间片轮转调度 a)要求: 修改ps/sched.c文件中的PspRoundRobin函数(第337行),在其中实现时间片轮转调度算法。 b)测试: 三、实验内容问题及解答 1.结合线程调度执行的时机,说明在ThreadFunction函数中,为什么可以使用“关 中断”和“开中断”的方法来保护控制台这种临界资源。 一般情况下,应该使用互斥信号量(MUTE)来保护临界资源,但是在ThreadFunction函数中却不能使用互斥信号量,而只能使用“关中断”和“开中断”的方法,结合线程调度的对象说明这样做的原因。 答: 关中断后CPU就不会响应任何由外部设备发出的硬中断(包括定时计数器中断和键盘中断等)了,也就不会发生线程调度了,从而保证各个线程可以互斥的访问控制台。 这里绝对不能使用互斥信号量(MUTEX保护临界资源的原因: 如果使用互斥信号量,则那些由于访问临界区而被阻塞的线程,就会被放入互斥信号量的等待队列,就不会在相应优先级的就绪队列中了,而时间片轮转调度算法是对就绪队列的线程进行轮转调度,而不是对这些被阻塞的线程进行调度,也就无法进行实验了。 使用“关中断”和“开中断”进行同步就不会改变线程的状态,可以保证那些没有获得处理器的线程都在处于就绪队列中。 实验八分页存储器管理 、实验目的与要求 1.学习i386处理器的二级页表硬件机制,理解分页存储器管理原理。 2.查看EOS^用程序进程和系统进程的二级页表映射信息,理解页目录和页表的管理方式。 3.编程修改页目录和页表的映射关系,理解分页地址变换原理。 二、实验内容及步骤 1.准备实验。 2.查看EOS^用程序进程的页目录和页表。 3.查看应用程序进程和系统进程并发时的页目录和页表。 4.查看应用程序进程并发时的页目录和页表。 5.在二级页表中映射新申请的物理页。 三、实验代码 设计代码: PRIVATE VOID ConsoleCmdMemoryMap(INHANDLEStdHandle){ BOOLIntState; ULONGPfnOfPageDirectory; ULONGPageTotal=0; ULONGIndexOfDirEntry; ULONGIndexOfTableEntry; PMMPTE_HARDWAREpPde; PMMPTE_HARDWAREpPte; ULONG_PTRPageTableBase; ULONG_PTRVirtualBase; constchar*OutputFormat=NULL; ASSERT(PspCurrentProcess==PspSystemProcess); IntState=KeEnablelnterrupts(FALSE);//关中断 ULONGPfnArray[2]; MiAllocateZeroedPages(2,PfnArray); OutputFormat="Newpageframenumber: Ox%X,Ox%X\n"; fprintf(StdHandle,OutputFormat,PfnArray[0],PfnArray[1]); KdbPrint(OutputFormat,PfnArray[0],PfnArray[1]); IndexOfDirEntry=(0xE0000000>>22);//虚拟地址的高10位是PDE标号 ((PMMPTE_HARDWARE)0xC0300000)[lndexOfDirEntry].PageFrameNumber=PfnArray[0]; ((PMMPTE_HARDWARE)0xC0300000)[lndexOfDirEntry].Valid=1;//有效 ((PMMPTE_HARDWARE)0xC0300000)[lndexOfDirEntry].Writable=1;〃可写 MiFlushEntireTlb();//刷新快表 PageTableBase=0xC0000000+IndexOfDirEntry*PAGE_SIZE; IndexOfTableEntry=(0xE0000000>>12)&0x3FF; ((PMMPTE_HARDWARE)PageTableBase)[lndexOfTableEntry].PageFrameNumber=PfnArray[1]; ((PMMPTE_HARDWARE)PageTableBase)[lndexOfTableEntry].Valid=1; ((PMMPTE_HARDWARE)PageTableBase)[lndexOfTableEntry].Writable=1; MiFlushEntireTlb();//刷新快表 IndexOfTableEntry=(0xE0001000>>12)&0x3FF; ((PMMPTE_HARDWARE)PageTableBase)[lndexOfTableEntry].PageFrameNumber=PfnArray[1]; ((PMMPTE_HARDWARE)PageTableBase)[lndexOfTableEntry].Valid=1; ((PMMPTE_HARDWARE)PageTableBase)[lndexOfTableEntry].Writable=1; MiFlushEntireTlb();//刷新快表 OutputFormat="ReadMemoryOxEOOOIOOO: %d\n"; fprintf(StdHandle,OutputFormat,*((PINT)0xE0001000)); KdbPrint(OutputFormat,*((PINT)0xE0001000)); *((PINT)0xE0000000)=100;//写共享内存 fprintf(StdHandle,OutputFormat,*((PINT)0xE0001000)); KdbPrint(OutputFormat,*((PINT)0xE0001000)); OutputFormat="\nCR3->0
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 华北电力 大学 操作系统 实验 报告