操作系统实验第三讲进程的创建0814000244.docx
《操作系统实验第三讲进程的创建0814000244.docx》由会员分享,可在线阅读,更多相关《操作系统实验第三讲进程的创建0814000244.docx(19页珍藏版)》请在冰豆网上搜索。
操作系统实验第三讲进程的创建0814000244
操作系统
实验报告
课程名称
操作系统实验
实验项目名称
进程的创建
学号
班级
姓名
专业
计算机科学
与技术
学生所在学院
计算机科学
与技术学院
指导教师
初妍
实验室名称地点
21#428
哈尔滨工程大学
计算机科学与技术学院
、实验概述
1.实验名称进程的创建
2.实验目的
(1)练习使用EOSAPI函数CreateProcess创建一个进程,掌握创建进程的方法,理解进程和程序的区别。
(2)调试跟踪CreateProcess函数的执行过程,了解进程的创建过程,理解进程是资源分配的单位。
3.实验类型验证型实验
4.实验内容准备实验
练习使用控制台命令创建EOS应用程序的进程练习通过编程的方式让应用程序创建另一个应用
程序的进程
调试CreateProcess函数调试PsCreateProcess函数
练习通过编程的方式创建应用程序的多个进程
二、实验环境
操作系统windosxp
编译器OSLab
语言c语言
语言c语言
三、实验过程
1.设计思路
创建10个进程时,可以使用PROCESS_INFORMATI类型定义一
个有10个元素的数组,每一个元素对应一个进程。
使用一个循环创建10个子进程,然后再使用一个循环等待10个子进程结束,得到退出码后关闭句柄。
2.算法实现
在创建10个进程的程序中,为了保证只有在10个进程都创建成
功的情况下才执行后续操作,引入一个变量locked,只有10个程序
都创建成功时locked=1,出现创建失败的情况时locked=0,当
locked=1时再执行后续操作
3.需要解决的问题及解答
问题1:
程序创建2个进程创建的情况下,实验指导P133-4的
*NewProcess和6的*ProcessObject变化情况,监控变量界面截图。
(答案见)
问题2:
尝试根据之前对PsCreateProcess函数和
PspCreateProcessEnvironment函数执行过程的跟踪调试,绘制一幅进程创建过程的流程图。
问题3:
思考与练习,在源代码文件提供的源代码基础上进行修
改,要求使用同时创建10个进程。
要给出源代码及解释和运行界面
截图。
(代码见“源程序并附上注释”部分)
OTISOLE-I(PressCtrl*Fl^FBtosultch(yebycf
AAEOfinpi>.cxt:
exituithOxGOO&OOOO
Theprocess1
TheprocessZ
Theprocess3
Theprocess4
Theprocess5
TheprocessB
Theprocess7
TJ)eprocessH
Theprocess9
Theprocess1'exitwith0.ekitulth0.exituith0rexituithD.exituith6.exitwith0,exituithD”exituithe.exituith0.
*exitwith0■
4.源程序并附上注释
使用同时创建10个进程,代码如下:
#include""
intmain(intargc,char*argv[])
{
STARTUPINFOStartupInfo;
PROCESS_INFORMATIONjincheng[10];
ULONGulExitCode;.\n\n");
n",GetLastError());
nResult=1;
locked=0;
rocessHandle,INFINITE);
}
rocessHandle,&ulExitCode);
exit
printf("\nTheprocess%dwith%d.\n",l+1,ulExitCode);
}
rocessHandle);
CloseHandle(jincheng[m].ThreadHandle);
}
}程序运行时的初值和运行结果
准备实验
建立一个EOSKernel项目和EOS应用程序项目
练习使用控制台命令创建EOS应用程序的进程
将本实验文件夹中的文件拖动到FloppylmageEditor工具窗口的
文件列表中释放,文件即被添加到软盘镜像文件中,按F5启动调试,在EOS的控制台中输入命令“A:
”后回车,结果如下图:
OMSOLE-1(PressCtrl+Fl^Ffitosuitchccnsoleuindou...)elcomEtoEOSshell
>AuftoruinA:
\EOSApp.cxc
He1lcworld!
A:
\EOSApp.exeexituithex©00G0OOO.
>A;\He11oexe
Error:
CreateprocessfailedwithstatuscodeOxcOQGOOla>A:
She11o»exe
Hello.world!
1
Hella^ijorld!
Z
Hcllo^utirld!
3
lie1lojworId*4
Hello,world*5
Bye-bije?
A:
\HEila.exeexitwith0x00000600.
练习通过编程的方式让应用程序创建另一个应用程序的进程
使用文件中的源代码替换之前创建的EOS应用程序项目中的
文件内的源代码,F5启动调试,激活虚拟机窗口查看应用程序输出
的内容:
rflNSOLE-l(PressCtrl+n~r0toswitchronsoleuindou,.,)UelecnetoEOSshell
>AuLtii'unA:
\E03App.exe
CreateaprocessanduaitfortJieprocessexit,..
Hello,uopMt1lellc^uorM*2
Hello,worMr3
HellcruorM!
4
Hello,uorMt5
Dyebye*
Theprocessexituitli0.
n:
\E0SnppckcexitwithOxOOGOOOOO»
调试CreateProcess函数
F5启动调试EOS应用程序,在main函数中调用
CreateProcess函数的代码行(第57行)添加一个断点。
按F5继续调试,在断点处中断。
按F11调试进入CreateProcess函数。
在“调试”菜单的“窗口”中选择“反汇编”,会在“反汇编”窗口
中显示CreateProcess函数的指令对应的反汇编代码。
“反汇编”窗口的左侧显示的是指令所在的虚拟地址。
可以看到所有指令的虚拟
地址都大于Ox,说明内核()处于高2G的虚拟地址空间中,如图:
OiSDI.lldSC
C.CreaLeFruce*寸Cl):
futih
ebp
A
OxSOClldST
(CrciiTriFrroce曽弓卜1》:
nrav
eb]>*c*r
gQClld&g
cub
5*QkL8
.OaSOOll^c
JLOV
D^OFI1PTRLet+0k13]
OaSOOlldSf
eFrxe$:
JEOV
DWORDFIB[e=1^+0110]
(ht80DLld63
:
nzciw
Efli,DWDEID?
TKtbp+DiL4]
0x30011d66
:
KOV
LWO?
nPTE[二wp+Uxg]」u”
OaSOClldSa
xCreat已珀处此甘那》:
KCV
eaE.DWFDPTE[eU+OjtlO]
¥
>
设置main函数的调用堆栈帧为活动的。
在“反汇编”窗口中查
Dx00401cfB0x00401
0x00431IOCJU口誓njovJDDV
cbIL
EWJRDPTR[Ctfp<-0x4LQtu[W:
(RDPTR[esp],0140201,Cea^ds:
Old04060
cu
'+0x000dflE
test
eai,eax
0x00401
je
0i401d&2
LWJKL'PTR[eep+Qx^.OaffffffEf
0x00401dl2
JDDV
七肚』柚细:
ebpThJ訂
V
看main函数的指令所在的虚拟地址都是小于Ox,说明应用程序()
处于低2G的虚拟地址空间中,如图:
调试PsCreateProcess函数
在PsCreateProcess函数中找到调用
PspCreateProcessEnvironment函数的代码行(文件的第163行),并在此行添加一个断点。
按F5继续调试,到此断点处中断。
按F11调试进入PspCreateProcessEnvironment函数。
在调用ObCreateObject函数的代码行(文件的第418行)添加一个断点。
按F5继续调试,到此断点处中断。
按F10执行此函数后中断。
将表达式*NewProcess添加到“监视”窗口中,继续一步步调试可以观察到进程控制块的成员变量的值的变化,如下图:
Priority-0x0,Fu=OUDj.01bji«etT«Ble-血0』TkrttdLtstH«*4=1
Ift¥tsOmD,
Prt*=ObdO
£W*SAPriwHy=QkO$Pu二OxSCDfMie^01hj«clTtbl«=OxO^ThrttCistKttd={
H«%1=0x0,
FrwrsOkO
Prinj-yllurtad=QxQl41lL4^Uf.t4d={lext三OmO,Fr*v=ChfO
FriBaryThr**4=ObrfXfuiListMvkd={
■tjtl=OsQL
ftw=0x0
!
»*£•¥«!
■二Ox①CvdLirw=OtrO,
Li«4*3ei4=0x0^
Xaa^Zntry=0』
StdUnput*0M,
-0x0^StiErr-sr-(hQExitC?
d«二0x0
j*
we二OxOj,
CndLint=0x0.
=0x0,
Ini^LgftZntry=0,
Stdlnput-0曲#
StOulput=0x0^
StdError=0x0,
IxitCtAa=0x0
Syitifli■CUQ
Friojity=枫
Fas-0x803fb966,□t>ject7able=0®S03£bdC6,
ThretdListHf-ad=t
Next=QieO,
Fr*v-OtO
L_
FrimoryThraed.-OiOjWadtListMe^d-|[
■Htjji电*CkOj,Trtv二OWJ
h
IrnegeH^re-0^0,
OndLint=0x0^
1^£:
诃如e二(MX
Im-ags-En'try—0』
St^Lt-pnl-Qttflj
StdOictjut■OnOj
Std£xF9T=QkQp
ExitCWii—Cixtl
Trioi'ity=血①
Fas-0x803
'Ubject'Iible=UiBOJtbdtG,
ThraidListdtad=f
Hext=CteSOSfkaEc.
Fr=CHffKfliafc
Firimtry-TJuraed-OsO,WutListll^d-[
Fexl-OaO,.
Trtv二0x0
lmEgeHajiE-UkO^Qnd^ine=JxO.口>有百*Ba耳e二0x0.Im-agsEntry=0』StdlEpUt-QkOj
■ChiQi*St^£rrgr=Qk-0,)EKitCode=CbcO
Sy>Friwity=XS*r&s-Ox前mftaeE
OMscliable=listUd上b弓
Tkrwd£i毎tlie显-(
Nsxt=Dx303£b«.fcB
F”廿-DseSCGfb^fe
Syctan--OaiC;
Friority二Os:
孔
Pn=t缺3ffe9施
□tjwtTable=0x813fb9SPH
TJueadLiait-He^d=[K®ct二Ih已昭fb就匚=OjiCODfLiaXt
£y^m■0x0,
Frion冷二0-nSa
Fh=0龙CDftS附
ObjietTtbU=0边岀的伯&
Thre*dLi5tSe=&d-{
lasrt二口丸02应厘
frev-OaEOOSftitfc
SyEt^Fi=QmO,friarLty二DxB.
Pis=(1油03锂能密
O'hjectlftbL*=叶BMfbH冃$
Jhxe-a.dI4-SiJle-ad={
lf«t=lha)3fbaf^
Ti«¥-(hCOJfLudk
Prin^ryThflrwd~QxQ#InitListHead-{
N^l且OxJCOfblOQ,Fray二0x5C3fbl0a
PrirfcarjTteeid二0前』
WdiLictHtad={
=OKeoa^we.
Pi-ex=0Ke03±l:
.bJ8
Frin:
iryltiraad-CxO=[彷吋二nTfir^fbhrR.Pr«r=Oiec3£Kiioa
Prim^rvThfead=0盂心
Wd.tLLStKftad=j
Esst=OxEOaftfeW.
Prev=fe8O3£LBBe
Ina^eM^me-LbcLl』Cndliw=OteO,.IneBase-ftcC1.Ina^oEritry二0^
-丁wO#S^dJu^put・0x0,St(Error=0310#Exi.tCode=(9曲
Irx^sKtrnw=OxOCOOlOD"AIVHelJo.欄
■ZudLine—OjdO,TrmgaBt<*=OmO^ImageEjitry斗Q,
StdinpTit-CicD,
StdJOitfUft.=0»0.
Stdlrror-GmD;EjitCute二OdJi
InttitNuit-QxDO3fblj3C>
CniLine-lJiCp
=GmDa
IhUKefiJitry-0,Stdinput-OhI,StJDiarlgt=OxD.StJIrr^r_OnO,EwritCode-UsO
]
Iik^tK^hiq-gBCOElbSD
CnrlTiTLE-0討0[
Tim刖=OkD,
InageEaU"^占口丿
51dlEip-u-t-Gxlfl
ScdDu^ut=W
StdErrer-QkD3
EiitCDie二DxD
接下来调试初始化进程控制块中各个成员变量的过程:
当从PspCreateProcessEnvironment函数返回至U
PsCreateProcess函数后,停止按F10。
此时“监视”窗口中已经不能再显示表达式*NewProcess的值了,在PsCreateProcess函数中是使用ProcessObject指针指向进程控制块的,所以将表达式*ProcessObject添加到“监视”窗口中就可以继续观察新建进程控制块中的信息。
接下来继续使用F10一步步调试PsCreateProcess函数中的代码,同样要注意进程控制块中的成员变量的变化:
Syxt&n>=QkD^
Triori"二OrEI*fas=心血俎9迫
CbjsetT^l-奮Cw833fl0e3,ThraaJLirtH^d-{=口曲OJfb址匚r;M-3?
t&OOaa£E
I
Ernaz-ylliraid=OzO,ftaHL]?
tX*a4=t
Hwx=3«M3rbbJ0.P“r=0^303fbLle
L
Ima^tWwn^-OMfriirhb^ri"A/\\He11o.翱e<
GmdLiLHe-D=Qj
Im归時电匚0=0»C^
JmA^aE-ctry二fl.
StdLilptt-010,StJJulpul=0码
EtdZrrcr=GzQ#feeitfUa=QxO
g严电飾■OwO,
Priority二Q^Sf
Fz二o^aosfbses,OKjtetTshil#=DwBO3ft4r08jT丘備讥Ml加:
詞=iFfiMrt二OiBOrSfbafc,
Ire*-0x803fbifc
FrimaryThrtail二DuO.
WaitLiStHecd-{
Fax*=n-ifinjfbhriB.Irev=OxBDSfbbQSh
I"述-DxGODnrLOO
'ii-LVHsllo池a"”
CndLijtemChD.
Ia«*aJ««-IhQ
Intpe-Zatry=Q,
ifJ*Trtpii<=Os.1jStdun:
jut=DlDdSlcErrflr-OttO,EriiCDtle-Dwil
Sfitw-(hq
frioTLly=OxB.
F沙十
□hjKtTabla=QriBUJfM舐
T*E4,dLi=\He4d—[Eatl=(h<8O3fbafe,
-0就OJflvIk
}
PrimsuvThresd二0^0,
W・itL起IK心胡s(
Me联二OK6O3ft-tre.Prev=0KEO3n:
.BBe
L
工叶“IT«陌=0N.6CSfbb3D
A:
VSHeLR.exe*
CndLijlc—0x0,
-OkO^In^geELU"^=片
S^dinpiLt-OarljStdCM^ut-OjcO.,
SitdErrer-0x0^
EnttDde=DxD
Syittn-OvQ,
Fricrtty-GcEL
P辽三缶铀3ft站缶01jj*crT*hL*=(liriBOJfhAtfSB,T}itca.ILis-{
fext=0s603fb*fe,
=O^COSfbttfQ
FrimaryTtuesd二0x0,和itL注IH自扁-{
IF*=OM603fbbD&Pfareir=血SO言fU>DE
L
IvKigsMunv-Qk9QO£IL3D
nA'^Hello詡k
Zn>iLiAc—Oj?
On
Tm电■触"=Osrf),
In^feZiLtry二耳
St-GkJL“
StiOii^jut-0x2』St^rrflr-OhDp
EzitCodie-QcD
}
Syetan=OmC^friorLty二CkB.
=t闊ObjectTabL*=OxB03fb9KL
TJixeadListH零皿=[U&El-(h803ifbaf—Tier=OjtC03att£t
}.
Friifcar^ThTeid-OixO?
WdiLLcMtad={
UCKL=CKeO5fW>30.Pirsir=0Ke03£BbJ8
L
T
A:
l\:
HeLlo.鶴君二
■Jmdl_iA.*e■=■OjdO,Tfl«£AKt^4=HkO,IfiageEiLtry-D,Stdlrtput-Hl,SldOtiipul=OkZ^StiErrflr-CwO,JIiitCn.de二CkDi
Systsn-QkO』
Friority二Cbc34
Pw=OiiBOaAM^
O^jeetT*hl*=n«R03fb^^
ThrueiliintHud~{Hest=方fb吐巳
Ii«v-OjhCOSflyXc
L
FrimaryThresd-0^0,
¥exx=OszEOSftbQ®.Trev=0xEO3£tbD8hIn5Da6C3E¥IO3
卞MMfeLlante".
ChviLijiE-0jiD[
Tn.此応.=dvO,
IniseliLijry-比
SLunput.-QkIj5^40u:
put二gj
St^dErrar-QkJ^
EiitCiide-DkJ
Syetan-伽心
Frionty二CxB.
F«l==t缺倔9皑□kjwnabU=nxW3fb9^
TJu={
lf®ct=0ji8O3fbafc.Ii*r=OzC03£L
}.
PriifcarjTteeid二OxO?
V&ilLLttHiads{
UexL=0k6O3^W6.Fkf=0K803±bb!
JS
L
ImtgQKim*=OxBCOrblSD
A:
lYHelJo.欄
■ZridU.ne―OjdO,
Tn昭=OmO^
ImageEntry壬Qz
Stjinput-
StdOunut=0«Z,
StdSrrxir-Gk3z
J■■-•ri_二H
瓦y電5DrfD^
Ftt>ai-1tjr—DmS#
l-it"Ci昶iDlft泌3,伽』/竹“”二rh^Mfih丽民
TkreafiListreadl-{
lest=■6<0?
fb卷itrFrsv二rWTPfhsi斤
〕.
rrsHyTLi电制-go.
¥mLk5tKtfrd={
lexl=■CM6Cefbtgfitv■CMOC'fbbDO
L.—*