操作系统 操作系统的启动

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

操作系统
实验报告
哈尔滨工程大学
软件学院
第二讲操作系统的启动
一、实验概述
1. 实验名称
操作系统的启动
2. 实验目的
跟踪调试EOS在PC机上从加电复位到成功启动的全过程,了解操作系统的启动过程。

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

3. 实验类型(验证、设计)
验证
4. 实验内容
4.1 准备实验
4.2 调试EOS操作系统的启动过程
4.2.1 使用Bochs做为远程目标机
4.2.2 调试BIOS程序
4.2.3 调试软盘引导扇区程序
4.2.4 调试加载程序
4.2.5 调试内核
4.2.6 EOS启动后的状态和行为
二、实验环境
实验使用的操作系统:Wingdows xp
实验工具:Oslab
三、实验过程
实验过程:
1.查看CPU在没有执行任何指令之前主要寄存器中的数据,以及内存中的数据:
1. 1启动调试后在Console窗口中输入调试命令sreg后按回车,显示当前CPU 中各个段寄存器的值,如图1.1。

图1.1
1.2输入调试命令r后按回车,显示当前CPU中各个通用寄存器的值,如图1.2
图1.2
1.3.输入调试命令xp /1024b 0x0000,查看开始的1024个字节的物理内存。

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

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

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

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

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

2. BIOS在执行完自检和初始化工作后,会将软盘引导扇区加载到物理地址0x7c00-0x7dff位置,并从0x7c00处的指令开始执行引导程序,所以接下来练习从0x7c00处调试软盘引导扇区程序:
2.1. 输入调试命令vb 0x0000:0x7c00,这样就在逻辑地址0x0000:0x7c00(相当于物理地址0x7c00)处添加了一个断点。

输入调试命令c继续执行,在0x7c00处的断点中断。

中断后会在Console窗口中输出下一个要执行的指令,即软盘引导扇区程序的第一条指令。

输入调试命令sreg验证CS寄存器(0x0000)的值,如图2.1
图2.1
2.2输入调试命令r验证IP寄存器(0x7c00)的值。

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

图2.3
观察此块内存最开始的两个字节分别为0xeb和0x6d,这和引导程序第一条指令的字节码(eb6d)是相同的。

2.4输入调试命令xp /512b 0x0600
由输出结果可验证第一个用户可用区域是空白的。

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

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

图2.6.1
图2.6.2
由图2.6.2和图2.6.2可知,两个用户地址可用区域的高地址端也是空白的
2.7输入调试命令xp /512b 0xa0000。

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

图2.8
由此图可验证上位内存的高地址端已经被系统占用。

3.软盘引导扇区程序的主要任务就是将软盘中的loader.bin文件加载到物理内存的0x1000处,然后跳转到loader程序的第一条指令(物理地址0x1000处的指令)继续执行loader程序。

按照下面的步骤调试此过程:
3.1 输入调试命令vb 0x0000:0x7d81添加一个断点。

输入调试命令c继续执行,到断点处中断。

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

图3.1.1
图3.1.2
由图3.1.1中的前三个字节:0x19,0x18,0x01可验证与图3.1.2中的loader.lst文件中的第一条指令(E91801)的字节码是相同的
3.2根据之前记录的loader.bin文件的大小,自己设计一个查看内存的调试命令,查看内存中loader程序结束位置的字节码,并与loader.lst文件中最后指令的字节码比较,验证loader程序被完全加载到了正确的位置。

由于loader.bin的大小为1566字节,转为十六进制即为61E,而loader.bin 的开始地址为0x1000,所以loader.bin的最后地址为0x161E,减去八位,即为
0x1616,查看loader.lst最后八位
图3.2.1
图3.2.2
由图3.2.1可知最后的几位0x93,0xff,0xff,0xff,0xc9,0xc2,0x04,0x00,可验证
与图3.2.2中最后的指令:E993FFFFFF,C9,C20400相同
4.Loader程序的主要任务是将操作系统内核(kernel.dll文件)加载到内存中,
然后让CPU进入保护模式并且启用分页机制,最后进入操作系统内核开始执行(跳
转到kernel.dll的入口点执行)。

按照下面的步骤调试上述过程:
4.1使用添加物理地址断点的调试命令pb 0x1513添加一个断点。

输入调试命令c 继续执行,到断点处中断
图4.1
4.2 使用查看虚拟内存的调试命令x /1wx 0x80001117查看内存中保存的32位函数入口地址,在Console窗口中会输出类似下面的内容:
图4.2
4.3在start.c源代码文件中的KiSystemStartup函数名上点击鼠标右键,在弹出的快捷菜单中选择“添加监视”,KiSystemStartup函数就被添加到了“监视”窗口中。

在“监视”窗口中可以看到此函数地址为
图4.3
与在虚拟内存x80001117处保存的函数入口地址相同,说明的确是由Loader程序进入了操作系统内核。

5.按F5继续执行EOS操作系统内核,在Display窗口中显示EOS操作系统已经启动,并且控制台程序已经开始运行了。

查看EOS的版本号:
5.1. 在控制台中输入命令“ver”后按回车。

输出EOS版本后的控制台如图所示。

图5.1
5.2查看EOS启动后的进程和线程的信息:在控制台中输入命令“pt”后按回车。

输出的进程和线程信息如图10-5所示。

图5.2
6.
6.1在OS Lab中选择“调试”菜单中的“停止调试”,结束之前的调试。

在OS Lab“项目管理器”窗口中双击Floppy.img文件,使用FloppyImageEditor 工具打开此软盘镜像文件。

将本实验文件夹中的Hello.exe文件拖动到FloppyImageEditor工具窗口的文件列表中释放,Hello.exe文件即被添加到软盘镜像文件中。

Hello.exe一个EOS应用程序,其源代码可以参见本实验文件夹中的Hello.c源文件。

在FloppyImageEditor中选择“文件”菜单中的“保存”后关闭FloppyImageEditor。

图6.1
6.2待EOS启动完毕,在EOS控制台中输入命令“hello”后按回车。

此时Hello.exe 应用程序就开始执行。

迅速按Ctrl+F2切换到控制台2,并输入命令“pt”后按回车。

输出的进程和线程信息如图10-6所示。

图6.2.1
7.思考与练习
7.1为什么EOS操作系统从软盘启动时要使用boot.bin和loader.bin两个程序?使用一个可以吗?它们各自的主要功能是什么?如果将loader.bin的功能移动到boot.bin文件中,则boot.bin文件的大小是否仍然能保持小于512字节?
答:boot文件夹包含了两个汇编文件boot.asm和loader.asm。

这两个文件生成的二进制文件boot.bin和loader.bin会被写入软盘镜像文件。

操作系统启动时boot.bin和loader.bin引导软盘加载程序,二者缺一不可。

使用Boot.bin的主要功能是引导软盘;loader.bin的主要功能是加序。

如果把loader.bin功能移动到boot.bin程序中,必然导致程序规模扩大,可能使其大于512字节。

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

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

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

优点:由低地址开始,便于检索查找。

小文件占用小空间,节约资源。

限制:loader.bin文件必须小于1c00k.
7.3仔细比较实验指导10-5图(本实验中的图5.2)和图10-6(本实验中的图6.2.1),尝试说明哪个是应用程序的进程,它和系统进程有什么区别,哪个是应用程序的主线程,它和系统线程有什么区别。

答:图6.2.1是应用程序的进程,在进程列表中只有一个ID为1的系统进程,
其优先级24,包含有10个线程,其中的ID为2的线程是该进程的主线程,系统进程没有映像名称。

在线程列表中有10个线程,它们都是系统线程。

区别:主线程的优先级别高。

存放在物理内存的低端。

四、实验体会
通过本次试验,我对计算机存储结构有了更深的认识,了解操作系统的启动过程。

理解操作系统启动后的工作方式。

同时也提高了写作报告的能力。

能更加熟练的运用实验环境了。

相关文档
最新文档