操作系统实验报告 联系客服

发布时间 : 星期三 文章操作系统实验报告更新完毕开始阅读5b268300a26925c52dc5bf13

MiAllocateZeroedPages(2, PfnArray);

OutputFormat = \fprintf(StdHandle, OutputFormat, PfnArray[0], PfnArray[1]); KdbPrint(OutputFormat, PfnArray[0], PfnArray[1]); //

// 使用 PfnArray[0] 页做为页表,映射基址为 0xE00000000 的 4M 虚拟地址。 //

IndexOfDirEntry = (0xE0000000 >> 22); // 虚拟地址的高 10 位是 PDE 标号 ((PMMPTE_HARDWARE)0xC0300000)[IndexOfDirEntry].PageFrameNumber PfnArray[0];

((PMMPTE_HARDWARE)0xC0300000)[IndexOfDirEntry].Valid = 1;

// 有效 // 可写

=

((PMMPTE_HARDWARE)0xC0300000)[IndexOfDirEntry].Writable = 1; MiFlushEntireTlb(); //

// 根据 PDE 的标号计算其映射的页表所在虚拟地址的基址 //

PageTableBase = 0xC0000000 + IndexOfDirEntry * PAGE_SIZE; //

// 将 PfnArray[1] 放入页表 PfnArray[0] 的两个 PTE 中, // 分别映射基址为 0xE0000000 和 0xE0001000 的 4K 虚拟地址 //

// 刷新快表

IndexOfTableEntry = (0xE0000000 >> 12) & 0x3FF; // 虚拟地址的 12-22 位是 PTE 标号

((PMMPTE_HARDWARE)PageTableBase)[IndexOfTableEntry].PageFrameNumber PfnArray[1];

((PMMPTE_HARDWARE)PageTableBase)[IndexOfTableEntry].Valid = 1; ((PMMPTE_HARDWARE)PageTableBase)[IndexOfTableEntry].Writable = 1; MiFlushEntireTlb();

// 刷新快表

// 有效 // 可写

=

IndexOfTableEntry = (0xE0001000 >> 12) & 0x3FF; // 虚拟地址的 12-22 位是 PTE 标号

((PMMPTE_HARDWARE)PageTableBase)[IndexOfTableEntry].PageFrameNumber PfnArray[1];

((PMMPTE_HARDWARE)PageTableBase)[IndexOfTableEntry].Valid = 1;

// 有效

=

((PMMPTE_HARDWARE)PageTableBase)[IndexOfTableEntry].Writable = 1; MiFlushEntireTlb(); // // 测试 //

OutputFormat = \fprintf(StdHandle, OutputFormat, *((PINT)0xE0001000)); KdbPrint(OutputFormat, *((PINT)0xE0001000)); *((PINT)0xE0000000) = 100;

// 写共享内存 // 刷新快表

// 可写

fprintf(StdHandle, OutputFormat, *((PINT)0xE0001000));

KdbPrint(OutputFormat, *((PINT)0xE0001000)); 7. 思考页式存储管理机制的优缺点。 答:优点:

1、由于它不要求作业或进程的程序段和数据在内存中连续存放,从而有效地解决了碎片问题。

2、动态页式管理提供了内存和外存统一管理的虚存实现方式,使用户可以利用的存储空间大大增加。这既提高了主存的利用纽,又有利于组织多道程序执行。

缺点:

1、要求有相应的硬件支持。例如地址变换机构,缺页中断的产生和选择淘汰页面等都要求有相应的硬件支持。这增加了机器成本。

2、增加了系统开销,例如缺页中断处理机,

3、请求调页的算法如选择不当,有可能产生抖动现象。

4、虽然消除了碎片,但每个作业或进程的最后一页内总有一部分空间得不到利用果页面较大,则这一部分的损失仍然较大。

实验9 串口设备驱动程序

一、实验目的

调试EOS串口驱动程序向串口发送数据的功能,了解设备驱动程序的工作原理。 为EOS串口驱动程序添加从串口接收数据的功能,进一步加深对设备驱动程序工作原理的理解。

二、实验内容 1 准备实验

2 练习使用EOS应用程序向串口发送数据

3调试EOS串口驱动程序向串口发送数据的功能 4为EOS串口驱动程序添加从串口接收数据的功能

三、 问题答案及参考代码

在向串口发送数据时可以不使用缓冲区,将SrlWite函数体修改为 {

CHAR Data; ULONG Cout;

PDEVICE_EXTENSION Ext=

(PDEVICE_EXTENSION)DeviceObject->DeviceExtension; PsResetEvent(&Ext->CompietionEvent) ; For(Count=0 ;Count

Data=((PCHAR)Buffer)[count];

WRITE_PORT_UCHAR(REG_PORT(DeviceObjict,THR),Date); PsWaitForEven(&Ext->CompletionEvent,INFINITE); }

*Result=Count;

Return STATUS_SUCCESS; }

4.在io/driver/serial.c文件的SrlRead函数中,访问接收数据缓冲区时必须关闭中断,思考这样做的原因。在SrlWrite函数中访问缓冲区时为什么不需要关闭中断呢?思考中断在设备I/O中的重要作用和意义。

答:由于SrlWrite函数和Srllsr函数对发送数据缓冲区的访问是同步进行的,在SrlWrite函数中访问发送数据缓冲区时就不需要关闭中断了。

使用中断方式可以让进程在等待硬件设备的响应时让出处理器,调度程序会选择其他进程在处理器上继续执行,从而提高处理器的利用率,并支持多道程序和I/0设备并行操作。同时,由于中断方式是异步执行的,所以在访问临界资源时需要进行同步。

实验10 磁盘调度算法

一、 实验目的

通过学习EOS实现磁盘调度算法的机制,掌握磁盘调度算法执行的条件和时机。 观察EOS实现的FCFS、SSTF和SCAN磁盘调度算法,了解常用的磁盘调度算法。 编写CSCAN和N-Step-SCAN磁盘调度算法,加深对各种扫描算法的理解。 二、实验内容 1 、准备实验

2 、验证先来先服务(FCFS)磁盘调度算法 3 、验证最短寻道时间优先(SSTF)磁盘调度算法 4 、验证SSTF算法造成的线程“饥饿”现象 三、问题答案及参考代码

1. 在执行SCAN、N-Step-SCAN磁盘调度算法时,如果在EOS控制台中多次输入“ds”命令,调度的顺序会发生变化,说明造成这种现象的原因(提示:注意这两种算法使用的全局变量)。尝试修改源代码,使这两种算法在多次执行时,都能确保调度的顺序一致(提示:可以参考io/block.c 文件中IopReceiveRequest函数和IopProcessNextRequest函数判断磁盘调度算法开始工作和结束工作的方法 )。

答:SCAN算法使用了全局变量ScanInside记录磁头移动的方向,每次执行“ds”时,磁头的移动方向都可能不一样,所在磁道也可能不一样,所以在每次执行时距离最短的线程也不同,所以调度的顺序会发生变化,例如在第一次执行“ds”命令时,ScanInside初始化为true则开始磁头是从外向内移动的,结束时磁头变为从内向外移动,所以在下次执行“ds”命令时,开始磁头就继续从内向外移动了。 要解决这个问题,可以IopProcessNextRequest函数中,每次检测到磁盘调度算法结束工作时,将这些全局变量恢复为默认值。

4. 分析已经实现的各种磁盘调度算法的优缺点,尝试实现更多其它的磁盘调度算法。

先来先服务FCFS:公平,简单,每个进程的请求都能依次得到处理。没有对寻道优化,平均寻道时间长。最短时间优先调度算法SSTF:要求访问的磁道是当前磁头所在的磁道最近,每次寻道时间最短,但不能保证平均寻道时间最短。可能导致一些请求无限期推延,产生饥饿现象。电梯调度算法SCAN:不仅考虑当前磁道的距离,优先考虑在磁道前进方向的最短时间,排除磁头在盘面上的往复运动,避免了出现“饥饿”现象。电梯原理。C-SCAN:磁头单项移动。

实验总结:

操作系统实验中我们亲自动手操作,分别实现了进程、存储器管理等功能,将课上所学到的知识与实际操作结合到一起,领会到了各个功能实现的过程原理,加深了对于操作系统

意义、作用的理解,对于今后计算机的相关课程的学习打下了基础。实验的课程中思考题的部分更是对课程内容的进一步理解,让我们有许多收获。最后,感谢老师的悉心教导。