操作系统实验三 - 图文
更新时间: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
正在阅读:
操作系统实验三 - 图文11-15
扬州市建设工程定额站文件03-05
11财三优班申请书(1) - 图文10-01
我国垄断企业薪酬制度改革研究毕业论文07-03
一万吨散货船船体的焊接工艺分析 - 图文10-07
西安小吃的英文翻译08-20
城市道路节能技术的若干措施03-13
月度工作总结11月月度统计工作总结12-17
- exercise2
- 铅锌矿详查地质设计 - 图文
- 厨余垃圾、餐厨垃圾堆肥系统设计方案
- 陈明珠开题报告
- 化工原理精选例题
- 政府形象宣传册营销案例
- 小学一至三年级语文阅读专项练习题
- 2014.民诉 期末考试 复习题
- 巅峰智业 - 做好顶层设计对建设城市的重要意义
- (三起)冀教版三年级英语上册Unit4 Lesson24练习题及答案
- 2017年实心轮胎现状及发展趋势分析(目录)
- 基于GIS的农用地定级技术研究定稿
- 2017-2022年中国医疗保健市场调查与市场前景预测报告(目录) - 图文
- 作业
- OFDM技术仿真(MATLAB代码) - 图文
- Android工程师笔试题及答案
- 生命密码联合密码
- 空间地上权若干法律问题探究
- 江苏学业水平测试《机械基础》模拟试题
- 选课走班实施方案
- 操作系统
- 实验
- 图文
- 唐诗宋词人文解读(含题目选项)
- CAD使用技巧
- 人教版小学语文第三册教案
- 2012测量学计算题库及参考答案
- 兼职老师聘用合同
- 2015年4月公务员制度真题
- 2017-2018学年湖北省黄石市第三中学高一上学期期末考试生物试题
- 维稳信息收集研判工作机制研究
- 原子物理学考试 选择 计算 题目(参考答案)
- 《商业银行业务经营管理》练习题
- 供应商空白资料表
- 2018年10月自考《建筑法规》真题
- 2018-2024年中国便携式自动导航系统(PND)市场研究与投资战略咨询报告(目录)
- 印花知识 摘自服装工程网
- 2014兰大网院人力资源管理课程作业 - C
- 测验 6 Unit Six Going to School - 图文
- Kettle API- Java调用示例
- 大气科学概论加答案
- 小学班主任工作现状调查报告
- 微生物学习题