文档库

最新最全的文档下载
当前位置:文档库 > 实验1 实验环境的使用

实验1 实验环境的使用

实验1 实验环境的使用

实验性质:验证

建议学时:2学时

一、实验目的

熟悉操作系统集成实验环境OS Lab的基本使用方法。

练习编译、调试EOS操作系统内核以及EOS应用程序。

二、实验环境

Windows XP、OS Lab

三、实验内容

3.1 启动OS Lab

1. 在安装有OS Lab的计算机上,可以使用两种不同的方法来启动OS Lab:

在桌面上双击“Tevation OS Lab”图标。或者点击“开始”菜单,在“程序”中的“Tevation OS Lab”中选择“Tevation OS Lab”。

2. OS Lab每次启动后都会首先弹出一个用于注册用户信息的对话框(可以选择对话框标题栏上的“帮助”按钮获得关于此对话框的帮助信息)。在此对话框中填入学号和姓名后,点击“确定”按钮完成本次注册。注意:每次登陆必须实名制,否则,无法给出实验成绩

3. 观察OS Lab主窗口的布局。OS Lab主要由下面的若干元素组成:菜单栏、工具栏以及停靠在左侧和底部的各种工具窗口,余下的区域用来放置编辑器窗口。

3.2 学习OS Lab的基本使用方法

练习使用OS Lab编写一个Windows控制台应用程序,熟悉OS Lab的基本使用方法(主要包括新建项目、生成项目、调试项目等)。

3.2.1 新建Windows控制台应用程序项目

新建一个Windows控制台应用程序项目的步骤如下:

1. 在“文件”菜单中选择“新建”,然后单击“项目”。

2. 在“新建项目”对话框中,选择项目模板“控制台应用程序 (c)”。

3. 在“名称”中输入新项目使用的文件夹名称“oslab”。

4. 在“位置”中输入新项目保存在磁盘上的位置“C:\test”。

5. 点击“确定”按钮。

新建完毕后, OS Lab 会自动打开这个新建的项目。在“项目管理器”窗口中(如图9-1所示),树的根节点是项目节点,项目的名称是“console”,各个子节点是项目包含的文件夹或者文件。此项目的源代码主要包含一个头文件“console.h”和一个C语言源文件“console.c”。

使用Windows资源管理器打开磁盘上的“C:\test\oslab”文件夹查看项目中包含的文件(提示,在“项目管理器”窗口的项目节点上点击右键,然后在弹出的快捷菜单中选择“打开所在的文件夹”即可)。

实验1 实验环境的使用

图9-1:打开Windows控制台应用程序项目后的“项目管理器”窗口

3.2.2 生成项目

使用“生成项目”功能可以将程序的源代码文件编译为可执行的二进制文件,方法十分简单:在“生成”菜单中选择“生成项目”。

在项目生成过程中,“输出”窗口会实时显示生成的进度和结果。如果源代码中不包含语法错误,会在最后提示生成成功,如图9-2:

实验1 实验环境的使用

图9-2:成功生成Windows控制台应用程序项目后的“输出”窗口

如果源代码中存在语法错误,“输出”窗口会输出相应的错误信息(包括错误所在文件的路径,错误在文件中的位置,以及错误原因),并在最后提示生成失败。此时在“输出”窗口中双击错误信息所在的行,OS Lab会使用源代码编辑器打开错误所在的文件,并自动定位到错误对应的代码行。可以在源代码文件中故意输入一些错误的代码(例如删除一个代码行结尾的分号),然后再次生成项目,然后在“输出”窗口中双击错误信息来定位存在错误的代码行,将代码修改正确后再生成项目。

生成过程是将每个源代码文件(.c、.cpp、.asm等文件)编译为一个对象文件(.o文件),然后再将多个对象文件链接为一个目标文件(.exe、.dll等文件)。成功生成Windows控制台应用程序项目后,默认会在“C:\test\oslab\debug" 目录下生成一个名称为“console.o”的对象文件和名称为“console.exe”的Windows 控制台应用程序,可以使用Windows资源管理器查看这些文件。

3.2.3 执行项目

在OS Lab中选择“调试”菜单中的“开始执行(不调试)”,可以执行刚刚生成的Windows控制台应用程序。启动执行后会弹出一个Windows控制台窗口,显示控制台应用程序输出的内容。按任意键即可关闭此Windows 控制台窗口。

3.2.4 调试项目

OS Lab 提供的调试器是一个功能强大的工具,使用此调试器可以观察程序的运行时行为并确定逻辑错误的位置,可以中断(或挂起)程序的执行以检查代码,计算和编辑程序中的变量,查看寄存器,以及查看从源代码创建的指令。为了顺利进行后续的各项实验,应该学会灵活使用这些调试功能。

在开始练习各种调试功能之前,首先需要对刚刚创建的例子程序进行必要的修改,步骤如下:

1. 右键点击“项目管理器”窗口中的“源文件”文件夹节点,在弹出的快捷菜单中选择“添加”中的“添加

新文件”。

2. 在弹出的“添加新文件”对话框中选择“C 源文件”模板。

3. 在“名称”中输入文件名称“func”。

4. 点击“添加”按钮,添加并自动打开文件func.c,此时的“项目管理器”窗口会如图9-3:

实验1 实验环境的使用

图9-3:添加func.c文件后的“项目管理器”窗口

5. 在 func.c 文件中添加函数:

int Func (int n)

{ n = n + 1;

return n; }

6. 点击源代码编辑器上方的console.c标签,切换到console.c文件。将 main 函数修改为:

int main (int argc, char* argv[])

{ int Func (int n); // 声明Func函数

int n = 0;

n = Func(10);

printf ("Hello World!\n");

return 0;

}

代码修改完毕后按F7(“生成项目”功能的快捷键)。注意查看“输出”窗口中的内容,如果代码中存在语法错误,就根据错误信息进行修改,直到成功生成项目。

3.2.

4.1 使用断点中断执行

1. 在main函数中定义变量n的代码行 int n = 0; 上点击鼠标右键,在弹出的快捷菜单中选择“插入/删除断点”,会在此行左侧的空白处显示一个红色圆点,表示已经成功在此行代码添加了一个断点,如图9-4:

实验1 实验环境的使用

图9-4:在console.c文件的main函数中添加断点后的代码行

2. 在“调试”菜单中选择“启动调试”,Windows控制台应用程序开始执行,随后OS Lab窗口被自动激活,并且在刚刚添加断点的代码行左侧空白中显示一个黄色箭头,表示程序已经在此行代码处中断执行(也就是说下一个要执行的就是此行代码),如图9-5:

实验1 实验环境的使用

图9-5:Windows控制台应用程序启动调试后在断点处中断执行

3. 激活Windows控制台应用程序的窗口,可以看到窗口中没有输出任何内容,因为printf函数还没有被执行。

3.2.

4.2 单步调试

按照下面的步骤练习使用“逐过程”功能:

1. 在OS Lab的“调试”菜单中选择“逐过程”,“逐过程”功能会执行黄色箭头当前指向的代码行,并将黄色箭头指向下一个要执行的代码行。

2. 按F10(“逐过程”功能的快捷键),黄色箭头就指向了调用printf函数的代码行。查看控制台应用程序窗口,仍然没有任何输出。

3. 再次按F10执行printf函数,查看控制台应用程序窗口,可以看到已经打印出了内容。

4. 在“调试”菜单中选择“停止调试”,结束此次调试。

按照下面的步骤练习使用“逐语句”功能和“跳出”功能:

1. 按F5(“启动调试”功能的快捷键),仍然会在之前设置的断点处中断。

2. 按F10逐过程调试,此时黄色箭头指向了调用函数Func的代码行。

3. 在“调试”菜单中选择“逐语句”,可以发现黄色箭头指向了函数Func中,说明“逐语句”功能可以进入函数,从而调试函数中的语句。

4. 选择“调试”菜单中的“跳出”,会跳出Func函数,返回到上级函数中继续调试(此时Func函数已经执行完毕)。

5. 按Shift+F5(“停止调试”功能的快捷键),结束此次调试。

练习使用“逐过程”、“逐语句”和“跳出”功能,注意体会“逐过程”和“逐语句”的不同。

3.2.

4.3 查看变量的值

在调试的过程中,OS Lab提供了三种查看变量值的方法,按照下面的步骤练习这些方法:

1. 按F5启动调试,仍然会在之前设置的断点处中断。

2. 将鼠标移动到源代码编辑器中变量n的名称上,此时会弹出一个窗口显示出变量n当前的值(由于此时还没有给变量n赋值,所以是一个随机值)。

3. 在源代码编辑器中变量n的名称上点击鼠标右键,在弹出的快捷菜单中选择“快速监视”,可以使用“快速监视”对话框查看变量n的值。然后,可以点击“关闭”按钮关闭“快速监视”对话框。

4. 在源代码编辑器中变量n的名称上点击鼠标右键,在弹出的快捷菜单中选择“添加监视”,变量n就被添加到了“监视”窗口中。使用“监视”窗口可以随时查看变量的值和类型。此时按F10进行一次单步调试,可以看到“监视”窗口中变量n的值会变为0,如图9-6:

实验1 实验环境的使用

图9-6:使用“监视”窗口查看变量的值和类型

如果需要使用十进制查看变量的值,可以点击工具栏上的“十六进制”按钮,从而在十六进制和十进制间切换。自己练习使用不同的进制和不同的方法来查看变量的值,然后结束此次调试。

3.2.

4.4 调用堆栈

使用“调用堆栈”窗口可以在调试的过程中查看当前堆栈上的函数,还可以帮助理解函数的调用层次和调用过程。按照下面的步骤练习使用“调用堆栈”窗口:

1. 按F5启动调试,仍然会在之前设置的断点处中断。

2. 选择“调试”菜单“窗口”中的“调用堆栈”,激活“调用堆栈”窗口。可以看到当前“调用堆栈”窗口中只有一个main函数(显示的内容还包括了参数值和函数地址)。

3. 按F11(“逐语句”功能的快捷键)调试,直到进入Func函数,查看“调用堆栈”窗口可以发现在堆栈上有两个函数Func和main。其中当前正在调试的Func函数在栈顶位置,main函数在栈底位置。说明是在main函数中调用了Func函数。

4. 在“调用堆栈”窗口中双击main函数所在的行,会有一个绿色箭头指向main函数所在的行,表示此函数是当前调用堆栈中的活动函数。同时,会将main函数所在的源代码文件打开,并也使用一个绿色箭头指向Func 函数返回后的位置。

5. 在“调用堆栈”窗口中双击Func函数所在的行,可以重新激活此堆栈帧,并显示对应的源代码。

6. 反复双击“调用堆栈”窗口中Func函数和main函数所在的行,查看“监视”窗口中变量n的值,可以看到在不同的堆栈帧被激活时,OS Lab调试器会自动更新“监视”窗口中的数据,显示出对应于当前活动堆栈帧的信息。

7. 结束此次调试。

3.3 EOS内核项目的生成和调试

3.3.1 新建EOS内核项目

新建一个EOS内核项目的步骤如下:

1. 在“文件”菜单中选择“新建”,然后单击“项目”。

2. 在“新建项目”对话框中,选择项目模板“EOS Kernel”。

3. 在“名称”中输入新项目使用的文件夹名称“eos”。

4. 在“位置”中输入新项目保存在磁盘上的位置“C:\”。

5. 点击“确定”按钮。

此项目就是一个EOS操作系统内核项目,包含了EOS操作系统内核的所有源代码文件。

在“项目管理器”窗口中查看EOS内核项目包含的文件夹和源代码文件,可以看到不同的文件夹包含了EOS操作系统不同模块的源代码文件,例如“mm”文件夹中包含了内存管理模块的源代码文件,“boot”文件夹中包含了软盘引导扇区程序和加载程序的源代码文件。也可以使用Windows资源管理器打开项目所在的文件夹C:\eos,查看所有源代码文件。

3.3.2 生成项目

1. 按F7生成项目,同时查看“输出”窗口中的内容,确认生成成功。

2. 打开C:\eos\debug文件夹,查看生成的对象文件和目标文件。找到boot.bin、loader.bin和kernel.dll三个二进制文件,这三个文件就是EOS操作系统在运行时需要的可执行文件。OS Lab每次启动运行EOS操作系统之前,都会将这三个文件写入一个软盘镜像文件中,然后让虚拟机运行这个软盘镜像中的EOS(相当于将写有这三个二进制文件的软盘放入一个物理机的软盘驱动器中,然后按下开机按钮)。找到libkernel.a文件,此文件是EOS内核文件kernel.dll对应的导入库文件。

3.3.3 调试项目

1. 在“项目管理器”窗口的ke文件夹中找到start.c文件节点,双击此文件节点使用源代码编辑器打开start.c文件。

2. 在start.c文件中KiSystemStartup函数的“KiInitializePic();”语句所在行(第61行)添加一个断点,如图9-7。EOS启动时执行的第一个内核函数就是KiSystemStartup函数。

实验1 实验环境的使用

图9-7:在EOS内核项目的ke/start.c文件中添加一个断点

3. 按F5启动调试,虚拟机开始运行软盘镜像中的EOS。在虚拟机窗口中可以看到EOS启动的过程。随后EOS会在刚刚添加的断点处中断执行。激活虚拟机窗口可以看到EOS也不再继续运行了。各种调试功能(包括单步调试、查看变量的值和各个调试工具窗口)的使用方法与调试Windows控制台程序完全相同,可以自己练习。

4. 按F5继续执行。查看虚拟机窗口,显示EOS操作系统已经启动,并且EOS的控制台程序已经开始运行了。

5. 在“调试”菜单中选择“停止调试”,结束此次调试。

3.3.4 查看软盘镜像文件中的内容

在“项目管理器”窗口中双击软盘镜像文件Floppy.img,就会使用FloppyImageEditor工具打开此文件(在FloppyImageEditor工具中按F1可以查看此工具的帮助文件)。在FloppyImageEditor工具的文件列表中可以找到loader.bin文件和kernel.dll文件,这两个文件都是在启动调试时被写入软盘镜像文件的(可以查看这两个文件的修改日期)。boot.bin文件在启动调试时被写入了软盘镜像的引导扇区中,不受软盘文件系统的管理,所以在文件列表中找不到此文件。关闭FloppyImageEditor工具。

3.3.5 查看EOS SDK(Software Development Kit)文件夹

1. 点击OS Lab工具栏上的“项目配置”下拉列表,选择下拉列表中的“Release”项目配置,“Release”项目配置被设置为新的活动项目配置(原来的活动项目配置是“Debug”)。如图9-8:

实验1 实验环境的使用

图9-8:使用工具栏上的“项目配置”下拉列表切换活动项目配置

2. 按F7使用Release配置生成项目。

3. 生成完毕后,使用Windows资源管理器打开C:\eos文件夹,可以发现在文件夹中多出了一个SDK文件夹,此文件夹就是在生成EOS Kernel项目的同时自动生成的。

4. SDK文件夹中提供了开发EOS应用程序需要的所有文件。打开SDK文件夹中的bin文件夹,可以看到有两个名称分别为debug和release的文件夹。debug文件夹是在使用debug配置生成项目时生成的,其中存放了调试版本的EOS二进制文件。release文件夹是在使用release配置生成项目时生成的,其中存放了发布版本的EOS二进制文件(不包含调试信息)。分别打开这两个文件夹查看其中包含的文件。

5. 打开SDK文件夹中的inc文件夹,可以看到此文件夹中存放了EOS用于导出API函数和重要数据类型定义的头文件,在编写EOS应用程序时必须包含这些头文件。

每次在开发EOS应用程序之前都应该使用EOS Kernel项目的debug配置和release配置来生成EOS Kernel项目,这样才能够得到完全版本的SDK文件夹供EOS应用程序使用。

3.4 EOS应用程序项目的生成和调试

3.4.1 新建EOS应用程序项目

新建一个EOS应用程序项目的步骤如下:

1. 在“文件”菜单中选择“新建”,然后单击“项目”。

2. 在“新建项目”对话框中,选择项目模板“EOS 应用程序”。

3. 在“名称”中输入新项目使用的文件夹名称“eosapp”。

4. 在“位置”中输入新项目保存在磁盘上的位置“C:\”。

5. 点击“确定”按钮。

此项目就是一个EOS应用程序项目。

使用Windows资源管理器将之前生成的C:\eos\sdk文件夹拷贝覆盖到C:\eosapp\sdk位置。这样EOS应用程序就可以使用最新版本的EOS SDK文件夹了。

3.4.2 生成项目

1. 按F7生成项目,同时查看“输出”窗口中的内容,确认生成成功。

2. 打开C:\eosapp\debug文件夹,查看生成的对象文件和目标文件。其中的EOSApp.exe就是EOS应用程序的可执行文件。OS Lab每次启动执行EOS应用程序时,都会将EOS应用程序的可执行文件写入软盘镜像,并且会将SDK文件夹中对应配置(Debug或Release)的二进制文件写入软盘镜像,然后让虚拟机运行软盘镜像中的EOS,待EOS启动后再自动执行EOS应用程序。

3.4.3 调试项目

调试EOS应用程序项目与之前的两个项目有较大的不同,之前的两个项目在调试时都是先添加断点再启动调试,而EOS应用程序项目必须先启动调试再添加断点,步骤如下:

1. 按F5启动调试。OS Lab会弹出一个调试异常对话框,选择“是”调试异常,EOS应用程序会中断执行,黄色箭头指向下一个要执行的代码行。

2. 在eosapp.c的 printf("Hello world!\n"); 代码行添加一个断点,然后按F5继续调试,在此断点处中断。

3. 按F10单步调试,查看虚拟机窗口,打印输出了“Hello world!”。

4. 按F5继续调试,查看虚拟机窗口,EOS应用程序执行完毕。

5. 在“调试”菜单中选择“停止调试”,调试被终止。

6. 选择“调试”菜单中的“删除所有断点”。只有删除所有断点后才能按F5再次启动调试,否则启动调试会失败。

3.4.4查看软盘镜像文件中的内容

使用FloppyImageEditor工具打开该项目中的Floppy.img文件,查看软盘镜像中的文件。loader.bin和kernel.dll是从C:\eosapp\sdk\bin\debug文件夹写入的,C:\eosapp\sdk\bin\debug\boot.bin被写入了软盘镜像文件的引导扇区中。eosapp.exe就是本项目生成的EOS应用程序。EOS操作系统启动后会根据autorun.txt 文本文件中的内容启动执行eosapp.exe程序,双击autorun.txt文件查看其内容。

3.4.5修改EOS应用程序项目名称

EOS应用程序项目所生成的可执行文件的名称默认是由项目名称决定的。由于当前EOS应用程序项目的名称是EOSApp,所以该项目所生成的可执行文件的名称默认为EOSApp.exe。按照下面的步骤修改EOS应用程序项目的名称,进而修改可执行文件的名称:

1. 在“项目管理器”窗口中,右键点击项目节点(根节点)。

2. 在弹出的快捷菜单中选择“重命名”,然后可以输入一个新的项目名称,例如“MyApp”,然后按回车键使修改生效。

3. 按F7生成项目。

4. 选择“调试”菜单中的“删除所有断点”。

5. 按F5启动调试。OS Lab会弹出一个调试异常对话框,选择“否”忽略异常,EOS应用程序会自动执行。

6. 激活虚拟机窗口,可以看到自动执行的可执行文件的名称为MyApp.exe,如图9-9所示。也可以打开

C:\eosapp\debug文件夹,确认生成了可执行文件MyApp.exe。

实验1 实验环境的使用

图9-9:EOS应用程序项目的名称修改后的执行结果

3.5 退出OS Lab

1. 在“文件”菜单中选择“退出”。

2. 在OS Lab关闭前会弹出一个保存数据对话框(可以选择对话框标题栏上的“帮助”按钮获得帮助信息),核对学号和姓名无误后点击“保存”按钮,OS Lab关闭。

3. 在OS Lab关闭后默认会自动使用Windows资源管理器打开数据文件所在的文件夹,并且选中刚刚保存的数据文件(OUD文件)。将数据文件备份(例如拷贝到自己的U盘中或者发送到服务器上),可以做为本次实验

的考评依据。

四、实验小结

写出总结,对实验中存在的问题、进一步的想法

五、思考与练习

1. 练习使用单步调试功能(逐过程、逐语句),体会在哪些情况下应该使用“逐过程”调试,在哪些情况下应该使用“逐语句”调试。练习使用各种调试工具(包括“监视”窗口、“调用堆栈”窗口等)。

沁园春·雪

北国风光,千里冰封,万里雪飘。

望长城内外,惟余莽莽;大河上下,顿失滔滔。

山舞银蛇,原驰蜡象,欲与天公试比高。须晴日,看红装素裹,分外妖娆。

江山如此多娇,引无数英雄竞折腰。

惜秦皇汉武,略输文采;唐宗宋祖,稍逊风骚。

一代天骄,成吉思汗,只识弯弓射大雕。俱往矣,数风流人物,还看今朝。

出师表

两汉:诸葛亮

先帝创业未半而中道崩殂,今天下三分,益州疲弊,此诚危急存亡之秋也。然侍卫之臣不懈于内,忠志之士忘身于外者,盖追先帝之殊遇,欲报之于陛下也。诚宜开张圣听,以光先帝遗德,恢弘志士之气,不宜妄自菲薄,引喻失义,以塞忠谏之路也。

宫中府中,俱为一体;陟罚臧否,不宜异同。若有作奸犯科及为忠善者,宜付有司论其刑赏,以昭陛下平明之理;不宜偏私,使内外异法也。

侍中、侍郎郭攸之、费祎、董允等,此皆良实,志虑忠纯,是以先帝简拔以遗陛下:愚以为宫中之事,事无大小,悉以咨之,然后施行,必能裨补阙漏,有所广益。

将军向宠,性行淑均,晓畅军事,试用于昔日,先帝称之曰“能”,是以众议举宠为督:愚以为营中之事,悉以咨之,必能使行阵和睦,优劣得所。

亲贤臣,远小人,此先汉所以兴隆也;亲小人,远贤臣,此后汉所以倾颓也。先帝在时,每与臣论此事,未尝不叹息痛恨于桓、灵也。侍中、尚书、长史、参军,此悉贞良死节之臣,愿陛下亲之、信之,则汉室之隆,可计日而待也。

臣本布衣,躬耕于南阳,苟全性命于乱世,不求闻达于诸侯。先帝不以臣卑鄙,猥自枉屈,三顾臣于草庐之中,咨臣以当世之事,由是感激,遂许先帝以驱驰。后值倾覆,受任于败军之际,奉命于危难之间,尔来二十有一年矣。

先帝知臣谨慎,故临崩寄臣以大事也。受命以来,夙夜忧叹,恐托付不效,以伤先帝之明;故五月渡泸,深入不毛。今南方已定,兵甲已足,当奖率三军,北定中原,庶竭驽钝,攘除奸凶,兴复汉室,还于旧都。此臣所以报先帝而忠陛下之职分也。至于斟酌损益,进尽忠言,则攸之、祎、允之任也。

愿陛下托臣以讨贼兴复之效,不效,则治臣之罪,以告先帝之灵。若无兴德之言,则责攸之、祎、允等之慢,以彰其咎;陛下亦宜自谋,以咨诹善道,察纳雅言,深追先帝遗诏。臣不胜受恩感激。

今当远离,临表涕零,不知所言。