您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > 操作系统实验报告附思考题
课程设计(综合实验)报告(2015--2016年度第1学期)名称:操作系统综合实验题目:oslab综合实验院系:计算机系班级:学号:学生姓名:指导教师:设计周数:分散进行成绩:日期:2015年10月29日1实验1实验环境的使用一、综合实验的目的与要求熟悉操作系统集成实验环境OSLab的基本使用方法。练习编译、调试EOS操作系统内核以及EOS应用程序。二、实验正文1.启动OSLab2.1执行项目Windows控制台窗口内容显示2.2调试项目2.2.1使用断点中断执行2.2.2单步调试2.2.2.3单步调试结果显示:练习使用“逐语句”功能和“跳出”功能2.2.3查看变量的值快速监视添加监视2.2.4调用堆栈调用堆栈显示内容进入Func函数双击main函数所在的行表示此函数是当前调用堆栈中的活动函数。3新建EOS内核项目4EOS应用程序项目的生成和调试4.1新建EOS应用程序项目4.2调试项目添加断点后单步调试结果显示4.3查看软盘镜像文件中的内容4.4修改EOS应用程序项目名称5退出OSLab6保存EOS内核项目三、综合实验总结或结论思考与练习:1.在哪些情况下应该使用“逐过程”调试,在哪些情况下应该使用“逐语句”调试。2答:逐语句为每执行一行语句,如果碰到函数调用它就会进入到函数里面。而逐过程碰到函数时不进入函数,把函数调用当成一条语句去执行。2.生成EOSSDK文件夹的目的和作用。明白文件夹的组织结构和各个文件的来源和作用。查看EOS应用程序包含了SDK文件夹中的哪些头文件,是如何包含的?(1)EOSSDK为应用程序调用系统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.准备实验新建一个EOSKernel项目。打开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/1024b0x0000,查看开始的1024个字节的物理内存。在Console中输出的这1K物理内存的值都为0,说明BIOS中断向量表还没有被加载到此处。2.2.4输入调试命令xp/512b0x7c00,查看软盘引导扇区应该被加载到的内存位置。输出的内存值都为0,说明软盘引导扇区还没有被加载到此处。3可以验证BIOS第一条指令所在逻辑地址中的段地址和CS寄存器值是一致的,偏移地址和IP寄存器值是一致的。由于内存还没有被使用,所以其中的值都为0。2.3调试软盘引导扇区程序2.3.1.输入调试命令vb0x0000:0x7c00,添加断点2.3.2.输入调试命令c继续执行2.3.3.输入调试命令sreg验证CS寄存器(0x0000)的值。2.3.4.输入调试命令r验证IP寄存器(0x7c00)的值。2.3.5输入调试命令xp/1024b0x0000验证此时BIOS中断向量表已经被载入。2.3.6.输入调试命令xp/512b0x7c00显示软盘引导扇区程序的所有字节码。42.3.7输入调试命令xp/512b0x0600验证图3-2中第一个用户可用区域是空白的。2.3.8输入调试命令xp/512b0x7e00验证图3-2中第二个用户可用区域是空白的。2.3.9自己设计两个查看内存的调试命令,验证这两个用户可用区域的高地址端是空白的。(1)xp/512b0x7f00(2)xp/512b0x07002.3.10输入调试命令xp/512b0xa0000验证图3-2中上位内存已经被系统占用。52.3.11自己设计一个查看内存的调试命令,验证上位内存的高地址端已经被系统占用。xp/512b0xb00002.3.12输入调试命令xp/8b0x1000查看内存0x1000处的数据,验证此块内存的前三个字节和loader.lst文件中的第一条指令的字节码是相同的。2.3.13根据之前记录的loader.bin文件的大小,自己设计一个查看内存的调试命令loader.bin文件的大小为1566个字节,转换为十六进制的61E,所以程序最后八个字节在物理内存的0x1616到0x161D的位置,所以调试命令为xp/8b0x1616。经检验,loader.bin程序结束位置字节码与反汇编命令相同。6注:查看loader.bin文件的大小应在“属性”对话框中看。2.4调试加载程序使用查看虚拟内存的调试命令x/1wx0x80001117查看内存中保存的32位函数入口地址,在Console窗口中会输出:0x0000000080001117bogus+0:0x800*****2.5调试内核在“监视”窗口中可以看到KiSystemStartup函数地址为{void(PVOID)}0x800*****KiSystemStartup2.6EOS启动后的状态和行为三、综合实验总结或结论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进程的创建一、综合实验的目的与要求练习使用EOSAPI函数CreateProcess创建一个进程,掌握创建进程的方法,理解进程和程序的区别。调试跟踪CreateProcess函数的执行过程,了解进程的创建过程,理解进程是资源分配的单位。二、实验正文1准备实验2练习使用控制台命令创建EOS应用程序的进程7Hello.exe应用程序输出结果3练习通过编程的方式让应用程序创建另一个应用程序的进程可知子进程结束后,父进程继续执行4调试CreateProcess函数在“反汇编”窗口的左侧显示的虚拟地址中看到所有指令的虚拟地址都大于0x80000000,说明内核(kernel.dll)处于高2G的虚拟地址空间中。查看main函数的指令所在的虚拟地址都是小于0x80000000,说明应用程序(eosapp.exe)处于低2G的虚拟地址空间中。5调试PsCreateProcess函数进程执行的结果:绘制一幅进程创建过程的流程图。6练习通过编程的方式创建应用程序的多个进程多个进程并发执行的结果:有结果显示可知有两个进程在执行三、综合实验总结或结论1.在源代码文件NewTwoProc.c提供的源代码基础上进行修改,要求使用hello.exe同时创建10个进程。修改结果如下图所示:8部分修改代码如下图所示:(“……”部分为相似的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(\nTheprocess3exitwith%d.\n,ulExitCode);……GetExitCodeProcess(ProcInfo10.ProcessHandle,&ulExitCode);printf(\nTheprocess10exitwith%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函数,学习这些函数的主要功能。能够交换这些函数被调用的顺序吗?答:PspCreateProcessEnvironment创建了进程控制块,地址空间和分配了句柄表,PspLoadProcessImage将进程的可执行映象加载的到了进程的地址空间中,PspCreateThread创建了进程的主线程。这三个函数知道自己从哪里开始执行,执行哪些指令,因此不能交换它们的顺序。9实验4线程的状态和转换一、综合实验的目的与要求调试线程在各种状态间的转换过程,熟悉线程的状态和转换。通过为线程增加挂起状态,加深对线程状态的理解。二、实验正文1准备实验2调试线程状态的转换过程2.1线程由阻塞状态进入就绪状态“*Thread”State域的值为3(Waiting),双向链表项StateListEntry的Next和Prev指针的值都不为0,说明这个线程还处于阻塞状态,并在某个同步对象的等待队列中;StartAddr域的值为IopConsoleDispatchThread
本文标题:操作系统实验报告附思考题
链接地址:https://www.777doc.com/doc-2381239 .html