综合实验报告(2013--2014年度第1学期)名称:操作系统综合实验题目:基于OSLab的操作系统综合实验院系:计算机系班级:网络学号:201学生姓名:指导教师:王平,王晓辉设计周数:1成绩:日期:2013年12月实验一:实验环境的使用一、实验目的:1、熟悉操作系统集成实验环境OSLab的基本使用方法。2、练习编译、调试EOS操作系统内核以及EOS应用程序。二、实验内容:1、启动OSLab2、学习OSLab的基本使用方法3、EOS内核项目的生成和调试4、EOS应用程序项目的生成和调试5、退出OSLab6、保存EOS内核项目三、实验过程:本实验实验过程主要按照eos操作系统实验教程上所对应的章节来进行。实验结果:(一)启动OSLab:(无)(二)学习OSLab的基本使用方法:(1)、创建了第一个项目:(2)、生成了第一个项目(3)、添加了func文件后经过一系列的调试,打印出了相关内容,按shift+F5结束调试。(4)、查看变量的值:有3种方法:1、将鼠标移动到源代码编辑器中变量n的名称上,此时会弹出一个窗口显示出变量n当前的值(由于此时还没有给变量n赋值,所以是一个随机值)。2、在源代码编辑器中变量n的名称上点击鼠标右键,在弹出的快捷菜单中选择“快速监视”,可以使用“快速监视”对话框查看变量n的值。然后,可以点击“关闭”按钮关闭“快速监视”对话框。3、在源代码编辑器中变量n的名称上点击鼠标右键,在弹出的快捷菜单中选择“添加监视”,变量n就被添加到了“监视”窗口中。使用“监视”窗口可以随时查看变量的值和类型。此时按F10进行一次单步调试,可以看到“监视”窗口中变量n的值会变为0(1)、调用堆栈:使用“调用堆栈”窗口可以在调试的过程中查看当前堆栈上的函数,还可以帮助理解函数的调用层次和调用过程。EOS内核项目的生成和调试:(2)、新建EOS内核项目(3)、生成项目(4)、调试项目(5)、查看软盘镜像文件中的内容(6)、查看EOSSDK(SoftwareDevelopmentKit)文件夹EOS应用程序项目的生成和调试新建EOS应用程序项目生成项目:按F7生成项目调试项目:按F5进行各种调试查看软盘镜像文件中的内容:使用FloppyImageEditor工具打开该项目中的Floppy.img文件,查看软盘镜像中的文件。L修改EOS应用程序项目名称(三)退出(四)保存四、实验总结:经过试验1,我理解了OSLab的基本操作方法和主要用途,这为以后的试验打下了基础。实验二:操作系统的启动一、实验目的跟踪调试EOS在PC机上从加电复位到成功启动的全过程,了解操作统的启动过程。查看EOS启动后的状态和行为,理解操作系统启动后的工作方式。二、实验内容及其实验步骤3.1准备实验1.启动OSLab。2.新建一个EOSKernel项目。3.在“项目管理器”窗口中打开boot文件夹中的boot.asm和loader.asm两个汇编文件。boot.asm是软盘引导扇区程序的源文件,loader.asm是loader程序的源文件。简单阅读一下这两个文件中的NASM汇编代码和注释。4.按F7生成项目。5.生成完成后,使用Windows资源管理器打开项目文件夹中的Debug文件夹。找到由boot.asm生成的软盘引导扇区程序boot.bin文件,该文件的大小一定为512字节(与软盘引导扇区的大小一致)。找到由loader.asm生成的loader程序loader.bin文件,记录下此文件的大小1566字节,在下面的实验中会用到。找到由其它源文件生成的操作系统内核文件kernel.dll。3.2调试EOS操作系统的启动过程3.2.1使用Bochs做为远程目标机3.2.2调试BIOS程序启动调试后,Bochs在CPU要执行的第一条指令(即BIOS的第一条指令)处中断。此时,Display窗口没有显示任何内容,Console窗口显示要执行的BIOS第一条指令的相关信息,并等待用户输入调试命令,如图10-1:从Console窗口显示的内容中,我们可以获得关于BIOS第一条指令的如下信息:行首的[0xfffffff0]表示此条指令所在的物理地址。f000:fff0表示此条指令所在的逻辑地址(段地址:偏移地址)。jmpfarf000:e05b是此条指令的反汇编代码。行尾的ea5be000f0是此条指令的十六进制字节码,可以看出此条指令有5个字节。接下来可以按照下面的步骤,查看CPU在没有执行任何指令之前主要寄存器中的数据,以及内存中的数据:1.在Console窗口中输入调试命令sreg后按回车,显示当前CPU中各个段寄存器的值,如图10-2。其中CS寄存器信息行中的“s=0xf000”表示CS寄存器的值为0xf000。2.输入调试命令r后按回车,显示当前CPU中各个通用寄存器的值,如图10-3。其中“rip:0x00000000:0000fff0”表示IP寄存器的值为0xfff0。3.输入调试命令xp/1024b0x0000,查看开始的1024个字节的物理内存。在Console中输出的这1K物理内存的值都为0,说明BIOS中断向量表还没有被加载到此处。4.输入调试命令xp/512b0x7c00,查看软盘引导扇区应该被加载到的内存位置。输出的内存值都为0,说明软盘引导扇区还没有被加载到此处。3.2.3调试软盘引导扇区程序3.2.4调试加载程序3.2.5调试内核调试内核的步骤如下:1.在OSLab的“项目管理器”窗口中打开ke文件夹中的start.c文件,此文件中只定义了一个函数,就是操作系统内核的入口点函数KiSystemStartup。2.在KiSystemStartup函数中的代码行(第61行)KiInitializePic();添加一个断点。3.现在可以在Console窗口中输入调试命令c继续调试,在刚刚添加的断点处中断。4.在start.c源代码文件中的KiSystemStartup函数名上点击鼠标右键,在弹出的快捷菜单中选择“添加监视”,KiSystemStartup函数就被添加到了“监视”窗口中。在“监视”窗口中可以看到此函数地址为{void(PVOID)}0x800*****KiSystemStartup与在虚拟内存x80001117处保存的函数入口地址相同,说明的确是由Loader程序进入了操作系统内核。5.按F5继续执行EOS操作系统内核,在Display窗口中显示EOS操作系统已经启动,并且控制台EOS操作系统实验教程北京海西慧学科技有限公司程序已经开始运行了。3.2.6EOS启动后的状态和行为查看EOS的版本号:1.在控制台中输入命令“ver”后按回车。2.输出EOS版本后的控制台如图10-4所示。查看EOS启动后的进程和线程的信息:1.在控制台中输入命令“pt”后按回车。2.输出的进程和线程信息如图10-5所示。3.2.6EOS启动后的状态和行为三.实验总结通过本实验了解操作系统的启动过程,理解操作系统启动后的工作方式。实验三:进程的创建:一、实验目的:1、练习使用EOSAPI函数CreateProcess创建一个进程,掌握创建进程的方法,理解进程和程序的区别。2、调试跟踪CreateProcess函数的执行过程,了解进程的创建过程,理解进程是资源分配的单位。二、实验内容:1、准备实验:新建一个EOSKernel项目,分别使用Debug配置和Release配置生成此项目。新建一个EOS应用程序项目,使用在第EOSKernel生成的SDK文件夹覆盖EOS应用程序项目文件夹中的SDK文件夹。2、练习使用控制台命令创建EOS应用程序的进程3、练习通过编程的方式让应用程序创建另一个应用程序的进程4、调试CreateProcess函数5、调试PsCreateProcess函数6、练习通过编程的方式创建应用程序的多个进程三、实验过程:1、准备实验:(无)2、练习使用控制台命令创建EOS应用程序的进程:使用FloppyImageEditor工具将本实验文件夹内的Hello.exe文件添加到Floppy.img文件中。启动调试,在EOS的控制台中输入命令“A:\Hello.exe”后回车。得到结果:3、练习通过编程的方式让应用程序创建另一个应用程序的进程:使用NewProc.c文件中的源代码替换之前创建的EOS应用程序项目中的EOSApp.c文件内的源代码。启动调试,得到如下结果:可以看到父进程(EOSApp.exe)首先开始执行并输出内容,父进程创建了子进程(Hello.exe)后,子进程开始执行并输出内容,待子进程结束后父进程再继续执行。4、调试CreateProcess函数:按F5启动调试EOS应用程序,在弹出异常对话框后点“是”,在main函数中调用CreateProcess函数的代码行添加一个断点。5、调试PsCreateProcess函数:在PsCreateProcess函数中找到调用PspCreateProcessEnvironment函数的代码行添加一个断点。进入此中断,按F11进入PspCreateProcessEnvironment函数。在调用ObCreateObject函数的代码行添加一个断点,进入此中断,将表达式*NewProcess添加到“监视”窗口中,监视其值得变化。接下来调试初始化进程控制块中各个成员变量的过程:1)首先创建进程的地址空间,即4G虚拟地址空间。2)按F5继续调试,到此断点处中断。3)按F10执行此行代码后中断。4)在“监视”窗口中查看进程控制块的成员变量Pas的值已经不再是0。说明已经初始化了进程的4G虚拟地址空间。5)使用F10一步步调试PspCreateProcessEnvironment函数中后面的代码,在调试的过程中根据执行的源代码,查看“监视”窗口中*NewProcess表达式的值,。6)当从PspCreateProcessEnvironment函数返回到PsCreateProcess函数后,停止按F10。此时“监视”窗口中已经不能再显示表达式*NewProcess的值了,在PsCreateProcess函数中是使用ProcessObject指针指向进程控制块的,所以将表达式*ProcessObject添加到“监视”窗口中就可以继续观察新建进程控制块中的信息。7)接下来继续使用F10一步步调试PsCreateProcess函数中的代码,同样要注意观察执行后的代码修改了进程控制块中的哪些成员变量。8)按F5继续执行,EOS内核会为刚刚初始化完毕的进程控制块新建一个进程。激活虚拟机窗口查看新建进程执行的结果。9)在OSLab中选择“调试”菜单中的“停止调试”结束此次调试。10)选择“调试”菜单中的“删除所有断点”。结果:代码:/*提供该示例代码是为了阐释一个概念,或者进行一个测试,并不代表着最安全的编码实践,因此不应在应用程序或网站中使用该示例代码。对于超出本示例代码的预期用途以外的使用所造成的偶然或继发性损失,北京海西慧学科技有限公司不承担任何责任。*/#includeEOSApp.h////main函数参数的意义://argc-argv数组的长度,大小至少为1,argc-1为命令行参数的数量。//argv-字符串指针数组,数组长度为命令行参数个数+1。其中argv[0]固定指向当前//进程所执行的可执行文件的路径字符串,argv[1]及其后面的指针指向各个命令行//参数。//例如通过命令行内容a:\hello.exe-a-b启动进程后,hello.exe的main函//数的参数argc的值为3,argv[0]指向字符串a:\hello.exe,argv[1]指向//参数字符串-a,argv[2]指向参数字符串-b。//intmain(intargc,char*argv[]){////启动调试EOS应用程序前要特别注意下面的问题:////1、如果要在调试应用程序时能够调试进入内核并显示对应的源码,//必须使用EOS核心项目编译生成完全版