0 00:00:00,000 --> 00:00:15,720 1 00:00:15,760 --> 00:00:17,040 那各位同学大家好 2 00:00:17,080 --> 00:00:18,440 那我们今天给大家介绍一下 3 00:00:18,480 --> 00:00:22,480 lab3的实验内容 4 00:00:22,520 --> 00:00:24,840 那lab3是有关虚拟内存管理 5 00:00:24,880 --> 00:00:26,520 大家在学完原理课的 6 00:00:26,560 --> 00:00:28,440 虚拟内存管理之后呢 7 00:00:28,480 --> 00:00:30,520 可以通过这个lab3实验呢 8 00:00:30,560 --> 00:00:31,640 能够对虚拟内存管理的 9 00:00:31,680 --> 00:00:33,640 关键的一些知识点 10 00:00:33,680 --> 00:00:35,160 它的一些基本概念和 11 00:00:35,200 --> 00:00:37,160 它的一些处理机制等等 12 00:00:37,200 --> 00:00:38,320 有更深入的理解 13 00:00:38,360 --> 00:00:39,600 那我们希望通过lab3呢 14 00:00:39,640 --> 00:00:42,080 大家能够把这两者之间呢 15 00:00:42,120 --> 00:00:46,280 建立一个对应关系 16 00:00:46,320 --> 00:00:47,320 那我们这次课呢 17 00:00:47,360 --> 00:00:48,680 主要讲以下部分内容 18 00:00:48,720 --> 00:00:49,600 第一部分是有关 19 00:00:49,640 --> 00:00:51,760 我们这次实验它的目标 20 00:00:51,800 --> 00:00:54,800 我们希望通过学习完原理课之后呢 21 00:00:54,840 --> 00:00:56,400 我们再做实验要达到一个 22 00:00:56,440 --> 00:00:57,600 什么样一个目标 23 00:00:57,640 --> 00:01:00,200 这是我们第一个要讲的工作 24 00:01:00,240 --> 00:01:02,960 第二个是回顾一下lab1和lab2 25 00:01:03,000 --> 00:01:04,160 为什么要回顾呢 26 00:01:04,200 --> 00:01:05,560 是在于我们的lab3呢 27 00:01:05,600 --> 00:01:08,640 其实在建立在lab1和lab2基础之上的 28 00:01:08,680 --> 00:01:11,240 它用到了中断 用到了页表机制 29 00:01:11,280 --> 00:01:13,760 来实现我们这个lab3 30 00:01:13,800 --> 00:01:15,720 然后呢我们会介绍一下这个lab3 31 00:01:15,760 --> 00:01:18,760 大致的一个整体设计框架 32 00:01:18,800 --> 00:01:20,680 以及这里面用到的一些 33 00:01:20,720 --> 00:01:24,720 关键数据结构 功能和大致处理流程 34 00:01:24,760 --> 00:01:26,640 尤其是针对两个关键的部分 35 00:01:26,680 --> 00:01:28,960 一个是页访问异常的处理 36 00:01:29,000 --> 00:01:32,240 一个是页换入换出机制的一个处理 37 00:01:32,280 --> 00:01:34,880 这两块呢重点给大家阐述一下 38 00:01:34,920 --> 00:01:36,440 通过这些阐述呢能够使得大家 39 00:01:36,480 --> 00:01:39,200 可以更容易的去理解 40 00:01:39,240 --> 00:01:43,120 和完成这次实验的内容 41 00:01:43,160 --> 00:01:44,760 好 我们看一下这个目标 42 00:01:44,800 --> 00:01:45,680 那么目标是什么呢 43 00:01:45,720 --> 00:01:47,720 我们说 第一呢其实是 44 00:01:47,760 --> 00:01:50,560 把你lab1和lab2再回顾一下 45 00:01:50,600 --> 00:01:53,720 知道lab1和lab2到底完成了什么事情 46 00:01:53,760 --> 00:01:57,160 因为在这里面我们前面已经提到了lab1 47 00:01:57,200 --> 00:01:58,880 它完成了一个很重要的一个机制 48 00:01:58,920 --> 00:02:00,240 是中断处理机制 49 00:02:00,280 --> 00:02:03,680 而我们在lab3里面用到这个页异常呢 50 00:02:03,720 --> 00:02:06,240 也其实它这个处理过程也是建立在 51 00:02:06,280 --> 00:02:08,200 这个中断处理机制之上的 52 00:02:08,240 --> 00:02:10,080 所以说呢这两者有个必然的联系 53 00:02:10,120 --> 00:02:12,960 这是一个 第二个就是实验二 54 00:02:13,000 --> 00:02:14,520 实验二我们是完成了什么 55 00:02:14,560 --> 00:02:16,080 完成了一个物理内存的管理 56 00:02:16,120 --> 00:02:19,720 建立了基于页机制的这个映射关系 57 00:02:19,760 --> 00:02:22,640 而我们这个lab3虚存管理呢 58 00:02:22,680 --> 00:02:23,680 也是充分利用了这个页机制的 59 00:02:23,720 --> 00:02:24,600 这个映射的关系 60 00:02:24,640 --> 00:02:26,520 来完成了虚存的管理 61 00:02:26,560 --> 00:02:28,640 所以说这两个呢 62 00:02:28,680 --> 00:02:31,440 其实你首先你在完成lab3之前呢 63 00:02:31,480 --> 00:02:33,640 你需要对lab1和lab2 64 00:02:33,680 --> 00:02:36,960 你完成lab1和lab2做一个理解 65 00:02:37,000 --> 00:02:40,160 做一个回顾 我们可以说lab1和lab2是 66 00:02:40,200 --> 00:02:41,840 打下了一个很好的基础 67 00:02:41,880 --> 00:02:44,320 如果有同学能够顺利 68 00:02:44,360 --> 00:02:47,560 或者说经过自己的努力完成了lab1 lab2 69 00:02:47,600 --> 00:02:50,000 我可以说后面的实验相对来说 70 00:02:50,040 --> 00:02:52,560 要容易很多 要平坦很多 71 00:02:52,600 --> 00:02:54,440 不像我们前面说lab1 lab2 72 00:02:54,480 --> 00:02:56,440 它要了解大量的硬件细节 73 00:02:56,480 --> 00:02:59,400 尤其是80386这个保护模式 74 00:02:59,440 --> 00:03:01,640 但是一旦大家突破这个瓶颈 75 00:03:01,680 --> 00:03:04,680 那我想后面的这个完成lab3 76 00:03:04,720 --> 00:03:06,000 以及后续这些实验呢 77 00:03:06,040 --> 00:03:10,640 就应该要轻松和容易很多 78 00:03:10,680 --> 00:03:14,000 那我们lab3要完成什么事情 79 00:03:14,040 --> 00:03:16,200 lab3其实我们最终目标是 80 00:03:16,240 --> 00:03:18,720 希望要提供一个比实际物理内存空间 81 00:03:18,760 --> 00:03:21,960 要更大的一个虚拟内存空间 82 00:03:22,000 --> 00:03:22,960 也意味着你的物理空间 83 00:03:23,000 --> 00:03:24,960 可能只有比如说4兆 84 00:03:25,000 --> 00:03:27,600 那其实我们虚拟出来了8兆使用 85 00:03:27,640 --> 00:03:28,920 这其实给我们应用程序 86 00:03:28,960 --> 00:03:31,880 提供了一个很好的使用空间 87 00:03:31,920 --> 00:03:34,040 当然在这里面我们还没碰到应用程序 88 00:03:34,080 --> 00:03:36,240 要到lab5去才碰到 但是这里面呢 89 00:03:36,280 --> 00:03:38,240 我们其实提前做好这些准备了 90 00:03:38,280 --> 00:03:40,240 要达到这个目标我们需要 91 00:03:40,280 --> 00:03:42,160 刚才说到了要借助于这个 92 00:03:42,200 --> 00:03:45,360 中断和页表机制 来完成什么呢 93 00:03:45,400 --> 00:03:49,040 专门针对缺页错就是说页处理异常 94 00:03:49,080 --> 00:03:50,760 这种机制的一个处理 95 00:03:50,800 --> 00:03:51,960 那么这是建立在 96 00:03:52,000 --> 00:03:53,520 我们中断这个机制之上的 97 00:03:53,560 --> 00:03:55,760 同时呢我们还要去完成什么呢 98 00:03:55,800 --> 00:03:59,480 完成一个FIFO页面的一个替换算法 99 00:03:59,520 --> 00:04:00,720 我们在讲原理课的时候 100 00:04:00,760 --> 00:04:02,400 讲了多种替换算法 101 00:04:02,440 --> 00:04:03,280 那么这里面我们只是 102 00:04:03,320 --> 00:04:05,200 挑了一个最简单的FIFO 103 00:04:05,240 --> 00:04:07,600 先进先出这个页面置换算法 104 00:04:07,640 --> 00:04:11,520 来实现所谓的把一些不常用的页 105 00:04:11,560 --> 00:04:13,640 把不常用的一些页给换出去 106 00:04:13,680 --> 00:04:15,320 把最常用的页换进来 107 00:04:15,360 --> 00:04:16,560 当然这个常用不常用取决于 108 00:04:16,600 --> 00:04:18,800 你的算法的设计和实现了 109 00:04:18,840 --> 00:04:20,880 你为了能够换入换出 110 00:04:20,920 --> 00:04:22,920 你要想到你换入和换出 111 00:04:22,960 --> 00:04:24,080 是要和我们什么呢 112 00:04:24,120 --> 00:04:25,160 和我们的硬盘打交道 113 00:04:25,200 --> 00:04:26,360 所以说你还需要提供一个 114 00:04:26,400 --> 00:04:27,880 对硬盘的一个处理 115 00:04:27,920 --> 00:04:29,840 对硬盘进行读和写 116 00:04:29,880 --> 00:04:33,240 这个呢就是我们说大致总体目标 117 00:04:33,280 --> 00:04:35,200 希望通过这几个结合呢 118 00:04:35,240 --> 00:04:36,960 来实现所谓虚存管理的 119 00:04:37,000 --> 00:04:38,920 一个基本的一个框架 120 00:04:38,960 --> 00:04:42,720 那实验目标呢是虚存管理 121 00:04:42,760 --> 00:04:44,080 这一块主要是希望提供一个 122 00:04:44,120 --> 00:04:46,760 比实际物理内存更大的 123 00:04:46,800 --> 00:04:48,000 虚拟内存空间 124 00:04:48,040 --> 00:04:50,760 这是我们和我们原理课的原理和 125 00:04:50,800 --> 00:04:53,440 相应概念是一致的 那怎么做呢 126 00:04:53,480 --> 00:04:57,120 这里面要完成两块主要的练习 127 00:04:57,160 --> 00:04:59,760 第一块练习呢是完成这个 128 00:04:59,800 --> 00:05:01,240 给未映射的地址 129 00:05:01,280 --> 00:05:02,560 映射上物理页这么一个工作 130 00:05:02,600 --> 00:05:03,560 这主要是说 131 00:05:03,600 --> 00:05:05,960 当一旦产生这个缺页异常之后 132 00:05:06,000 --> 00:05:08,120 我们通过对do_pgfault 133 00:05:08,160 --> 00:05:11,080 关于这个缺页的这个中断处理例程 134 00:05:11,120 --> 00:05:13,920 最主要的一个函数的设计和实现呢 135 00:05:13,960 --> 00:05:17,480 来完成给未映射的页面映射上物理页 136 00:05:17,520 --> 00:05:20,600 这一块呢需要考虑一些细节 137 00:05:20,640 --> 00:05:21,640 到时候我们会在后面 138 00:05:21,680 --> 00:05:23,760 还会进一步讲解 这是第一个 139 00:05:23,800 --> 00:05:24,880 第二个练习 140 00:05:24,920 --> 00:05:28,360 第二个练习是完成页替换算法 141 00:05:28,400 --> 00:05:29,280 这个页替换算法比较简单 142 00:05:29,320 --> 00:05:31,600 是FIFO 算法本身简单 143 00:05:31,640 --> 00:05:33,520 但是你需要把这个算法呢 144 00:05:33,560 --> 00:05:36,560 能够和我们整个ucore 融为一体 145 00:05:36,600 --> 00:05:39,080 这为此需要和好几个部分有交互 146 00:05:39,120 --> 00:05:41,880 第一个比如说跟swap分区的 147 00:05:41,920 --> 00:05:44,880 swap in / swap out这个相应的处理 148 00:05:44,920 --> 00:05:46,600 完成跟硬盘打交道 149 00:05:46,640 --> 00:05:49,680 以及要去识别相应页表里面 150 00:05:49,720 --> 00:05:51,400 的一些相关的一些改动等等 151 00:05:51,440 --> 00:05:53,960 这都是练习一 练习二要完成的工作 152 00:05:54,000 --> 00:05:56,080 在完成练习一 练习二之前 153 00:05:56,120 --> 00:06:01,760 你需要把之前的那个lab1和lab2 154 00:06:01,800 --> 00:06:04,280 要把它的代码填进去 155 00:06:04,320 --> 00:06:06,840 因为我们lab3是基于这个lab1和lab2的 156 00:06:06,880 --> 00:06:09,680 这是我们说这个练习这一块 157 00:06:09,720 --> 00:06:09,760