操作系统实验三 - 图文

更新时间:2023-11-15 12:08:02 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

操作系统 实 验 报 告

课程名称 实验项目名称 学号 姓名 学生所在学院 实验室名称地点

操作系统实验 课程编号 0906553 进程的创建 年级 专业 指导教师 哈尔滨工程大学 计算机科学与技术学院

第三讲 进程的创建

一、实验概述

1. 实验名称 进程的创建 2. 实验目的

??练习使用EOS API函数CreateProcess创建一个进程,掌握创建进程的方法,理解进程和程序的区别。

??调试跟踪CreateProcess函数的执行过程,了解进程的创建过程,理解进程是资源分配的单位。

3. 实验类型 设计 4. 实验内容

4.1 准备实验

按照下面的步骤准备本次实验: 1. 启动OS Lab。

2. 新建一个EOS Kernel项目。

3. 分别使用Debug配置和Release配置生成此项目,从而在该项目文件夹中生成完全版本的EOS SDK文件夹。

4. 新建一个EOS应用程序项目。

5. 使用在第3步生成的SDK文件夹覆盖EOS应用程序项目文件夹中的SDK文件夹。

4.2 练习使用控制台命令创建EOS应用程序的进程

练习使用控制台命令创建EOS应用程序进程的具体步骤如下:

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

2. 将本实验文件夹中的Hello.exe文件拖动到FloppyImageEditor工具窗口的文件列表中释放,Hello.exe文件即被添加到软盘镜像文件中。Hello.exe一个EOS应用程序,其源代码可以参见本实验文件夹中的Hello.c源文件。

3. 在FloppyImageEditor中选择“文件”菜单中的“保存”后关闭FloppyImageEditor。 4. 按F7生成EOS应用项目。

5. 按F5启动调试。OS Lab会弹出一个调试异常对话框,并中断应用程序的执行。 6. 在调试异常对话框中选择“否”,忽略异常继续执行应用程序。

7. 激活虚拟机窗口,待该应用程序执行完毕后,在EOS的控制台中输入命令“A:\\Hello.exe”后回车。

1

8. Hello.exe应用程序开始执行,观察其输出。

9. 待Hello.exe执行完毕后可以重复第7步,或者结束此次调试。 4.3 练习通过编程的方式让应用程序创建另一个应用程序的进程 使用OS Lab打开本实验文件夹中的NewProc.c文件(将此文件拖动到OS Lab窗口中释放即可),仔细阅读此文件中的源代码和注释。

按照下面的步骤查看应用程序创建另一个应用程序的进程的执行结果:

1. 使用NewProc.c文件中的源代码替换之前创建的EOS应用程序项目中的EOSApp.c文件内的源代码。

2. 按F7生成修改后的EOS应用程序项目。

3. 按F5启动调试。OS Lab会首先弹出一个调试异常对话框。 4. 在调试异常对话框中选择“否”,继续执行。

5. 激活虚拟机窗口查看应用程序输出的内容。可以看到父进程(EOSApp.exe)首先开始执行并输出内容,父进程创建了子进程(Hello.exe)后,子进程开始执行并输出内容,待子进程结束后父进程再继续执行。

6. 结束此次调试。

4.4 调试CreateProcess函数

按照下面的步骤调试CreateProcess函数创建进程的过程:

1. 按F5启动调试EOS应用程序,OS Lab会首先弹出一个调试异常对话框。 2. 选择“是”调试异常,调试会中断。

3. 在main函数中调用CreateProcess函数的代码行(第57行)添加一个断点。 4. 按F5继续调试,在断点处中断。

5. 按F11调试进入CreateProcess函数。此时已经开始进入EOS内核进行调试。

当EOS应用程序eosapp.exe存储在软盘上的时候,它是静态的,只包含应用程序的指令和数据。而创建进程后,进程不但包含应用程序的指令和数据,也会包含操作系统内核

(kernel.dll)的指令和数据(参见图5-1)。同时,图11-4也说明了一个进程可以包含多个程序,该进程包含了eosapp.exe和kernel.dll两个程序。

可以按照下面的步骤来分别验证应用程序和操作系统内核在进程的4G虚拟地址空间中所处的位置:

1. 由于此时在内核的CreateProcess函数内中断执行,所以在“调试”菜单的“窗口”中选择“反汇编”,会在“反汇编”窗口中显示CreateProcess函数的指令对应的反汇编代码。“反汇编”窗口的左侧显示的是指令所在的虚拟地址。可以看到所有指令的虚拟地址都大于0x80000000,说明内核(kernel.dll)处于高2G的虚拟地址空间中。

2. 在“调用堆栈”窗口中双击main函数项,设置main函数的调用堆栈帧为活动的。在“反汇编”窗口中查看main函数的指令所在的虚拟地址都是小于0x80000000,说明应用程序(eosapp.exe)处于低2G的虚拟地址空间中。

3. 在“调用堆栈”窗口中双击CreateProcess函数项,重新设置CreateProcess函数的调用堆栈帧为活动的。关闭“反汇编”窗口。

2

接下来观察eosapi.c文件中CreateProcess函数的源代码,可以看到此函数只是调用了EOS内核函数PsCreateProcess并将创建进程所用到的参数传递给了此函数。所以,按F11可以调试进入create.c文件中的PsCreateProcess函数,在此函数中才开始执行创建进程的各项操作。

4.5 调试PsCreateProcess函数

创建进程最主要的操作就是创建进程控制块(PCB),并初始化其中的各种信息(也就是为进程分配各种资源)。所以在PsCreateProcess函数中首先调用了PspCreateProcessEnvironment函数来创建进程控制块。

调试PspCreateProcessEnvironment函数的步骤如下:

1. 在PsCreateProcess函数中找到调用PspCreateProcessEnvironment函数的代码行(create.c文件的第163行),并在此行添加一个断点。 2. 按F5继续调试,到此断点处中断。

3. 按F11调试进入PspCreateProcessEnvironment函数。

由于PspCreateProcessEnvironment函数的主要功能是创建进程控制块并初始化其中的部分信息,所以在此函数的开始,定义了一个进程控制块的指针变量NewProcess。在此函数中查找到创建进程控制块的代码行(create.c文件的第418行) Status = ObCreateObject( PspProcessType, NULL,

sizeof(PROCESS) + ImageNameSize + CmdLineSize, 0,

(PVOID*)&NewProcess ); 这里的ObCreateObject函数会在由EOS内核管理的内存中创建了一个新的进程控制块(也就是分配了一块内存),并由NewProcess返回进程控制块的指针(也就是所分配内存的起始地址)。

按照下面的步骤调试进程控制块的创建过程:

1. 在调用ObCreateObject函数的代码行(create.c文件的第418行)添加一个断点。 2. 按F5继续调试,到此断点处中断。 3. 按F10执行此函数后中断。

4. 此时为了查看进程控制块中的信息,将表达式*NewProcess添加到“监视”窗口中。 5. 将鼠标移动到“监视”窗口中此表达式的“值”属性上,会弹出一个临时窗口,在临时窗口中会按照进程控制块的结构显示各个成员变量的值(可以参考PROCESS结构体的定义)。由于只是新建了进程控制块,还没有初始化其中成员变量,所以值都为0。 接下来调试初始化进程控制块中各个成员变量的过程:

1. 首先创建进程的地址空间,即4G虚拟地址空间。在代码行(create.c文件的第437行) NewProcess->Pas = MmCreateProcessAddressSpace(); 添加一个断点。 2. 按F5继续调试,到此断点处中断。 3. 按F10执行此行代码后中断。

4. 在“监视”窗口中查看进程控制块的成员变量Pas的值已经不再是0。说明已经初始化了进程的4G虚拟地址空间。

5. 使用F10一步步调试PspCreateProcessEnvironment函数中后面的代码,在调试的过程中

3

根据执行的源代码,查看“监视”窗口中*NewProcess表达式的值,观察进程控制块中哪些成员变量是被哪些代码初始化的,哪些成员变量还没有被初始化。

6. 当从PspCreateProcessEnvironment函数返回到PsCreateProcess函数后,停止按F10。此时“监视”窗口中已经不能再显示表达式*NewProcess的值了,在PsCreateProcess函数中是使用ProcessObject指针指向进程控制块的,所以将表达式*ProcessObject添加到“监视”窗口中就可以继续观察新建进程控制块中的信息。

7. 接下来继续使用F10一步步调试PsCreateProcess函数中的代码,同样要注意观察执行后的代码修改了进程控制块中的哪些成员变量。当调试到PsCreateProcess函数的最后一行代码时,查看进程控制块中的信息,此时所有的成员变量都已经被初始化了(注意观察成员ImageName的值)。

8. 按F5继续执行,EOS内核会为刚刚初始化完毕的进程控制块新建一个进程。激活虚拟机窗口查看新建进程执行的结果。

9. 在OS Lab中选择“调试”菜单中的“停止调试”结束此次调试。

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

4.6 练习通过编程的方式创建应用程序的多个进程 使用OS Lab打开本实验文件夹中的参考源代码文件NewTwoProc.c,仔细阅读此文件中的源代码。使用NewTwoProc.c文件中的源代码替换EOS应用程序项目中EOSApp.c文件内的源代码,生成后启动调试,查看多个进程并发执行的结果。

多个进程并发时,EOS操作系统中运行的用户进程可以参见图11-5。验证一个程序(hello.exe)可以同时创建多个进程。

二、实验环境

操作系统集成实验环境 OS Lab

? EOS 操作系统

三、实验过程

1. 设计思路和流程图

4

本文来源:https://www.bwwdw.com/article/2rjv.html

Top