查看 EOS 启动后的进程和线程的信息: 1. 在控制台中输入命令“pt”后按回车。 2. 输出的进程和线程
信息如图 10-5 所示。
3.2.6 EOS 启动后的状态和行为 三. 实验总结
通过本实验了解操作系统的启动过程,理解操作系统启动后的工作方式。
实验三:进程的创建:
一、实验目的:
1、练习使用EOS API函数CreateProcess创建一个进程,掌握创建进程的方法,理解进程和程序的区别。
2、调试跟踪CreateProcess函数的执行过程,了解进程的创建过程,理解进程是资源分配的单位。 二、 实验内容:
1、准备实验:新建一个EOS Kernel项目,分别使用Debug配置和Release配置生成此项目。新建一个EOS应用程序项目,使用在第EOS Kernel生成的SDK文件夹覆盖EOS应用程序项目文件夹中的SDK文件夹。 2、练习使用控制台命令创建EOS应用程序的进程
3、练习通过编程的方式让应用程序创建另一个应用程序的进程 4、调试CreateProcess函数 5、调试PsCreateProcess函数
6、练习通过编程的方式创建应用程序的多个进程 三、实验过程: 1、准备实验:(无)
2、练习使用控制台命令创建EOS应用程序的进程:使用FloppyImageEditor工具将本实验文件夹内的Hello.exe文件添加到Floppy.img文件中。启动调试,在EOS的控制台中输入命令“A:\\Hello.exe”后回车。 得到结果:
3、练习通过编程的方式让应用程序创建另一个应用程序的进程 :使用NewProc.c文件中的源代码替换之前创建的EOS应用程序项目中的EOSApp.c文件内的源代码。 启动调试,得到如下结果:
可以看到父进程(EOSApp.exe)首先开始执行并输出内容,父进程创建了子进程(Hello.exe)后,子进程开始执行并输出内容,待子进程结束后父进程再继续执行。
4、调试CreateProcess函数:按F5启动调试EOS应用程序,在弹出异常对话框后点“是”,在main函数中调用CreateProcess函数的代码行添加一个断点。
5、调试PsCreateProcess函数:在PsCreateProcess函数中找到调用PspCreateProcessEnvironment函数的代码行添加一个断点。 进入此中断,按F11进入PspCreateProcessEnvironment函数。 在调用ObCreateObject函数的代码行添加一个断点,进入此中断,将表达式*NewProcess添加到“监视”窗口中,监视其值得变化。
接下来调试初始化进程控制块中各个成员变量的过程: 1) 首先创建进程的地址空间,即4G虚拟地址空间。 2)按F5继续调试,到此断点处中断。 3)按F10执行此行代码后中断。
4)在“监视”窗口中查看进程控制块的成员变量Pas的值已经不再是0。说明已经初始化了进程的4G虚拟地址空间。
5)使用F10一步步调试PspCreateProcessEnvironment函数中后面的代码,在调试的过程中根据执行的源代码,查看“监视”窗口中*NewProcess表达式的值,。 6)当从PspCreateProcessEnvironment函数返回到PsCreateProcess函数后,停止按F10。此时“监视”窗口中已经不能再显示表达式*NewProcess的值了,在PsCreateProcess函数中是使用ProcessObject指针指向进程控制块的,所以将表达式*ProcessObject添加到“监视”窗口中就可以继续观察新建进程控制块中的信息。
7)接下来继续使用F10一步步调试PsCreateProcess函数中的代码,同样要注意观察执行后的代码修改了进程控制块中的哪些成员变量。
8)按F5继续执行,EOS内核会为刚刚初始化完毕的进程控制块新建一个进程。激活虚拟机窗口查看新建进程执行的结果。
9)在OS Lab中选择“调试”菜单中的“停止调试”结束此次调试。 10)选择“调试”菜单中的“删除所有断点”。
结果:
代码: /*
提供该示例代码是为了阐释一个概念,或者进行一个测试,并不代表着 最安全的编码实践,因此不应在应用程序或网站中使用该示例代码。对 于超出本示例代码的预期用途以外的使用所造成的偶然或继发性损失, 北京海西慧学科技有限公司不承担任何责任。 */
#include \ //
// main 函数参数的意义:
// argc - argv 数组的长度,大小至少为 1,argc - 1 为命令行参数的数量。 // argv - 字符串指针数组,数组长度为命令行参数个数 + 1。其中 argv[0] 固定指向当前
// 进程所执行的可执行文件的路径字符串,argv[1] 及其后面的指针指向各个命令行
// 参数。
// 例如通过命令行内容 \-a -b\启动进程后,hello.exe 的 main 函
// 数的参数 argc 的值为 3,argv[0] 指向字符串 \,argv[1] 指向
// 参数字符串 \,argv[2] 指向参数字符串 \。 //
int main(int argc, char* argv[])
{
//
// 启动调试 EOS 应用程序前要特别注意下面的问题: //
// 1、如果要在调试应用程序时能够调试进入内核并显示对应的源码, // 必须使用 EOS 核心项目编译生成完全版本的 SDK 文件夹,然 // 后使用此文件夹覆盖应用程序项目中的 SDK 文件夹,并且 EOS // 核心项目在磁盘上的位置不能改变。 //
// 2、在启动调试应用程序之前必须首先删除/禁用所有的断点,在断 // 点中断 (int 3) 被命中后才能重新添加/启用断点,否则启动 // 调试会失败。 //
STARTUPINFO StartupInfo;
PROCESS_INFORMATION ProcInfoOne[5]; ULONG ulExitCode; // 子进程退出码
INT nResult = 0; // main 函数返回值。0 表示成功,非 0 表示失败。
#ifdef _DEBUG
__asm(\#endif
printf(\two processes and wait for the processes exit...\\n\\n\
//
// 使子进程和父进程使用相同的标准句柄。 //
StartupInfo.StdInput = GetStdHandle(STD_INPUT_HANDLE); StartupInfo.StdOutput = GetStdHandle(STD_OUTPUT_HANDLE); StartupInfo.StdError = GetStdHandle(STD_ERROR_HANDLE);
//
// 为一个应用程序同时创建两个子进程。 //
int i=0;
for(;i<5;i++) {
if (CreateProcess(\NULL, 0, &StartupInfo, &ProcInfoOne[i])) {
//
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库华北电力大学 操作系统实验报告(2)在线全文阅读。
相关推荐: