当前位置:文档之家› 操作系统实验报告附思考题

操作系统实验报告附思考题

操作系统实验报告附思考题文档编制序号:[KKIDT-LLE0828-LLETD298-POI08]课程设计(综合实验)报告( 2015 -- 2016 年度第 1 学期)名称:操作系统综合实验题目: oslab综合实验院系:计算机系班级:学号:学生姓名:指导教师:设计周数:分散进行成绩:日期: 2015 年 10 月 29 日实验1 实验环境的使用一、综合实验的目的与要求熟悉操作系统集成实验环境OS Lab 的基本使用方法。

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

二、实验正文1.启动 OS Lab执行项目Windows 控制台窗口内容显示调试项目使用断点中断执行单步调试.3单步调试结果显示:练习使用“逐语句”功能和“跳出”功能查看变量的值快速监视添加监视调用堆栈调用堆栈显示内容进入Func 函数双击 main 函数所在的行表示此函数是当前调用堆栈中的活动函数。

3 新建EOS 内核项目4 EOS 应用程序项目的生成和调试新建EOS 应用程序项目调试项目添加断点后单步调试结果显示查看软盘镜像文件中的内容修改EOS 应用程序项目名称5 退出OS Lab6 保存EOS 内核项目三、综合实验总结或结论思考与练习:1.在哪些情况下应该使用“逐过程”调试,在哪些情况下应该使用“逐语句”调试。

答:逐语句为每执行一行语句,如果碰到函数调用它就会进入到函数里面。

而逐过程碰到函数时不进入函数,把函数调用当成一条语句去执行。

2. 生成EOS SDK 文件夹的目的和作用。

明白文件夹的组织结构和各个文件的来源和作用。

查看EOS 应用程序包含了SDK 文件夹中的哪些头文件,是如何包含的(1)EOSSDK为应用程序调用系统API提供服务,可作为用户编程中使用的工具包集合。

(2)其主要包括INC头文件LIB文件夹、导入库文件和BIN文件夹、动态链接库、可执行程序、二进制文件。

(3)包含的头文件有:负责导出API函数,声明负责导出函数类型的定义,负责导出错误码。

(4)EOS应用程序在项目的头文件中只是包含了文件,在文件中又包含了和文件。

实验 2 操作系统的启动一、综合实验的目的与要求跟踪调试 EOS 在 PC 机上从加电复位到成功启动全过程,了解操作系统的启动过程。

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

二、实验正文1. 准备实验新建一个 EOS Kernel 项目。

打开和两个汇编文件。

生成项目。

找到文件,记录下此文件的大小 1566 字节。

2 调试 EOS 操作系统的启动过程使用 Bochs 做为远程目标机找到“远程目标机”属性,将此属性值修改为“BochsDebug”调试 BIOS 程序在 Console 窗口中输入调试命令 sreg 后按回车,其中 CS 寄存器信息行中的“ s=0xf000”表示 CS 寄存器的值为 0xf000。

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

其中“ rip:0x00000000:0000fff0”表示 IP 寄存器的值为 0xfff0。

输入调试命令 xp /1024b 0x0000,查看开始的 1024 个字节的物理内存。

在 Console 中输出的这1K 物理内存的值都为 0,说明 BIOS 中断向量表还没有被加载到此处。

输入调试命令 xp /512b 0x7c00,查看软盘引导扇区应该被加载到的内存位置。

输出的内存值都为 0,说明软盘引导扇区还没有被加载到此处。

可以验证 BIOS 第一条指令所在逻辑地址中的段地址和 CS 寄存器值是一致的,偏移地址和 IP 寄存器值是一致的。

由于内存还没有被使用,所以其中的值都为 0。

调试软盘引导扇区程序输入调试命令 vb 0x0000:0x7c00,添加断点输入调试命令 c 继续执行输入调试命令 sreg 验证 CS 寄存器( 0x0000)的值。

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

输入调试命令 xp /1024b 0x0000 验证此时 BIOS 中断向量表已经被载入。

输入调试命令 xp /512b 0x7c00 显示软盘引导扇区程序的所有字节码。

输入调试命令 xp /512b 0x0600 验证图 3-2 中第一个用户可用区域是空白的。

输入调试命令 xp /512b 0x7e00 验证图 3-2 中第二个用户可用区域是空白的。

自己设计两个查看内存的调试命令,验证这两个用户可用区域的高地址端是空白的。

(1) xp /512b 0x7f00 (2) xp /512b0x0700输入调试命令 xp /512b 0xa0000 验证图 3-2 中上位内存已经被系统占用。

自己设计一个查看内存的调试命令,验证上位内存的高地址端已经被系统占用。

xp /512b 0xb0000输入调试命令 xp /8b 0x1000 查看内存0x1000 处的数据,验证此块内存的前三个字节和文件中的第一条指令的字节码是相同的。

根据之前记录的文件的大小,自己设计一个查看内存的调试命令文件的大小为1566个字节,转换为十六进制的61E,所以程序最后八个字节在物理内存的0x1616到0x161D的位置,所以调试命令为xp/8b 0x1616。

经检验,程序结束位置字节码与反汇编命令相同。

注:查看文件的大小应在“属性”对话框中看。

调试加载程序在“监视”窗口中可以看到KiSystemStartup 函数地址为{void (PVOID)} 0x800***** KiSystemStartup>EOS 启动后的状态和行为三、综合实验总结或结论1.为什么 EOS 操作系统从软盘启动时要使用和两个程序使用一个可以吗它们各自的主要功能是什么如果将的功能移动到文件中,则文件的大小是否仍然能保持小于512 字节答:在IDE环境启动执行EOS操作系统时,会将,,三个二进制写入软件镜像文件中,然后让虚拟机来执行软盘中的EOS操作系统,使用其中一个是不能运行的。

2.为什么软盘引导扇区程序选择将加载到第一个可用区域的 0x1000 处呢这样做有什么好处这样做会对文件的大小有哪些限制。

答:用户只用两个可用区域,加载位置非此即彼。

第一个可用用户区是低地址区,且空间大小比较小,适合容纳小文件,所以我们选择将占用空加载到第一用户区。

优点:低地址开始,便于搜索查找小文件占用小空间,节约资源。

限制:文件必须小于 1c00k。

实验 3 进程的创建一、综合实验的目的与要求练习使用 EOS API 函数 CreateProcess 创建一个进程,掌握创建进程的方法,理解进程和程序的区别。

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

二、实验正文1 准备实验2 练习使用控制台命令创建 EOS 应用程序的进程应用程序输出结果3 练习通过编程的方式让应用程序创建另一个应用程序的进程可知子进程结束后,父进程继续执行4 调试 CreateProcess 函数在“反汇编”窗口的左侧显示的虚拟地址中5 调试 PsCreateProcess 函数进程执行的结果:绘制一幅进程创建过程的流程图。

6 练习通过编程的方式创建应用程序的多个进程多个进程并发执行的结果:有结果显示可知有两个进程在执行三、综合实验总结或结论1. 在源代码文件提供的源代码基础上进行修改,要求使用同时创建 10 个进程。

修改结果如下图所示:部分修改代码如下图所示:(“……”部分为相似的4-9进程代码)if (CreateProcess("A:\\", NULL, 0, &StartupInfo, &ProcInfoOne)&& CreateProcess("A:\\", NULL, 0, &StartupInfo, &ProcInfoTwo)&& CreateProcess("A:\\", NULL, 0, &StartupInfo, &ProcInfo3)……&& CreateProcess("A:\\", NULL, 0, &StartupInfo, &ProcInfo10)) {WaitForSingleObject, INFINITE);WaitForSingleObject, INFINITE);WaitForSingleObject, INFINITE);……WaitForSingleObject, INFINITE);GetExitCodeProcess, &ulExitCode);……GetExitCodeProcess, &ulExitCode);printf("\nThe process 3 exit with %d.\n", ulExitCode);……GetExitCodeProcess, &ulExitCode);printf("\nThe process 10 exit with %d.\n", ulExitCode);CloseHandle;……CloseHandle;CloseHandle;CloseHandle;……CloseHandle;CloseHandle;2.在 PsCreateProcess 函数中调用了 PspCreateProcessEnvironment 函数后又先后调用了PspLoadProcessImage 和 PspCreateThread 函数,学习这些函数的主要功能。

能够交换这些函数被调用的顺序吗答:PspCreateProcessEnvironment创建了进程控制块,地址空间和分配了句柄表,PspLoadProcessImage将进程的可执行映象加载的到了进程的地址空间中,PspCreateThread 创建了进程的主线程。

这三个函数知道自己从哪里开始执行,执行哪些指令,因此不能交换它们的顺序。

实验 4 线程的状态和转换一、综合实验的目的与要求调试线程在各种状态间的转换过程,熟悉线程的状态和转换。

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

二、实验正文1 准备实验2 调试线程状态的转换过程线程由阻塞状态进入就绪状态“ *Thread”State 域的值为 3( Waiting),双向链表项 StateListEntry 的 Next 和 Prev 指针的值都不为 0,说明这个线程还处于阻塞状态,并在某个同步对象的等待队列中; StartAddr 域的值为IopConsoleDispatchThread,说明这个线程就是控制台派遣线程。

相关主题