实验 调试操作系统的启动

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

操作系统的启动

实验性质:验证

建议学时:2学时

一、实验目的

跟踪调试EOS在PC机上从加电复位到成功启动的全过程,了解操作系统的启动过程。

二、预备知识

阅读《EOS实验指南》第三章,了解EOS操作系统的启动过程。阅读2.4节,复习汇编语言的相关知识,并掌握NASM汇编代码的特点。阅读附录A,了解Bochs和Virtual PC 这两款虚拟机软件的特点,重点熟悉Bochs的调试命令。

三、实验内容

3.1 准备实验

1.启动OS Lab。

2.新建一个EOS Kernel项目。

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文

件,记录下此文件的大小,在下面的实验中会用到。找到由其它源文件生成的操

作系统内核文件kernel.dll。

3.2 调试EOS操作系统的启动过程

3.2.1 使用Bochs做为远程目标机

按照下面的步骤将调试时使用的远程目标机修改为Bochs:

1.在“项目管理器”窗口中,右键点击项目节点,在弹出的快捷菜单中选择“属性”。

2.在弹出的“属性页”对话框右侧的属性列表中找到“远程目标机”属性,将此属

性值修改为“Bochs Debug”(此时按F1可以获得关于此属性的帮助)。

3.点击“确定”按钮关闭“属性页”对话框。接下来就可以使用Bochs模拟器调试

BIOS程序和软盘引导扇区程序了。

3.2.2 调试BIOS程序

按F5启动调试,此时会弹出两个Bochs窗口。标题为“Bochs for windows - Display”的窗口相当于计算机的显示器,显示操作系统的输出。标题为“Bochs for windows - Console”的窗口是Bochs的控制台,用来输入调试命令,输出各种调试信息。

启动调试后,Bochs在CPU要执行的第一条指令(即BIOS的第一条指令)处中断。此时,Display窗口没有显示任何内容,Console窗口显示要执行的BIOS第一条指令的相关信息,并等待用户输入调试命令,如图1:

图1:Console窗口显示在BIOS第一条指令处中断

从Console窗口显示的内容中,我们可以获得关于BIOS第一条指令的如下信息:

●行首的[0xfffffff0]表示此条指令所在的物理地址。

●f000:fff0表示此条指令所在的逻辑地址(段地址:偏移地址)。

●jmp far f000:e05b是此条指令的反汇编代码。

●行尾的ea5be000f0是此条指令的十六进制字节码,可以看出此条指令有5个字节。

接下来可以按照下面的步骤查看CPU在没有执行任何指令之前主要寄存器和内存中的数据:

1.在Console窗口中输入调试命令sreg后按回车,显示当前CPU中各个段寄存器的

值,如图2。其中CS寄存器信息行中的“s=0xf000”表示CS寄存器的值为0xf000。

图2:使用sreg命令查看段寄存器的值

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

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

图3:使用r命令查看通用寄存器的值

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

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

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

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

可以验证BIOS第一条指令所在逻辑地址中的段地址和CS寄存器值是一致的,偏移地址和IP寄存器的值是一致的。由于内存还没有被使用,所以其中的值都为0。

3.2.3 调试软盘引导扇区程序

BIOS在执行完自检和初始化工作后,会将软盘引导扇区加载到物理地址0x7c00-0x7dff 位置,并从0x7c00处的指令开始执行引导程序,所以接下来练习从0x7c00处开始调试软盘引导扇区程序:

1.输入调试命令vb 0x0000:0x7c00,这样就在逻辑地址0x0000:0x7c00(相当于物理

地址0x7c00)处添加了一个断点。

2.输入调试命令c继续执行,在0x7c00处的断点中断。中断后会在Console窗口中

输出下一个要执行的指令,即软盘引导扇区程序的第一条指令

(0) [0x00007c00] 0000:7c00 (unk. ctxt): jmp .+0x006d (0x00007c6f) ; eb6d

3.为了方便后面的使用,先在纸上分别记录下此条指令的字节码(eb6d)和此条指令

要跳转执行的下一条指令的地址(括号中的0x00007c6f)。

4.输入调试命令sreg验证CS寄存器(0x0000)的值。

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

6.由于BIOS程序此时已经执行完毕,输入调试命令xp /1024b 0x0000验证此时BIOS

中断向量表已经被载入。

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

存最开始的两个字节分别为0xeb和0x6d,这和引导程序第一条指令的字节码

(eb6d)是相同的。此块内存最后的两个字节分别为0x55和0xaa,表示引导扇区

是激活的,可以用来引导操作系统,这两个字节是boot.asm中最后一行语句

dw 0xaa55

定义的(注意,Intel 80386 CPU使用little endian字节顺序)。

8.输入调试命令xp /512b 0x0600验证第一个用户可用区域是空白的。

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

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

是空白的。

11.输入调试命令xp /512b 0xa0000验证上位内存已经被系统占用。

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

NASM汇编器在将boot.asm生成为boot.bin的同时,会生成一个boot.lst列表文件,帮助开发者调试boot.asm文件中的汇编代码。按照下面的步骤查看boot.lst文件:

1.在“项目管理器”窗口中,右键点击“boot”文件夹中的boot.asm文件。

2.在弹出的快捷菜单中选择“打开生成的列表文件”,在源代码编辑器中就会打开文

件boot.lst。

3.将boot.lst文件和boot.asm文件对比可以发现,此文件包含了boot.asm文件中所有

的汇编代码,同时在代码的左侧又添加了更多的信息。

4.在boot.lst中查找到软盘引导扇区程序第一条指令所在的行(第73行)

73 00000000 EB6D jmp short Start

此行包含的信息有:

●73是行号。

●00000000是此条指令相对于程序开始位置的偏移(第一条指令应该为0)。

●EB6D是此条指令的字节码,和之前记录下来的指令字节码是一致的。

软盘引导扇区程序的主要任务就是将软盘中的loader.bin文件加载到物理内存的0x1000处,然后跳转到loader程序的第一条指令(物理地址0x1000处的指令)继续执行loader程序。按照下面的步骤调试上述过程:

1.在boot.lst文件中查找到加载完毕loader.bin文件后要跳转到loader程序中执行的指

令(第278行)

278 00000181 EA00100000 jmp 0:LOADER_ORG

相关文档
最新文档