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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

打开boot.asm 和loader.asm 两个汇编文件。

生成项目。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

二、实验正文1 准备实验2 练习使用控制台命令创建 EOS 应用程序的进程Hello.exe 应用程序输出结果3 练习通过编程的方式让应用程序创建另一个应用程序的进程可知子进程结束后,父进程继续执行4 调试 CreateProcess 函数在“反汇编”窗口的左侧显示的虚拟地址中看到所有指令的虚拟地址都大于 0x80000000,说明内核( kernel.dll)处于高 2G 的虚拟地址空间中。

查看 main 函数的指令所在的虚拟地址都是小于 0x80000000,说明应用程序( eosapp.exe)处于低 2G 的虚拟地址空间中。

5 调试 PsCreateProcess 函数进程执行的结果:绘制一幅进程创建过程的流程图。

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

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

相关主题