华北电力大学操作系统实验报告.doc

上传人:奥沙丽水 文档编号:48846 上传时间:2025-07-09 格式:DOC 页数:21 大小:515.50KB
下载 相关 举报
华北电力大学操作系统实验报告.doc_第1页
第1页 / 共21页
华北电力大学操作系统实验报告.doc_第2页
第2页 / 共21页
华北电力大学操作系统实验报告.doc_第3页
第3页 / 共21页
华北电力大学操作系统实验报告.doc_第4页
第4页 / 共21页
华北电力大学操作系统实验报告.doc_第5页
第5页 / 共21页
点击查看更多>>
资源描述

1、华 北 电 力 大 学 实 验 报 告华北电力大学实 验 报 告| 实验名称 操作系统综合实验 课程名称 操作系统 | 专业班级:网络 学生姓名: 学 号: 成 绩:指导教师:王德文/姜丽梅 实验日期:2015年11月4日 实验一 实验环境的使用一、 实验目的 1. 熟悉操作系统集成实验环境 OS Lab 的基本使用方法。 2. 练习编译、调试 EOS 操作系统内核以及 EOS 应用程序。二、 实验内容 1. 启动OS Lab; 2. 学习OS Lab的基本使用方法:练习使用OS Lab编写一个Windows控制台应用程序,熟悉OS Lab的基本使用方法(主要包括新建项目、生成项目、调试项目等

2、 3. EOS内核项目的生成和调试:对EOS内核项目的各种操作(包括新建、生成和各种调试功能等)与对Windows控制台项目的操作是完全一致的; 4. EOS应用程序项目的生成和调试; 5. 退出OS Lab。三、 实验内容问题及解答 1. 练习使用单步调试功能(逐过程、逐语句),体会在哪些情况下应该使用“逐过程”调试,在哪些情况下应该使用“逐语句”调试。练习使用各种调试工具(包括“监视”窗口、“调用堆栈”窗口等)。 答:逐语句,就是每次执行一行语句,如果碰到函数调用,它就会进入到函数里面。 而逐过程,碰到函数时,不进入函数,把函数调用当成一条语句执行。因此,在需要进入函数体时用逐语句调试

3、而不需要进入函数体时用逐过程调试。四、 实验过程 1. 新建Windows控制台应用程序 生成项目: 执行项目: 调试项目: 2. 使用断点终端执行: 查看EOS SDK(Software Development Kit)文件夹: 修改EOS应用程序项目名称 :五、实验心得 这次是验证性试验,具体步骤和操作方法都是与实验教程参考书上一致,实验很顺利,实验过程没有遇到困难。通过这次实验,我掌握了OS Lab启动和退出操作;练习使用OS Lab编写一个Windows控制台应用程序,熟悉OS Lab的基本使用方法新建项目、生成项目、调试项目等。实验2 操作系统的启动一、实验目的 1. 跟踪调试EO

4、S在PC机上从加电复位到成功启动的全过程,了解操作系统的启动过程。 2. 查看EOS启动后的状态和行为,理解操作系统启动后的工作方式。二、使用仪器 二、实验内容 1. 准备实验。 2. 调试EOS操作系统的启动过程。 3. 调试加载程序。Loader程序的主要任务是将操作系统内核(kernel.dll文件)加载到内存中,然后让CPU进入保护模式并且启用分页机制,最后进入操作系统内核开始执行(跳转到kernel.dll的入口点执行)。 4. 调试内核。 5. EOS启动后的状态和行为。查看EOS的版本号: 1)在控制台中输入命令“ver”后按回车。 2)输出EOS版本后的控制台如下图所示。 6.

5、 查看有应用程序运行时进程和线程的信息: 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、

6、loader.bin和kernel.dll三个二进制写入软盘镜像文件中,然后让虚拟机来执行软盘中的EOS操作系统。仅使用其中一个是不能运行的。第 页 共 页实验3 进程的创建一、实验目的 1. 练习使用EOS API函数CreateProcess创建一个进程,掌握创建进程的方法,理解进程和程序的区别。 2. 调试跟踪CreateProcess函数的执行过程,了解进程的创建过程,理解进程是资源分配的单位。二实验内容 1. 准备实验。启动OS Lab。 2. 练习使用控制台命令创建EOS应用程序的进程。使用控制台命令创建EOS应用程序的进程如图: 3. 练习通过编程的方式让应用程序创建另一个应用程

7、序的进程。应用程序创建另一个应用程序的进程的执行结果如图: 4. 调试CreateProcess函数。 5. 调试PsCreateProcess函数”。 6. 练习通过编程的方式创建应用程序的多个进程三实验内容问题及解答 1. 在源代码文件NewTwoProc.c提供的源代码基础上进行修改, 要求使用hello.exe同时创建10个进程。提示:可以使用 PROCESS_INFORMATION 类型定义一个有10个元素的数组,每一个元素对应一个进程。使用一个循环创建10个子进程,然后再使用一个循环等待10个子进程结束,得到退出码后关闭句柄。 答:修改代码为:STARTUPINFO Startup

8、Info;PROCESS_INFORMATION ProcInfo10;ULONG ulExitCode;INT nResult=0;。int i,j;/#ifdef_DEBUG_asm(int $3n nop);#endif printf(Create10p/rocessesand wait for the processes exit.nn); StartupInfo.StdInput = GetStdHandle(STD_INPUT_HANDLE);StartupInfo.StdOutput = GetStdHandle(STD_OUTPUT_HANDLE);StartupInfo.St

9、dError = GetStdHandle(STD_ERROR_HANDLE);for(i =0; i 10; i+) if(CreateProcess(A:Hello.exe,NULL,0,&StartupInfo,&ProcInfoi); else for(j = 0; j i; j+) WaitForSingleObject(ProcInfoj.ProcessHandle, INFINITE); GetExitCodeProcess(ProcInfoj.ProcessHandle, printf(nThe process %d exit with %d.n,j,ulExitCode);

10、CloseHandle(ProcInfoj.ProcessHandle); CloseHandle(ProcInfoj.ThreadHandle); printf(CreateProcess Failed,Error code:0x%X.n, GetLastError(); nResult = 1; return nResult; for(i=0;i10;i+) WaitForSingleObject(ProcInfoi.ProcessHandle, INFINITE); GetExitCodeProcess(ProcInfoi.ProcessHandle, &ulExitCode); for

11、i=0i 22);/ 虚拟地址的高 10 位是 PDE 标号(PMMPTE_HARDWARE)0xC0300000)IndexOfDirEntry.PageFrameNumber = PfnArray0;(PMMPTE_HARDWARE)0xC0300000)IndexOfDirEntry.Valid = 1;/ 有效(PMMPTE_HARDWARE)0xC0300000)IndexOfDirEntry.Writable = 1;/ 可写MiFlushEntireTlb();/ 刷新快表PageTableBase = 0xC0000000 + IndexOfDirEntry * PAGE_S

12、IZE;IndexOfTableEntry = (0xE0000000 12) & 0x3FF;(PMMPTE_HARDWARE)PageTableBase)IndexOfTableEntry.PageFrameNumber = PfnArray1;(PMMPTE_HARDWARE)PageTableBase)IndexOfTableEntry.Valid = 1;(PMMPTE_HARDWARE)PageTableBase)IndexOfTableEntry.Writable = 1;MiFlushEntireTlb();/ 刷新快表IndexOfTableEntry = (0xE00010

13、00 12) & 0x3FF;(PMMPTE_HARDWARE)PageTableBase)IndexOfTableEntry.PageFrameNumber = PfnArray1;(PMMPTE_HARDWARE)PageTableBase)IndexOfTableEntry.Valid = 1;(PMMPTE_HARDWARE)PageTableBase)IndexOfTableEntry.Writable = 1;MiFlushEntireTlb();/ 刷新快表OutputFormat = Read Memory 0xE0001000: %dn;fprintf(StdHandle,

14、OutputFormat, *(PINT)0xE0001000);KdbPrint(OutputFormat, *(PINT)0xE0001000);*(PINT)0xE0000000) = 100;/ 写共享内存fprintf(StdHandle, OutputFormat, *(PINT)0xE0001000);KdbPrint(OutputFormat, *(PINT)0xE0001000);OutputFormat = nCR3-0x%Xn;PfnOfPageDirectory = (ULONG)(PspSystemProcess-Pas-PfnOfPageDirectory);fpr

15、intf(StdHandle, OutputFormat, PfnOfPageDirectory);KdbPrint(OutputFormat, PfnOfPageDirectory);for(IndexOfDirEntry = 0; IndexOfDirEntry Valid)continue;OutputFormat = PDE: 0x%X (0x%X)-0x%Xn;VirtualBase = (IndexOfDirEntry PageFrameNumber);KdbPrint(OutputFormat, IndexOfDirEntry, VirtualBase, pPde-PageFra

16、meNumber);PageTableBase = (ULONG_PTR)PTE_BASE + IndexOfDirEntry * PAGE_SIZE;for(IndexOfTableEntry = 0; IndexOfTableEntry Valid)continue;OutputFormat = ttPTE: 0x%X (0x%X)-0x%Xn;VirtualBase = (IndexOfDirEntry PDI_SHIFT) | (IndexOfTableEntry PageFrameNumber);KdbPrint(OutputFormat, IndexOfTableEntry, Vi

17、rtualBase, pPte-PageFrameNumber);OutputFormat = nPhysical Page Total: %dn;fprintf(StdHandle, OutputFormat, PageTotal);KdbPrint(OutputFormat, PageTotal);OutputFormat = Physical Memory Total: %dnn;fprintf(StdHandle, OutputFormat, PageTotal * PAGE_SIZE);KdbPrint(OutputFormat, PageTotal * PAGE_SIZE);Out

18、putFormat = nNonused Page Count: %dn;fprintf(StdHandle, OutputFormat, MiGetAnyPageCount();KdbPrint(OutputFormat, MiGetAnyPageCount();IndexOfDirEntry = (0xE0000000 22);/ 虚拟地址的高 10 位是 PDE 标号PageTableBase = 0xC0000000 + IndexOfDirEntry * PAGE_SIZE;IndexOfTableEntry = (0xE0000000 12) & 0x3FF;(PMMPTE_HAR

19、DWARE)PageTableBase)IndexOfTableEntry.Valid = 0;IndexOfTableEntry = (0xE0001000 12) & 0x3FF;(PMMPTE_HARDWARE)PageTableBase)IndexOfTableEntry.Valid = 0;(PMMPTE_HARDWARE)0xC0300000)IndexOfDirEntry.Valid = 0;MiFlushEntireTlb();MiFreePages(2, PfnArray);OutputFormat = nNonused Page Count: %dn;fprintf(Std

20、Handle, OutputFormat, MiGetAnyPageCount();KdbPrint(OutputFormat, MiGetAnyPageCount();KeEnableInterrupts(IntState);/ 开中断四、实验问题内容及解答 1. 观察之前输出的页目录和页表的映射关系,可以看到页目录的第0x300个PDE映射的页框号就是页目录本身,说明页目录被复用为了页表。而恰恰就是这种映射关系决定了4K的页目录映射在虚拟地址空间的0xC0300000-0xC0300FFF,4M的页表映射在xC0000000-0xC03FFFFF。现在,假设修改了页目录,使其第0x100个

21、PDE映射的页框号是页目录本身,此时页目录和页表会映射在4G虚拟地址空间的什么位置呢?说明计算方法。 答:页目录:PDE标号0x100做为虚拟地址的高10位,PTE标号0x100做为虚拟地址的12-22位,得到虚拟地址0x 40100000。页表:PDE标号0x100做为虚拟地址的高10位,PTE标号0x0做为虚拟地址的12-22位,得到虚拟地址0x 40000000。五、实验心得与体会 通过操作系统试验,了解了操作系统的启动过程和运行方式,加深了对计算机操作系统的理解。实验10 磁盘调度算法一、 实验目的 1. 通过学习EOS实现磁盘调度算法的机制,掌握磁盘调度算法执行的条件和时机。 2.

22、观察EOS实现的FCFS、SSTF和SCAN磁盘调度算法,了解常用的磁盘调度算法。 3. 编写CSCAN和N-Step-SCAN磁盘调度算法,加深对各种扫描算法的理解。 二、实验内容二、实验内容及步骤 1. 准备实验 1)新建一个EOS Kernel项目。 2. 验证先来先服务(FCFS)磁盘调度算法1)打开ke文件夹中的sysproc.c文件。 2)打开io/block.c文件。 3)按F7生成,然后按F5调试。 4)在控制台中输入命令“ds”后按回车。 5)将输出复制到一个文本文件中,然后结束此次调试。 3. 验证最短寻道时间优先(SSTF)磁盘调度算法 1)打开sstf.c文件使用sst

23、f.c文件中IopDiskSchedule函数的函数体,替换block.c文件中IopDiskSchedule函数的函数体。 2)按F7生成,然后按F5调试。3. 在控制台中输入命令“ds”后按回 车。 3)将输出复制到一个文本文件中,结束此次调试。 4. 验证SSTF算法造成的线程“饥饿”现象 1)修改sysproc.c文件ConsoleCmdDiskSchedule函数中的源代码,仍然使磁头初始停留在磁道10,而让其它线程依次访问磁道78、 21、9、8、11、41、10、67、12、10。 2)按F7生成,然后按F5调试。 3)在控制台中输入命令“ds”后按回车。将输出复制到一个文本文

24、件中,结束此次调试。 5. 验证扫描(SCAN)磁盘调度算法 1)打开文件夹中的scan.c文件, 使用scan.c文件中IopDiskSchedule函数的函数体,替换block.c文件中IopDiskSchedule函数的函数体。 2)按F7生成,按F5调试。 3)在控制台中输入命令“ds”后按回车。将输出保存到一个文本 文件中。最后将ConsoleCmdDiskSchedule函数中线程访问的磁 道号恢复到本实验3.2中的样子。 6. 改写SCAN算法 使用本实验3.2中的数据进行测试,确保调度的结果与图18-5中显示 的一致,也可以多准备几组测试数据,保证改写的SCAN算法是正确的。

25、测试成功后,将改写的SCAN算法源代码备份。 7. 编写循环扫描(CSCAN)磁盘调度算法 使用本实验3.2中的数据进行测试,确保调度的结果与图18-7一致。 在控制台中多次输入“ds”命令,查看磁盘调度算法执行的情况。然后 将输出复制到一个文本文件中,将编写的CSCAN算法备份。 8. 验证SSTF、SCAN及CSCAN算法中的“磁臂粘着”现象 1)修改sysproc.c文件ConsoleCmdDiskSchedule函数中的源代码 2)分别使用SSTF、SCAN和CSCAN算法调度这组数据。 3)将“输出”窗口中的内容复制到一个文本文件中。 9. 编写N-Step-SCAN磁盘调度算法三、

26、实验问题解答 1. 在执行SCAN、N-Step-SCAN磁盘调度算法时,如果在EOS控制台中多次输入“ds”命令,调度的顺序会发生变化,说明造成这种现象的原因(提示:注意这两种算法使用的全局变量)。尝试修改源代码,使这两种算法在多次执行时,都能确保调度的顺序一致(提示:可以参考io/block.c文件中IopReceiveRequest函数和IopProcessNextRequest函数判断磁盘调度算法开始工作和结束工作的方法)。 答:SCAN算法使用了全局变量ScanInside记录磁头移动的方向,每次执行“ds” 时,磁头的移动方向都可能不一样,所在磁道也可能不一样,所以在每次 执行时距离最短的线程也不同,所以调度的顺序会发生变化,例如在第一 次执行“ds”命令时,ScanInside初始化为true则开始磁头是从外向内移 动的,结束时磁头变为从内向外移动,所以在下次执行“ds”命令时,开始磁头就继续从内向外移动了。要解决这个问题,可以IopProcessNextRequest函数中,每次检测到磁盘调度算法结束工作时,将这些全局变量恢复为默认值。

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

当前位置:首页 > 高等教育 > 实验设计

宁ICP备18001539号-1