0 00:00:00,000 --> 00:00:06,600 1 00:00:06,680 --> 00:00:10,440 接下来我们讲页式存储管理 2 00:00:10,480 --> 00:00:11,600 那在这里呢 3 00:00:11,640 --> 00:00:12,680 需要首先说清楚 4 00:00:12,720 --> 00:00:14,720 什么是页式存储管理 5 00:00:14,760 --> 00:00:16,640 它的基本概念是些什么 6 00:00:16,800 --> 00:00:18,280 第二个呢是说 7 00:00:18,320 --> 00:00:19,960 因为在页式存储管理当中 8 00:00:20,000 --> 00:00:22,640 它的地址映射或者地址转换 9 00:00:22,680 --> 00:00:25,680 是如何进行的 10 00:00:25,720 --> 00:00:27,320 那在页式存储管理当中呢 11 00:00:27,360 --> 00:00:29,280 它把物理的页面 12 00:00:29,320 --> 00:00:30,640 物理的地址空间 13 00:00:30,680 --> 00:00:33,920 分成的基本单位叫页帧 14 00:00:33,960 --> 00:00:36,200 或者叫帧 frame 15 00:00:36,240 --> 00:00:40,360 那这个大小呢是2的n次幂 16 00:00:40,400 --> 00:00:42,160 为什么这里头会是2的n次幂呢 17 00:00:42,200 --> 00:00:44,640 原因在于 我们要在这个 18 00:00:44,680 --> 00:00:46,400 地址转换的过程当中 19 00:00:46,440 --> 00:00:48,840 让这个转换的过程比较方便 20 00:00:48,880 --> 00:00:51,680 那在计算机里呢二进制的移位 21 00:00:51,720 --> 00:00:53,080 是做乘法的一个 22 00:00:53,120 --> 00:00:56,200 非常重要的快速的一个因素 23 00:00:56,240 --> 00:00:57,600 所以在这儿 一定要求 24 00:00:57,640 --> 00:00:59,480 它是2的整数次幂 25 00:00:59,520 --> 00:01:02,440 比如说我们现在在32位机器里头 26 00:01:02,480 --> 00:01:07,000 4K 4096 是我们常见的一种页帧的大小 27 00:01:07,040 --> 00:01:10,720 与此同时 逻辑地址空间里 28 00:01:10,760 --> 00:01:14,160 也要分成大小相同的基本单位 29 00:01:14,200 --> 00:01:16,960 这就是页page 30 00:01:17,000 --> 00:01:19,120 frame和page之间的区别是在于 31 00:01:19,160 --> 00:01:22,560 一个用来描述逻辑页面 32 00:01:22,600 --> 00:01:25,960 一个用来描述物理页帧 33 00:01:26,000 --> 00:01:29,240 好 有了这两个基本的划分之后 34 00:01:29,280 --> 00:01:30,640 那就有一个问题 35 00:01:30,680 --> 00:01:34,160 页面到页帧之间的转换如何进行 36 00:01:34,200 --> 00:01:37,800 这个转换呢它就涉及到一个页表 37 00:01:37,840 --> 00:01:41,520 那我在这里保存这个转换关系 38 00:01:41,560 --> 00:01:43,000 有了这个转换关系之后 39 00:01:43,040 --> 00:01:45,560 如何让这个转换能够高效地进行 40 00:01:45,600 --> 00:01:48,760 那就是我们这里的MMU和TLB 41 00:01:48,800 --> 00:01:52,440 是存储管理单元和快表 42 00:01:52,480 --> 00:01:56,360 那下面呢我们依次来进行介绍 43 00:01:56,400 --> 00:02:01,240 页帧是我们对物理内存基本块的名称 44 00:02:01,280 --> 00:02:02,920 下面我们用一个示意图 45 00:02:02,960 --> 00:02:08,360 来描述页帧号和帧的偏移 46 00:02:08,400 --> 00:02:10,600 那么在这里头我们看到 47 00:02:10,640 --> 00:02:12,760 这是我们的物理地址空间 48 00:02:12,800 --> 00:02:17,000 我们把物理地址 49 00:02:17,040 --> 00:02:18,920 组织成一个二元组 50 00:02:18,960 --> 00:02:23,480 f表示frame你的帧的帧号 51 00:02:23,520 --> 00:02:25,720 然后O表示偏移量 52 00:02:25,760 --> 00:02:27,800 在你页内的偏移量 53 00:02:27,840 --> 00:02:30,320 那地址呢我就把它分成两段 54 00:02:30,360 --> 00:02:36,800 S是帧的位数 55 00:02:36,840 --> 00:02:40,080 那剩下的呢是页号的长度 56 00:02:40,120 --> 00:02:41,760 那在这里头呢 57 00:02:41,800 --> 00:02:45,800 我们说它的一个地址转换是什么 58 00:02:45,840 --> 00:02:50,400 我数页数f 然后在页内数偏移 59 00:02:50,440 --> 00:02:52,440 这对应到我们这个地方 60 00:02:52,480 --> 00:02:55,760 我先用f去数它到底是第几帧 61 00:02:55,800 --> 00:02:59,120 然后在帧内 去看它的偏移 62 00:02:59,160 --> 00:03:00,840 是后面这个O 63 00:03:00,880 --> 00:03:02,080 用这种方式 64 00:03:02,120 --> 00:03:04,320 我们就可以得到每一个 65 00:03:04,360 --> 00:03:06,200 物理内存当中的存储单元 66 00:03:06,240 --> 00:03:07,320 它所在的位置 67 00:03:07,360 --> 00:03:13,800 它所对应的帧的表示 二元组表示 68 00:03:13,840 --> 00:03:15,880 好 那么有了这个基本的示意之后 69 00:03:15,920 --> 00:03:18,560 我们看一个实际的计算过程 70 00:03:18,600 --> 00:03:19,800 那在实际计算之前呢 71 00:03:19,840 --> 00:03:23,200 我们需要假定你的地址空间是16位的 72 00:03:23,240 --> 00:03:26,040 然后它的页的大小是512字节 73 00:03:26,080 --> 00:03:27,600 就是2的9次方 74 00:03:27,640 --> 00:03:28,520 有了这个之后 75 00:03:28,560 --> 00:03:30,880 我们来看一个实际的计算 76 00:03:30,920 --> 00:03:33,960 这是一个地址 77 00:03:34,000 --> 00:03:36,040 首先我把它分成两段 78 00:03:36,080 --> 00:03:41,080 1到9这是第一段 然后10到16 79 00:03:41,120 --> 00:03:43,560 然后表示成一个二元组呢 80 00:03:43,600 --> 00:03:46,640 这前面是3 后边是6 81 00:03:46,680 --> 00:03:48,360 那这时候它对应的位置在哪呢 82 00:03:48,400 --> 00:03:51,400 我们来说从这儿数到3 然后这一格里头 83 00:03:51,440 --> 00:03:54,080 一帧里头我数它偏移量是6 84 00:03:54,120 --> 00:03:57,200 那这过程什么样呢 在这儿进行计算 85 00:03:57,240 --> 00:04:02,280 需要知道你的S就是一帧的长度 86 00:04:02,320 --> 00:04:07,080 它是2的9次方 512字节 87 00:04:07,120 --> 00:04:09,680 前面是帧号的位数 88 00:04:09,720 --> 00:04:11,280 好 这两个数搁到里头 89 00:04:11,320 --> 00:04:13,000 去这边就能算出来 90 00:04:13,040 --> 00:04:15,360 它实际计算过程呢是这俩加起来 91 00:04:15,400 --> 00:04:17,760 最后得到这样一个结果 92 00:04:17,800 --> 00:04:21,840 逻辑地址空间的划分和 93 00:04:21,880 --> 00:04:25,040 物理地址空间的划分是类似的 94 00:04:25,080 --> 00:04:27,400 那划分成大小相等的 95 00:04:27,440 --> 00:04:29,760 这时候呢页内的偏移和 96 00:04:29,800 --> 00:04:31,760 帧内的偏移它俩是一样的 97 00:04:31,800 --> 00:04:33,640 但是页号和帧号 98 00:04:33,680 --> 00:04:35,120 通常情况下是不一样的 99 00:04:35,160 --> 00:04:37,120 因为我们逻辑地址空间的 100 00:04:37,160 --> 00:04:40,320 它的页号是连续的 101 00:04:40,360 --> 00:04:42,640 到对应的帧号呢它就不一定 102 00:04:42,680 --> 00:04:45,040 也是相邻的 103 00:04:45,080 --> 00:04:47,440 好 那我们下面跟那边一样的 104 00:04:47,480 --> 00:04:51,960 我们还是逻辑地址空间和逻辑地址 105 00:04:52,000 --> 00:04:54,000 我们也把它划分成一个二元组 106 00:04:54,040 --> 00:04:58,040 这个二元组的表示呢是P表示页号 107 00:04:58,080 --> 00:05:01,520 O表示页内偏移 108 00:05:01,560 --> 00:05:03,720 页内偏移长度 109 00:05:03,760 --> 00:05:06,320 和页的大小是一致的 110 00:05:06,360 --> 00:05:10,920 S位对应着它有2的s次方个字节为一页 111 00:05:10,960 --> 00:05:16,160 然后 页号呢实际上是前面这一段 112 00:05:16,200 --> 00:05:18,120 这个时候你逻辑地址空间 113 00:05:18,160 --> 00:05:19,560 的转换怎么来进行呢 114 00:05:19,600 --> 00:05:24,720 那是P左移S位然后加上O得到 115 00:05:24,760 --> 00:05:28,040 你访问的存储单元的位置 116 00:05:28,080 --> 00:05:29,520 有了这两个之后 117 00:05:29,560 --> 00:05:33,280 那我们就有一个逻辑地址 118 00:05:33,320 --> 00:05:35,520 到物理地址转换的问题 119 00:05:35,560 --> 00:05:37,040 那这个转换呢 120 00:05:37,080 --> 00:05:39,760 它在逻辑地址空间里头 121 00:05:39,800 --> 00:05:41,760 它的页号是连续的 122 00:05:41,800 --> 00:05:45,160 我从零开始到指定的位置 123 00:05:45,200 --> 00:05:46,840 但是到物理地址空间里呢 124 00:05:46,880 --> 00:05:48,800 帧号呢它是不连续的 125 00:05:48,840 --> 00:05:55,160 我这边存到的是p1对应的是f1在这儿 126 00:05:55,200 --> 00:05:58,960 p2对应的f2在这儿 127 00:05:59,000 --> 00:06:01,960 好这两者之间这个对应怎么来进行呢 128 00:06:02,000 --> 00:06:03,680 那这就是我们说到的 129 00:06:03,720 --> 00:06:05,240 中间要有一个对应的表 130 00:06:05,280 --> 00:06:08,240 这个表呢就是页表 131 00:06:08,280 --> 00:06:10,800 好 在页表里头它怎么来做呢 132 00:06:10,840 --> 00:06:14,840 逻辑地址空间里的页号是p 133 00:06:14,880 --> 00:06:17,680 物理地址空间里的帧号是f 134 00:06:17,720 --> 00:06:19,840 这两个对应如何进行呢 135 00:06:19,880 --> 00:06:21,560 那我们通过一条指令 136 00:06:21,600 --> 00:06:24,480 执行的过程来展示它 137 00:06:24,520 --> 00:06:27,560 这是你的程序在CPU里头执行 138 00:06:27,600 --> 00:06:28,720 那执行的时候呢 139 00:06:28,760 --> 00:06:33,360 它得到的地址是表示为p o 140 00:06:33,400 --> 00:06:36,120 逻辑页号和页内偏移 141 00:06:36,160 --> 00:06:42,200 然后用这个P到页表里去找它对应的f 142 00:06:42,240 --> 00:06:45,080 这个页表保存了 143 00:06:45,120 --> 00:06:48,640 逻辑页号到物理页号之间的对应关系 144 00:06:48,680 --> 00:06:51,160 好 这个表在哪呢 145 00:06:51,200 --> 00:06:54,640 这个表 它由页表基址 146 00:06:54,680 --> 00:06:56,560 来指定它的开始位置 147 00:06:56,600 --> 00:06:59,880 然后你用页号作为你的下标 148 00:06:59,920 --> 00:07:04,720 去查这个数组就能找到相应的页表项 149 00:07:04,760 --> 00:07:07,040 那每一个页表项呢有一个固定的长度 150 00:07:07,080 --> 00:07:09,200 那这个时候呢我们在这个 151 00:07:09,240 --> 00:07:13,960 帧号呢是页表项里头的存的字段之一 152 00:07:14,000 --> 00:07:16,640 有了这个之后 我就把这F和 153 00:07:16,680 --> 00:07:19,480 你这个页内偏移和帧内偏移是一样的 154 00:07:19,520 --> 00:07:21,000 把它俩加在一起 155 00:07:21,040 --> 00:07:24,000 得到你的实际的物理地址 156 00:07:24,040 --> 00:07:25,560 那这个转换呢 157 00:07:25,600 --> 00:07:29,800 由于我们刚才说每一页的 158 00:07:29,840 --> 00:07:32,720 每帧的大小是2的n次方 159 00:07:32,760 --> 00:07:35,000 那这时候呢这俩加在一起呢 160 00:07:35,040 --> 00:07:39,120 实际上就把你的f左移S位 161 00:07:39,160 --> 00:07:43,240 把后边的这个页内偏移加在一起 162 00:07:43,280 --> 00:07:44,840 这个加法很容易做 163 00:07:44,880 --> 00:07:46,720 好 就会找到你的页号了 164 00:07:46,760 --> 00:07:46,800