C 缓存控制器一次从主存到二级缓存获取多少字节?

C 缓存控制器一次从主存到二级缓存获取多少字节?,c,caching,memory,operating-system,C,Caching,Memory,Operating System,我刚刚读了两篇关于这个主题的文章,它们提供的信息不一致,所以我想知道哪一篇是正确的。也许两者都是正确的,但在什么背景下 其中一个声明我们一次获取一个页面大小 高速缓存控制器始终观察正在加载的内存位置,并在刚刚读取的内存位置之后从多个内存位置加载数据 举一个真实的例子,如果CPU加载了存储在地址1000中的数据,缓存控制器将从地址1000后的“n”地址加载数据。这个数字“n”称为页面;如果给定处理器使用4KB页面(这是一个典型值),它将从正在加载的当前内存位置(在我们的示例中为地址1000)下方的

我刚刚读了两篇关于这个主题的文章,它们提供的信息不一致,所以我想知道哪一篇是正确的。也许两者都是正确的,但在什么背景下

其中一个声明我们一次获取一个页面大小

高速缓存控制器始终观察正在加载的内存位置,并在刚刚读取的内存位置之后从多个内存位置加载数据

举一个真实的例子,如果CPU加载了存储在地址1000中的数据,缓存控制器将从地址1000后的“n”地址加载数据。这个数字“n”称为页面;如果给定处理器使用4KB页面(这是一个典型值),它将从正在加载的当前内存位置(在我们的示例中为地址1000)下方的4096个地址加载数据。在下图中,我们演示了这个示例

其中一个声明我们一次获取sizeof(缓存线)+sizeof(预取器)

因此,我们可以将内存缓存的工作原理总结为:

  • CPU请求存储在地址“a”中的指令/数据
  • 由于地址“a”中的内容不在内存缓存中,因此CPU必须获取它 直接从RAM
  • 高速缓存控制器将从地址“a”开始的一行(通常为64字节)加载到内存中 缓存。这比CPU请求的数据多,因此如果程序继续按顺序运行 (即请求地址a+1)CPU将请求的下一条指令/数据将已加载到 内存缓存
  • 一个称为预取器的电路加载位于该行之后的更多数据,即开始加载内容 从地址a+64进入缓存。给你一个真实的例子,奔腾4 CPU有一个256字节 预取器,因此它将在缓存中加载行之后加载下一个256字节

  • 完全依赖于硬件实现。一些实现一次从主内存加载一行,不同处理器之间的缓存线大小差异很大。我看到的缓存线大小从64字节一直到256字节。基本上“缓存线”的大小是多少这意味着,当CPU从主RAM请求内存时,它一次会请求n个字节。因此,如果n是64个字节,并且您在0x1004加载一个4字节的整数,MMU实际上会通过总线发送64个字节,即从0x1000到0x1040的所有地址。整个数据块将作为一行存储在数据缓存中

    一些MMU可以通过总线为每个请求获取多条缓存线——因此,在具有64字节缓存的计算机上,在地址0x1000处发出请求时,实际上会加载从0x1000到0x1100的四条缓存线。让您使用特殊缓存预取或DMA操作码显式执行此操作

    然而,通过你的第一个链接的文章是完全错误的。它混淆了操作系统和硬件的大小。这是完全不同的概念。第一个是操作系统将立即分配的虚拟地址空间的最小大小。后者是CPU如何与主RAM通信的细节

    它们之间的相似之处在于,当操作系统的物理内存不足时,它会将一些最近未使用的虚拟内存分页到磁盘;然后,当您再次使用该内存时,操作系统会将整个页面从磁盘加载回物理RAM。这是类似的(但不相关)CPU从RAM加载字节的方式,这就是《硬件机密》的作者感到困惑的原因


    了解所有关于计算机内存以及缓存为何以这种方式工作的一个好地方是Ulrich Drepper的论文。

    它不能是一个完整的页面。当前的处理器在32位模式下可以支持高达4 MB的页面,在64位模式下支持1 GB的页面。+1用于链接到Drepper的内存论文。但是,页面大小肯定是硬件功能和OS c不能为其选择任意值(例如,查找页表的工作方式)@janneb这个答案似乎不适合讨论缓存获取、d-ERAT页面大小、TLB大小和软件VMEM表大小之间的差异。但长话短说,许多实现都允许TLB中的页面大小可变。我桌上有一个设备,允许将内存分配为4kb、64kb或4mb页面。当然可以ot,但现在看来,通过阅读您的答案,您可能会错误地理解内存页只是操作系统实现的一个细节,而实际上它与硬件如何进行虚拟->物理地址查找密切相关。