操作系统实验报告
工程大学
计算机科学与技术学院
一.实验概述
1.实验名称:操作系统的启动
2.实验目的:
1)跟踪调试EOS在PC机上从加电复位到成功后启动的全过程,了解操作系统的启动过程;
2)查看EOS启动后的状态和行为,理解操作系统启动后的工作方式。
3.实验类型:验证,设计
4.实验容:
1)准备实验,启动OS Lab,新建一个EOS Kernel项目;
2)调试EOS操作系统的启动过程
①使用Bochs作为远程目标机
②调试BIOS程序
③调试软盘引导扇区程序
④调试加载程序
⑤调试核
⑥查看EOS启动后的状态和行为
二.实验环境
操作系统:windows XP
编译器:Tevalaton OS Lab
语言:C++
三.实验过程
1.设计思路和流程图:
2.实验过程:
1)在Console窗口中输入调试指令sreg,查看当前CPU中各个段寄存器的值,其中CS寄存器信息行中的“s=0xf000”表示CS寄存器的值为0xf000。
2)输入调试命令r,显示当前CPU中各个通用寄存器的值,“rip: 0x00000000:0000fff0”表示 IP 寄存器的值为 0xfff0。
3)输入调试命令 xp /1024b 0x0000,查看开始的 1024 个字节的物理存。
在Console 中输出的这 1K 物理存的值都为 0,说明 BIOS 中断向量表还没有被加载到此处。
4)输入调试命令 xp /512b 0x7c00,查看软盘引导扇区应该被加载到的存位置。
输出的存值都为 0,说明软盘引导扇区还没有被加载到此处。
可以验证 BIOS 第一条指令所在逻辑地址中的段地址CS寄存器值是一致的,偏移地址和 IP 寄存器的值是一致的。
由于存还没有被使用,所以其中的值都为0。
5)输入调试命令 vb 0x0000:0x7c00,这样就在逻辑地址 0x0000:0x7c00(相当于物理地址 0x7c00)处添加了一个断点。
输入调试命令 c 继续执行,在 0x7c00 处的断点中断。
中断后会在 Console 窗口中输出下一个要执行的指令,即软盘引导扇区程序的第一条指令。
6)输入调试命令 sreg 验证 CS 寄存器(0x0000)的值。
7)输入调试命令 r 验证 IP 寄存器(0x7c00)的值。
8)输入调试命令 xp /512b 0x0600 可验证第一个用户可用区域是空白的。
9)设计两个查看存的调试命令,分别验证这两个用户可用区域的高地址端也是空白的。
10)软盘引导扇区程序的主要任务就是将软盘中的 loader.bin 文件加载到物理存的 0x1000 处,然后跳转到 loader 程序的第一条指令(物理地址 0x1000 处的指令)继续执行 loader 程序。
输入调试命令xp /8b 0x1000查看存0x1000处的数据,验证此块存的前三个字节和loader.lst 文件中的第一条指令的字节码是相同的。
11)根据之前记录的 loader.bin 文件的大小,自己设计一个查看存的调试命令,查看存中 loader 程序结束位置的字节码,并与 loader.lst 文件中最后指令的字节码比较,验证 loader 程序被完全加载到了正确的位置。
12)调试核,在项目管理器中打开start.c文件,对其中的操作系统核入口点函数KiSystemStartup添加断点及监视,在监视窗口中可以看到此函数的地址,与在虚拟存x80001117处保存的函数入口地址相同,说明的确是由loader程序进入了操作系统核。
13)在控制台中输入命令“ver”,可得EOS的的版本,在控制台中输入命令“pt”,课查看输出的进程和线程信息。
在进程列表中只有一个 ID 为 1 的系统进程,其优先级为 24,包含有 10 个线程,其中的 ID 为 2 的线程是该进程的主线程,系统进程没有映像名称。
在线程列表中有 10 个线程,它们都是系统线程。
其中优先级为 0 的是空闲线程,当没有优先级大于 0 的线程占用处理器时,空闲线程就会在处理器上运行并处于运行状态(Running),否则就处于就绪状态(Ready)。
ID 为 20 的线程是控制台派遣线程,用于将键盘事件派遣到活动的控制台线程,所以在没有键盘事件发生的时间里,该线程
都处于阻塞状态(Waiting)。
余下的八个线程都是控制台线程,分别对应于八个控制台,由于它们执行的是同一个控制台线程函数(ke/sysproc.c 文件中的 KiShellThread 函数),所以它们开始执行的地址都是相同的。
控制台线程只有在处理控制台命令的时候才会处于运行状态,其它时间它们都在等待控制台命令的输入,会处于阻塞状态。
由于本次是在控制台 1 中执行的 pt 命令,所以控制台 1 对应的线程处于运行状态,而其它的七个控制台线程都处于阻塞状态。
14)将实验文件夹中的hello.exe文件添加到软盘镜像文件中,并在EOS启动完毕后,在EOS控制台中输入命令“hello”,迅速切换到控制台2,输入命令“pt”,可查看输出的进程和线程信息。
四.实验体会
本次实验了解了操作系统启动后的行为和状态,通过一步步具体的操作,理解了操作系统启动后运行的每个方面。
在实验的过程中,对于自己设计的命令,可以在给定的围进行尝试,并不仅仅是将步骤中的例子略微改动,对于验证loader.lst文件最后的字节码命令,需要经过一定的计算,由于其文件大小为1.56KB,因此需要将最后的位置减去8b,得到最后一个字节码的位置,因此是0x1616。
通过比较hello程序添加之前之后的进程状态比较,可以看出ID为33的线程是应用程序的主线程,数量只有一个,hello程序和系统进程区别是SYSTEM栏是N,且优先级比系统低,系统是24,应用程序是8。