Memory 内存分页和TLB

Memory 内存分页和TLB,memory,paging,tlb,mmu,Memory,Paging,Tlb,Mmu,我对下面的任务有疑问 考虑一个IA-32系统,其中MMU支持两级页面表。第二 级别包含映射到4KB页面帧的1024个页面表项。每页表格 条目(两个级别)的大小为4字节。系统仅支持4KB的页面大小。 我们希望从虚拟内存中连续读取8MB,从字节0开始。我们一次读一个字(4字节) 我们有一个8个条目的数据TLB。需要多少内存访问才能访问 是否读取上面指定的8MB内存 如果TLB有4个条目而不是8个条目,这会有区别吗 所以,我们按顺序阅读。这意味着8MB/4B=2M内存访问。我们有一个两层的表格。因

我对下面的任务有疑问

考虑一个IA-32系统,其中MMU支持两级页面表。第二 级别包含映射到4KB页面帧的1024个页面表项。每页表格 条目(两个级别)的大小为4字节。系统仅支持4KB的页面大小。
我们希望从虚拟内存中连续读取8MB,从字节0开始。我们一次读一个字(4字节)
我们有一个8个条目的数据TLB。需要多少内存访问才能访问 是否读取上面指定的8MB内存

如果TLB有4个条目而不是8个条目,这会有区别吗

所以,我们按顺序阅读。这意味着8MB/4B=2M内存访问。我们有一个两层的表格。因此,在没有TLB的情况下,2M+2*2M=6M内存访问

但我不知道如何计算包括TLB在内的内存访问


谁能给我解释一下吗?这将非常有帮助。

因为访问模式是流式访问,所以每个TLB条目将用于对整个页面的每四个字节进行一次访问,并且永远不会重复使用。这意味着每个TLB条目将重复使用1023次,因此每页将避免1023次查找(2046次内存访问)。(由于不同翻译的使用没有重叠,只有完全本地化的重用,因此单条目数据TLB的性能甚至与2048条目TLB相当。)

考虑以下对两项直接映射数据TLB发生的情况的描述(认识到TLB忽略了页内偏移量的虚拟地址的最低有效12位,并且虚拟地址的一位用于索引到TLB):

每个页面按顺序被引用1024次(每个四字节元素一次),然后再也不会被引用


(现在考虑一个具有四个TLB条目和两个条目缓存页面目录条目的设计(每个页面都有指向页面表条目的页面)。每个缓存的PDE将被重用1023个页面查找,将它们减少到一个内存访问。[如果8 MiB流式访问作为一个内部循环重复,并且与4 MiB对齐,则两个条目的PDE缓存将在第一次迭代后完全预热,所有后续的页表查找将只需要一个内存引用。]

“系统…既不包含TLB,…”,然后是“我们有一个8个条目的数据TLB”使这个问题变得不一致,也不是很容易回答…在第一种情况下,没有TLB,而第二种情况是TLB…Sry,我会纠正它,所以,它完成了。Sry,再次。您的解决方案等于标准解决方案。标准解决方案说,对于每1024个内存访问,我们需要重新填充TLB条目,需要两个2内存y访问。但是,注释还是很清楚。你可以再解释一遍吗?TLB保存了什么?我们只有8个条目。我看不出你使用这8个条目的原因。是否正确,外部页面表包含1024个条目,外部表作为内部表的目录?内部表包含1024个条目?它是sti“我不太清楚。@user2965601添加了跟踪摘要帮助吗?虽然页面表的每一级都包含1024个条目是正确的,但这对于您的特定问题并不重要,因为它不缓存PDE,因此TLB未命中必须首先获取PDE,然后获取PTE。”。(x86的PAE和x86-64使用64位条目,因此每个级别只有512个条目[PAE的基表只有四个条目支持具有3个表级别和4个KiB页的32位虚拟地址空间]。)在这种情况下,TLB结构是什么样子的?我的意思是,它包含什么,就像只包含第二个页面的条目或两个页面的条目一样?@user2965601示例2-entry TLB将包含前一个页面和当前使用的页面的翻译(当然,在循环开始时,假设它包含不相关的翻译除外)。当当前页面翻译加载到TLB中时,当前页面翻译前两页的页面翻译将被强制移出TLB。(对于N条目TLB[N
load 0x0100_0000; // TLB entry 0 tag != 0x0800 (page # 0x0_1000) [miss]
                  // 2 memory accesses to fill TLB entry 0
load 0x0100_0004; // TLB entry 0 tag == 0x0800 [hit]
load 0x0100_0008; // TLB entry 0 tag == 0x0800 [hit]
...               // 1020 TLB hits in TLB entry 0
load 0x0100_0ffc; // TLB entry 0 tag == 0x0800 [hit]; last word in page
load 0x0100_1000; // TLB entry 1 tag != 0x0800 (page # 0x0_1001) [miss]
                  // 2 memory accesses to fill TLB entry 1
load 0x0100_1004; // TLB entry 1 tag == 0x0800 [hit]
load 0x0100_1008; // TLB entry 1 tag == 0x0800 [hit]
...               // 1020 TLB hits in TLB entry 1
load 0x0100_1ffc; // TLB entry 1 tag == 0x0800 [hit]; last word in page
load 0x0100_2000; // TLB entry 0 tag (0x0800) != 0x0801 (page # 0x0_1002) [miss]
                  // 2 memory accesses to fill TLB entry 0
load 0x0100_2004; // TLB entry 0 tag == 0x0801 [hit]
load 0x0100_2008; // TLB entry 0 tag == 0x0801 [hit]
...               // 1020 TLB hits in TLB entry 0
load 0x0100_2ffc; // TLB entry 0 tag == 0x0801 [hit]; last word in page
load 0x0100_3000; // TLB entry 1 tag (0x0800) != 0x0801 (page # 0x0_1003) [miss)
                  // 2 memory accesses to fill TLB entry 1
load 0x0100_3004; // TLB entry 1 tag  == 0x0801 [hit]
load 0x0100_3008; // TLB entry 1 tag  == 0x0801 [hit]
...               // 1020 TLB hits in TLB entry 1
load 0x0100_3ffc; // TLB entry 1 tag  == 0x0801 [hit]; last word in page
...               // repeat the above 510 times
                  // then the last 4 pages of the 8 MiB stream
load 0x017f_c000; // TLB entry 0 tag (0x0bfd) != 0x0bfe (page # 0x0_17fc) [miss]
                  // 2 memory accesses to fill TLB entry 0
load 0x017f_c004; // TLB entry 0 tag == 0x0bfe [hit]
load 0x017f_c008; // TLB entry 0 tag == 0x0bfe [hit]
...               // 1020 TLB hits in TLB entry 0
load 0x017f_cffc; // TLB entry 0 tag == 0x0bfe [hit]; last word in page
load 0x017f_d000; // TLB entry 1 tag (0x0bfd) != 0x0bfe (page # 0x0_17fd) [miss]
                  // 2 memory accesses to fill TLB entry 1
load 0x017f_d004; // TLB entry 1 tag == 0x0bfe [hit]
load 0x017f_d008; // TLB entry 1 tag == 0x0bfe [hit]
...               // 1020 TLB hits in TLB entry 1
load 0x017f_dffc; // TLB entry 1 tag == 0x0bfe [hit]; last word in page
load 0x017f_e000; // TLB entry 0 tag (0x0bfe) != 0x0bff (page # 0x0_17fe) [miss]
                  // 2 memory accesses to fill TLB entry 0
load 0x017f_e004; // TLB entry 0 tag == 0x0bff [hit]
load 0x017f_e008; // TLB entry 0 tag == 0x0bff [hit]
...               // 1020 TLB hits in TLB entry 0
load 0x017f_effc; // TLB entry 0 tag == 0x0bff [hit]; last word in page
load 0x017f_f000; // TLB entry 1 tag (0x0bfe) != 0x0bff (page # 0x0_17ff) [miss]
                  // 2 memory accesses to fill TLB entry 1
load 0x017f_f004; // TLB entry 1 tag  == 0x0bff [hit]
load 0x017f_f008; // TLB entry 1 tag  == 0x0bff [hit]
...               // 1020 TLB hits in TLB entry 1
load 0x017f_fffc; // TLB entry 1 tag  == 0x0bff [hit]; last word in page