版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、华蛀#力*芳综合实验报告(2013 - 2014 年度第1学期)名 称:操作系统综合实验题 目基于OS Lab的操作系统综合实验 院 系:计算机系班 级:学 号:学生姓名:指导教师:王德文,王艳设计周数:1成 绩:日期:2013年 月 日一、课程设计 (综合实验 ) 的目的与要求1 正文为宋体,五号字 行间距为 2111 12 二、设计(实验)正文1 正文为宋体,五号字 行间距为 2111 12 三、课程设计(综合实验)总结或结论1 正文为宋体,五号字 行间距为 21 11 12 四、参考文献1 作者 1, 作者 2 书名 . 出版单位 , 版本 . 出版日期附录(设计流程图、程序、表格、数据
2、等)实验环境的使用1. 实验目的熟悉操作系统集成实验环境OS Lab的基本使用方法。练习编译、调试EO操作系统内核以及EO应用程序。2. 实验内容:.学习OS Lab的基本使用方法a. 启动OSIabb. 新建windows控制台程序项目,eos内核项目,eos应用程序项目;c. 生成项目d. 执行项目e. 调试项目f. 项目名称的修改及项目的保存.实验中代码的修改:1) 在func.c 文件中添加函数:int Func (int n) n = n + 1; retur n n; 2) 点击源代码编辑器上方的 console.c标签,切换到console.c文件。将main函数修改为:int
3、main (int argc, char* argv)int Func (int n); /声明 Func函数int n = 0;n = Fu nc(10);printf ("Hello World!n");return 0;问题答案:EOS SDk文件夹的目的和作用:主要供EOS应用程序使用。EOS内核提供的API函数及重要的数据类型都是 通过将相关的头文件复制到SDK文件夹中,然后EOS应用程序再包含SDK文 件夹中的头文件,使EOS应用程序可以调用这些函数或使用数据类型来定义变 量。同时,SDK文件夹中还保存了 Debug和Release版本的二进制文件,分别为 两个
4、版本的应用程序使用。CONSOLE1 (Press Ctrl+F1FO to switch console windou.) Uelccme to EOS shellA:MyApp运行结果图示实验总结及体会:通过本次实验,对EOS操作系统和OS Lab集成实验环境有一个初步的了解, 学会了创建三种项目,项目的调试,执行及保存,还有一些文件的含义。实验三 .进程创建1. 实验目的:练习使用EOS AP函数CreateProcess创建一个进程,掌握创建进程的方法, 理解进程和程序的区别。试跟踪CreateProcess函数的执行过程,了解进程的创建过程,理解进程是 资源分配的单位。2. 实验内容
5、: 练习使用控制台命令创建 EOS 应用程序的进程; 练习通过编程的方式让应用程序创建另一个应用程序的进程; 调试 CreateProcess 函数;调试 PsCreateProcess函数; 练习通过编程的方式创建应用程序的多个进程。实验中修改的代码 :1. #include "EOSApp.h"int main(int argc, char* argv)int i; for (i = 1; i <= 5; i+) printf("Hello,world! %dn", i); Sleep(1000); printf("Bye-bye!n
6、"); return 0;2. /*#include "EOSApp.h"int main(int argc, char* argv) STARTUPINFO StartupInfo; PROCESS_INFORMA TION ProcInfo; ULONG ulExitCode; / 子进程退出码 INT nResult = 0; / main 函数返回值。 0 表示成功,非 0 表示失败。#ifdef _DEBUG_asm("int $3n nop");#endif printf("Create a process and wai
7、t for the process exit.nn"); StartupInfo.StdInput = GetStdHandle(STD_INPUT_HANDLE); StartupInfo.StdOutput = GetStdHandle(STD_OUTPUT_HANDLE); StartupInfo.StdError = GetStdHandle(STD_ERROR_HANDLE);if (CreateProcess("A:Hello.exe", NULL, 0, &StartupInfo, &ProcInfo) WaitForSingleOb
8、ject(ProcInfo.ProcessHandle, INFINITE);GetExitCodeProcess(ProcInfo.ProcessHandle, &ulExitCode); printf("nThe process exit with %d.n", ulExitCode); CloseHandle(ProcInfo.ProcessHandle); CloseHandle(ProcInfo.ThreadHandle); else printf("CreateProcess Failed, Error code: 0x%X.n",
9、GetLastError(); nResult = 1;return nResult;3/*#include "EOSApp.h"int main(int argc, char* argv)STARTUPINFO StartupInfo;PROCESS_INFORMA TION ProcInfoOne, ProcInfoTwo;ULONG ulExitCode; / 子进程退出码INT nResult = 0; / main 函数返回值。 0 表示成功,非 0 表示失败。 #ifdef _DEBUG_asm("int $3n nop");#endifpr
10、intf("Create two processes and wait for the processes exit.nn");StartupInfo.StdInput = GetStdHandle(STD_INPUT_HANDLE);StartupInfo.StdOutput = GetStdHandle(STD_OUTPUT_HANDLE);StartupInfo.StdError = GetStdHandle(STD_ERROR_HANDLE);if (CreateProcess("A:Hello.exe", NULL, 0, &Start
11、upInfo, &ProcInfoOne)&& CreateProcess("A:Hello.exe", NULL, 0, &StartupInfo, &ProcInfoTwo) WaitForSingleObject(ProcInfoOne.ProcessHandle, INFINITE);WaitForSingleObject(ProcInfoTwo.ProcessHandle, INFINITE);GetExitCodeProcess(ProcInfoOne.ProcessHandle, &ulExitCode); pr
12、intf("nThe process one exit with %d.n", ulExitCode); GetExitCodeProcess(ProcInfoTwo.ProcessHandle, &ulExitCode); printf("nThe process two exit with %d.n", ulExitCode); CloseHandle(ProcInfoOne.ProcessHandle); CloseHandle(ProcInfoOne.ThreadHandle); CloseHandle(ProcInfoTwo.Proce
13、ssHandle); CloseHandle(ProcInfoTwo.ThreadHandle); else printf("CreateProcess Failed, Error code: 0x%X.n", GetLastError(); nResult = 1;return nResult;问题解答:PspCreateProcessE nviro nmer函数的主要功能是创建进程控制块,并且为 进程创建了地址空间和分配了句柄表,PspLoadProcessImag是将进程的可执 行映像加载到了进程的地址空间中。PspCreateThreac创建了进程的主线程。这三个函
14、数的被调用顺序是不能改变的,就像上面所描述的,加载可执行文 件之前必须已经为进程创建地址空间,这样才能确定可执行映像可以被加载 到内存的什么位置,在创建主线程之前必须已经加载了可执行映像,这样主 线程才能够知道自己从哪里开始执行,执行那些命令。N 斗需賓跻滞:箱卷打:蠶竄诉综纺於為恣空?£;卷蠶嚣露热第也漫爭超緞鴻进V球踏时魏"槻寳號逐4.:暫袋據裂綾魏毬A : N-E OSApp exe ex i"t u i/th ©xOOOOOOOG , ;SHello exewoxld t1 d. t wo r' 1 dl f uo r' 1 d
15、t uo¥' 1 rt *EiellolellulelloHe 1 loHe 1 loBiye: *TliC pjroccsrs CM 1 t U 1 Xtl O1 亠A -oxWt miOx:OO0O0O0 .:e11o exe ex it with OxOOOOOOOO.实验中一些运行结果实验总结:通过本次实验了解到当EOS应用程序eosapp.exe存储在软盘上的时 候,它是静态的,只包含应用程序的指令和数据。而创建进程后,进程不但 包含应用程序的指令和数据,也会包含操作系统内核(kernel.dll )的指 令和数据,同时也了解到一个进程可以包含多个程序,就该实验而言
16、:该进 程包含了 eosa pp.exe和kernel.dll 两个程序。进程的创建过程:当 EOS 创建一个进程时,会首先创建一个进程对象,并且进程对象的对象体使用的 就是PCB结构体。接下来,操作系统会为进程分配一个进程地址空间和一 个句柄表。一般情况下,每个进程都是由一个可执行文件 (后缀名为EXE的 文件)来创建的,所以,操作系统会将可执行文件装入进程地址空间的用户 地址空间中,并和内核地址空间中的内核进行动态链接(Dy namic Link )。最后,操作系统会为进程创建一个主线程,并使主线程从进程可执行文件的 入口点开始执行。实验四 . 线程的状态和转换1. 实验及目的 调试线程在
17、各种状态间的转换过程,熟悉线程的状态和转换 通过为线程增加挂起状态,加深对线程状态的理解。2实验内容 准备实验 调试线程状态的转换过程 准备工作A、查看loop命令执行的效果B调试线程状态转换的过程:、C对断点进行一些调整:(三)、为线程增加挂起状态 加入的代码;STATUSPsResumThread(IN HANDLE hThread)STATUS Status;BOOL IntState;PTHREAD Thread;PspThreadType,Status = ObRefObjectByHandle(hThread, (PVOID*)&Thread);if (EOS_SUCCES
18、S(Status) IntState = KeEnableInterrupts(FALSE); / 关中断 if (Zero = Thread->State) Status = STATUS_SUCCESS; else Status = STATUS_NOT_SUPPORTED;KeEnableInterrupts(IntState);/ 开中断ObDerefObject(Thread);return Status;3f o唱 L«b RC 4U 300? 亠l.-【I廉 Icfi*疋iQp 仔* MfnMFtOl-K 8<' Pr*rrwi!r Ct l *F
19、1 F*H "fcc B-wn i <rrh uotik 口 He u 1 incl.«-vuH .;TIhIdM匕PfWD 七寸 KOJ s:Bi 1 1>1>*Pr* o«cesss= JL 1 s-ib < 1 hrcce er ss >I D- I-灵gjFs*t;HEI 1*1 i n-S" 1 <iji i ?>Br"niri.«4lTnLBn< i Fi* imrt rBijiI O- I- I rni-rtiyi>nNl<mi-*七 vvyvyvvWVV$r*
20、4<4斗4-|叩<4| 菱箜21要|_|0SJ'” nuBluTrH *I kHCW H 士ii 出 51 和 owoooinrr.P OxOIZB-01L 旧 o ciOOo 1 <1 立旷 l> Ok6OO1U&D cimisc-11 lOt >>OxlJOO JlUZCj D i r»Ki5 oi>hU<»HU »t»A1¥S-l3.12M'SA问题解答:当在控制台2中执行suspend命令时,实质上是优先级为24的控制台2线 程抢占了处理器,也就是控制台2线程处于运
21、行状态,所以此时loop线程处于 就绪状态了。实验总结通过本次实验,调试线程在各种状态间的转换过程,熟悉了线程的状态和转换。通过为线程增加挂起状态,加深了对线程状态的理解。了解到EOS线程状态有就绪状态、阻塞状态、运行状态。以及其状态的转换过程有新建就 绪、就绪f运行、运行f就绪、运行f阻塞、阻塞f就绪、任意状态f结 束状态六种, 以及Suspend和Resume原语操作使其进入挂起和唤醒状态。实验五.进程的同步1.实验目的使用EOS的信号量,编程解决生产者一消费者问题,理解进程 同步的意义。调试跟踪EOS信号量的工作过程,理解进程同步的原理。修改EOS的信号量算法,使之支持等待超时唤醒功能(
22、有限等 待),加深理解进程同步的原理。2.实验内容准备实验使用EOS的信号量解决生产者-消费者问题團1宣一少,车4主一汹曲之同堆城幵跖卅调试EOS信号量的工作过程修改EOS的信号量算法:STATUSPsWaitForSemaphore(IN PSEMAPHORE Semaphore,IN ULONG Milliseco nds)返回值:STATUS_SUCCESS当你修改信号量使之支持超时唤醒功能后,如果等待超时,应该 返回 STATUS_TIMEOUTSTATUS status;BOOL In tState;ASSERT(KeGetl ntNesti ng() = 0);In tStateK
23、eE nablel nterrupts(FALSE); /开始原子操作,禁止中断。if (Semaphore->Cou nt > 0) Semaphore->Co un t-;status二STATUS_SUCCESS;if (Semaphore->Count = 0) status=PspWait(&Semaphore->WaitListHead, Milliseconds);KeEnableInterrupts(IntState); / 原子操作完成,恢复中断。 return status;在PsReleaseSemaphore函数中修改为: for(
24、Semphore->Count+=RealeaseCount;Semphore->Count>0&&!ListisEmpty(&Semphore->WaitListHead); Semphore->Count-)PspWakeThread(&Semphore->WaitListHead, STATUS_SUCCESS)问题回答 :Mutex 对象只是用来保护临界资源的, 放置生产者线程和消费者线程同时访 问临界资源,从而造成混乱, Empty 信号量和 Full 信号量是相互合作不可分割 的,在生产者线程中, Empty 信号
25、量保证没有在空缓冲区的时候让生产者停止生 产,Full信号量保证在生产完毕一个产品后增加一个满缓冲区;消费者线程中,full 信号量保证在没有满缓冲区的时候让消费者停止消费, Empty 信号量保证 在消费完毕一个产品增加一个空缓冲区,所以顺序不能改变。实验总结 通过本次实验我更加了解了进程的同步的主要任务是使并发执行的各进程 之间能有效的共享资源和相互合作。并且对进程同步的原理理解的更加透彻, 并且了解到可以使用互斥体 (Mutex)、信号量(Semophore和事件(Event) 等同步对象来解决一系列经典的进程同步问题。实验六.时间片轮转调度1实验目的调试EOS的线程调度程序,熟悉基于优
26、先级的抢先式调度 为EOS添加时间片轮转调度,了解其它常用的调度算法。2. 实验内容准备实验 阅读控制台命令“ rr ”相关的源代码jnlscl昭 L*l> FC - lirrooft Virtual PC 2007Action Edit ID Floppy HftlpC0N3OLE-1 (Press Ctrl+FL"F8 to suitch console window Thread 0 (8): 4974G團14-1 :没有时闾片轮转调度肘W命令的执行效果调试线程调度程序(1).调试当前线程不被抢先的情况(2)、调试当前线程被抢先的情况为EOS添加时间片轮转调度(1)修改
27、ps/sched.c 文件中的 PspRoundRobin函数VOIDPspRou ndRobi n( VOID)if (NULL != PspCurre ntThread && Running = PspCurre ntThread->State) PspCurre ntThread->Remai nderTicks-;if (0 = PspCurre ntThread->Remai nderTicks) PspCurre ntThread->Remai nderTicks = TICKS_OF_TIME_SLICE; if (BIT_TEST(Psp
28、ReadyBitmap, PspCurre ntThread->Priority) PspReadyThread(PspCurre ntThread); OS L*b FC -iere £4ft:Yirtvkl FC 200T FlF0 tosw11 c i console uIndouAc li oeil Edi t CD Floppy HelpCOMSOLE 1 Thread © Thn-irtd 1 Thread X Thrcod J Hi mod 4 Thread 5 Thread f> Thread 7 Hire&d C Dircftd 9CS
29、HUUesoooo JI fR t t t- ut ( _rv ( t7肋Hr9l7lz4lzl50卑宁宁0丘了4-H5 i34311333 3_R R 8 o n R H u 3 8ThreaJ 19 ThrfiArt 11 Thread 12 Thread 1J Threflrt H Thread 15 Thprrnd IfS Thread 17 Thread IB Thread 19圈14-2t谜行时间片轮转谀0t时Arr*命令的执存效果问题解答:如果使用互斥信号量,则那些由于访问临界区而被阻塞的线程,就会被放 入互斥信号量的等待队列,就不会再相应优先级的就绪队列中了,而时间片轮 转调度
30、算法就是对就绪队列的线程进行轮转调度,而不是对被阻塞线程调度的。实验总结;通过本次实验了解到时间片的大小对时间片轮转调度有着一定的影响。当时间片过长时,调度算法退化为 FCFS算法,不利于短作业的调用;而当时间 片过短时,则会使进程的切换次数增加,时系统开销增大。所以说时间片的大小 要根据实际情况划分,不可过长,也不可过短。在这次实验中我感悟到要验证结 论必须要进行多次重复的实验,要有耐性,不能只是做几组,这样对结论的验证 不具有代表性,应该在不同区域段选取多组值进行验证。实验七.物理存储器与进程逻辑地址空间的管理1.实验目的通过查看物理存储器的使用情况,并练习分配和回收物理内存,从而掌握物
31、理存储器的管理方法。通过查看进程逻辑地址空间的使用情况,并练习分配和回收虚拟内存,从而 掌握进程逻辑地址空间的管理方法。2.实验内容准备实验并查看其执行的结果阅读控制台命令“ pm”相关的源代码, 分配物理页和释放物理页阅读控制台命令“ vm”相关的源代码,并查看其执行的结果LVi CHIU二2 :5lrf:lJ2“ u : -!=- p Tl-tv -Bia. jdd注乳川” 溜益?:"答1 12»製5“ UiikiiM'gv-rK 2.!K 7*Frari,V911, Hi r r i MV"lbml: :;Tm« -Tti:rlnrlt-&
32、#171;:c :小二r rrrrrr FrrFFrrp lsE.g MEouofla.o廿c好妙>uw 1Total Upn655X0 to 657407. (OxAOOOOOOO - GxftGTFrFFF)3tt I4fl i sa i M I plfin I10a114idnU«d UM Uad Uad Uad Uad u<«d UAd (Uad f Uad f Mad f UdInckme Inc hide , I Delude Includc I Include <IncliMu - Include I Include Eric lude ,J
33、 ncludeInclude IncludeIncludeFron Fron ProR Frcm Fron Frow FronFrnnFronFron Frow Fron FronB0E»6b6?hH773753?3?湘38 313l3l3l3l31mmnn5555 lr555s5Ln55555 5CJSb5hbs566Gh K66bbhbhbtn i to i to i to i tu i to I to i tn i to i to to to to655360. &55362.656366. 655368.655370.&5537Z 65S371 65537&a
34、mp; i 655378. i 655380 ” b£S38 乙(OxAOOOOOOO - (OxAOOGlOOO - (Q3(AOOG3O0O - (OxAOOOSOQ© -OxAOOGOFFF) xAQO0ZFFF> 0xAOO03FFF* OxfiWOGFFF)(0xAOOG7OOO - OxAGOGfiFFPi (OxAOOOBOOO - OxAOOOAFFF) (OxAOOSBOOQ - ©xfiQOOCfFFJ (QxfteOODOOO - OxA0GGEFFF) (QxAOOOFOOO - OxROOlOFFFl (OkAOOI1000 - 0
35、xA0912FFF) (OxAOOElOOO OxftOOMFFF) (OxAOGlbOOO - OxOOlbFFF) (0x0017000 OxAOGlBFFr)Tota l Upn Count; 2640 * fil Located Upn Count: 24 .Free Upn Count: ZQZA ,图16-5:创壷了一个应用程序进程后.系统进程中虚拟地址描述符的信息在系统进程中分配虚拟页和释放虚拟页修改的代码#in elude "EOSApp.h"int main (i nt argc, char* argv)#ifdef _DEBUG_asm("i
36、nt $3n nop");#en difprintf("Endless loop!n"); for(;) return 0;Pm.c/PRIVATEVOIDConsoleCmdPhysicalMemory(IN HANDLE StdHandle)BOOL IntState;ULONG_PTR PfnArray1;IntState = KeEnableInterrupts(FALSE); / 关中断 fprintf(StdHandle, "Page Count: %d.n", MiTotalPageFrameCount); fprintf(Std
37、Handle, "Memory Count: %d * %d = %d Byte.n",MiTotalPageFrameCount, PAGE_SIZE,MiTotalPageFrameCount * PAGE_SIZE);fprintf(StdHandle, "nZeroed Page Count: %d.n", MiZeroedPageCount); fprintf(StdHandle, "Free Page Count: %d.n", MiFreePageCount);fprintf(StdHandle, "nUsed
38、 Page Count: %d.n", MiTotalPageFrameCount - MiZeroedPageCount - MiFreePageCount);MiAllocateAnyPages(1, PfnArray);fprintf(StdHandle, "n* After Allocate OnePage *n"); fprintf(StdHandle, "Zeroed Page Count: %d.n", MiZeroedPageCount); fprintf(StdHandle, "Free Page Count: %d
39、.n", MiFreePageCount); fprintf(StdHandle, "Used Page Count: %d.n", MiTotalPageFrameCount- MiZeroedPageCount - MiFreePageCount);MiFreePages(1, PfnArray);fprintf(StdHandle, "n* After Free One Page *n"); fprintf(StdHandle, "Zeroed Page Count: %d.n", MiZeroedPageCount)
40、; fprintf(StdHandle, "Free Page Count: %d.n", MiFreePageCount); fprintf(StdHandle, "Used Page Count: %d.n", MiTotalPageFrameCount- MiZeroedPageCount - MiFreePageCount);KeEnableInterrupts(IntState); / 开中断问题解答;从性能角度分析,调用 MilAllocateAnyPages 函数分配物理页在某些情况下 比调用 MiAllocateZeroedPages 函
41、数要快速。从安全角度分析,分配零页更加 安全。实验总结 本次实验基本达到了实验目的, 通过本次试验我学会了通过查看物理存储 器的使用情况,并练习分配和回收物理内存,从而掌握物理存储器的分页式的 管理方法。 以及通过查看进程逻辑地址空间的使用情况,并练习分配和回收虚 拟内存,从而掌握进程逻辑地址空间的符号链管理方法。实验八 . 分页存储器管理一、实验目的学习 i386 处理器的二级页表硬件机制,理解分页存储器管理原理。查看 EOS 应用程序进程和系统进程的二级页表映射信息,理解页目录和页 表的管理方式。编程修改页目录和页表的映射关系,理解分页地址变换原理。2. 实验内容准备实验查看EOS用程序进
42、程的页目录和页表 查看应用程序进程和系统进程并发时的页目录和页表 查看应用程序进程并发时的页目录和页表 在二级页表中映射新申请的物理页代码:ULONG PfnArray2; *(PINT)0xE0000000) = 100;MiAllocateZeroedPages(2, PfnArray); OutputFormat = "New page frame number: 0x%X, 0x%Xn" fprintf(StdHandle, OutputFormat, PfnArray0, PfnArray1); KdbPrint(OutputFormat, PfnArray0,
43、PfnArray1);IndexOfDirEntry = (0xE0000000 >> 22); (PMMPTE_HARDWARE)0xC0300000)IndexOfDirEntry.PageFrameNumber = PfnArray0;(PMMPTE_HARDWARE)0xC0300000)IndexOfDirEntry.Valid = 1;/ 有效(PMMPTE_HARDWARE)0xC0300000)IndexOfDirEntry.Writable = 1;/ 可写MiFlushEntireTlb(); / 刷新快表PageTableBase = 0xC0000000 +
44、 IndexOfDirEntry * PAGE_SIZE;IndexOfTableEntry = (0xE0000000 >> 12) & 0x3FF; (PMMPTE_HARDWARE)PageTableBase)IndexOfTableEntry.PageFrameN umber = PfnArray1;(PMMPTE_HARDWARE)PageTableBase)IndexOfTableEntry.Valid = 1;(PMMPTE_HARDWARE)PageTableBase)IndexOfTableEntry.Writable = 1; MiFlushEntire
45、Tlb();IndexOfTableEntry = (0xE0001000 >> 12) & 0x3FF;/ 虚拟地址的12-22 位是 PTE 标号 (PMMPTE_HARDWARE)PageTableBase)IndexOfTableEntry.PageFrameN umber = PfnArray1;(PMMPTE_HARDWARE)PageTableBase)IndexOfTableEntry.Valid = 1;(PMMPTE_HARDWARE)PageTableBase)IndexOfTableEntry.Writable =1; MiFlushEntireTl
46、b(); / 刷新快表OutputFormat = "Read Memory 0xE0001000: %dn" fprintf(StdHandle, OutputFormat, *(PINT)0xE0001000); KdbPrint(OutputFormat, *(PINT)0xE0001000); *(PINT)0xE0000000) = 100;/ 写共享内存fprintf(StdHandle, OutputFormat, *(PINT)0xE0001000); KdbPrint(OutputFormat, *(PINT)0xE0001000);Memory.c/#i
47、nclude "EOSApp.h" #define CR3_SHIFT 12 #define PDE_BASE(ULONG_PTR)0xC0300000) 拟地址空间的基址PTE_SIZE 0x4 / #define PTE_PER_TABLE 中有 1024 个 PTE #define PAGE_SIZE #define PDI_SHIFT #define PTI_SHIFT#define PTE_BASE (ULONG_PTR)0xC0000000) / #define页目录项和页表项都是 4 字节0x400 /页目录中有1024个PDE,页表0x10002212typ
48、edef struct _MMPTE_HARDWAREULONG Valid : 1;/ 存在位 0ULONG DoNotCare : 11;/ 不关心这些位 1-11ULONG PageFrameNumber : 20; / 页框号 12-31 MMPTE_HARDWARE, *PMMPTE_HARDWARE;ULONG getcr3();int main(int argc, char* argv)ULONG PfnOfPageDirectory;ULONG PageTotal = 0;ULONG IndexOfDirEntry;ULONG IndexOfTableEntry;PMMPTE_
49、HARDWARE pPde;PMMPTE_HARDWARE pPte;ULONG_PTR PageTableBase;ULONG_PTR VirtualBase;const char* OutputFormat = NULL;#ifdef _DEBUG/ _asm("int $3n nop");#endif/ Sleep(10000);/ 等待 10 秒_asm("cli"); /关中断OutputFormat = "nCR3->0x%Xn"PfnOfPageDirectory = (getcr3() >> CR3_
50、SHIFT); printf(OutputFormat, PfnOfPageDirectory); KdbPrint(OutputFormat, PfnOfPageDirectory);for(IndexOfDirEntry = 0; IndexOfDirEntry < PTE_PER_TABLE; IndexOfDirEntry+)pPde = (PMMPTE_HARDWARE)(PDE_B+ASInEdexOfDirEntry * PTE_SIZE);if(!pPde->Valid)continue;OutputFormat = "PDE: 0x%X (0x%X)-&
51、gt;0x%Xn"VirtualBase = (IndexOfDirEntry << PDI_SHIFT);printf(OutputFormat, IndexOfDirEntry, VirtualBase, pPde->PageFrameNumber);KdbPrint(OutputFormat, IndexOfDirEntry, VirtualBase, pPde->PageFrameNumber);PageTableBase = PTE_BASE + IndexOfDirEntry * PAGE_SIZE;for(IndexOfTableEntry =
52、0; IndexOfTableEntry < PTE_PER_TABLE; IndexOfTableEntry+)pPte = (PMMPTE_HARDWARE)(PageTableBase + IndexOfTableEntry * PTE_SIZE);OutputFormat = "ttPTE: 0x%X (0x%X)->0x%Xn"VirtualBase = (IndexOfDirEntry << PDI_SHIFT) | (IndexOfTableEntry << PTI_SHIFT);printf(OutputFormat, I
53、ndexOfTableEntry, VirtualBase, pPte->PageFrameNumber);KdbPrint(OutputFormat, IndexOfTableEntry, VirtualBase, pPte->PageFrameNumber);PageTotal+; / 第二层循环结束 / 第一层循环结束OutputFormat = "nPhysical Page Total: %dn" printf(OutputFormat, PageTotal);KdbPrint(OutputFormat, PageTotal);OutputFormat
54、 = "Physical Memory Total: %dnn" printf(OutputFormat, PageTotal * PAGE_SIZE); KdbPrint(OutputFormat, PageTotal * PAGE_SIZE);asm("sti"); / 开中断/ Sleep(10000);/ 等待 10 秒return 0;问题解答 :页目录占用一个物理页,页框号 0x409.页表占用5个物理页,页框号 是 0x41D,0x401,0x403,0x404,0x402 。映射用户地址空间的页表的页框号是 0x41D。实验结论 页式存储
55、管理机制的优缺点:分页实现了离散分配方式,从而消减了外 零头,提高了内存的利用率。 页面大小确定, 系统中只能有一种大小的页面。 在这分页的作业地址空间是一维的, 程序员只需利用一个记忆符就可以表示 一个地址,但是由于也比较小,从而使系统查找时间比较长,可能需要多次 调用查找页表。此次实验基本达到了实验目的,通过此次实验我理解分页存 储器管理原理、理解页目录和页表的管理方式、理解分页地址变换原理。实验十 . 磁盘调度算法1. 实验内容及目的通过学习 EOS 实现磁盘调度算法的机制,掌握磁盘调度算法执行的条件和时 机。观察EOS实现的FCFS、SSTF和SCAN磁盘调度算法,了解常用的磁盘调 度
56、算法。编写 CSCAN 和 N-Step-SCAN 磁盘调度算法,加深对各种扫描算法的理解。 2. 实验内容验证先来先服务(FCFS磁盘调度算法验证最短寻道时间优先(SSTF磁盘调度算法验证SSTF算法造成线程的“饥饿“现象验证扫描(SCAN磁盘调度算法改写SCAN算法 PREQUESTIopDiskSchedule(VOID ) PLIST_ENTRY pListEntry;PREQUEST pRequest;LONG Offset;ULONG InsideShortestDistance = 0xFFFFFFFF;ULONG OutsideShortestDistance = 0xFFFF
57、FFFF;PREQUEST pNextRequest = NULL;while (TRUE) for (pListEntry = RequestListHead.Next;pListEntry != &RequestListHead;pListEntry = pListEntry->Next) pRequest = CONTAINING_RECORD(pListEntry, REQUEST, ListEntry);Offset = pRequest->Cylinder - CurrentCylinder;if (0 = Offset) pNextRequest = pReq
58、uest; goto RETURN; else if (ScanInside && Offset > 0) if (Offset < InsideShortestDistance) InsideShortestDistance = Offset; pNextRequest = pRequest; else if (!ScanInside && Offset < 0) if (-Offset < OutsideShortestDistance) OutsideShortestDistance = -Offset; pNextRequest = pRequest;if (NULL = pNextRequest) ScanInside = !ScanInside;else break;RETURN:return pNextRequest; 编写循环扫描( CSCA)N 磁盘调度算法 PREQUESTIopDiskSchedule
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 旅游管理与服务标准2026年导游从业试题
- 2026年乡镇森林防火法律责任与警示教育试题
- 2026年英语四六级考试模拟试题及解析
- 2026年旅游行业规范与服务标准测试题
- 2026年职场沟通技巧测试题
- 2026年年轻干部违规吃喝问题界限辨析问答
- 克服害羞的演讲稿作文
- 感恩节小学活动演讲稿
- 2026年未成年人救助保护机构规范知识竞赛
- 2026年机关干部统计数据分析应用知识竞赛题
- 2025年《公共基础知识》试题库(附含答案)
- 中华人民共和国危险化学品安全法解读
- 中国玫瑰痤疮诊疗指南(2025版)
- 石材幕墙干挂维修工程方案
- 供应室进修汇报课件
- 炼钢厂连铸设备培训
- 水库工程施工进度计划管理模板
- 妇女盆底功能障碍性疾病防治方案
- 音浪小球课件
- 养殖场申请审批报告标准模板
- 智能玩具小车设计
评论
0/150
提交评论