【问题标题】:How is memory loaded from virtual memory?如何从虚拟内存中加载内存?
【发布时间】:2020-07-11 16:34:16
【问题描述】:

我知道操作系统通常会保留Page Tables 以将一块虚拟内存映射到一块物理内存。

我的问题是,CPU 在加载给定字节时会加载整个块吗?

可以说我有: ld %r0, 0x4(%r1)

假设我的页面大小是4 KB,CPU 是一次加载全部 4KB 还是设法 正确加载给定偏移量的字节?

page size 是硬件强制要求还是软件和操作系统可配置?

编辑:

认为page size 是由硬件强制执行的:

可用页面大小取决于指令集架构、处理器类型和操作(寻址)模式。操作系统从架构支持的大小中选择一种或多种大小

【问题讨论】:

    标签: memory memory-management paging


    【解决方案1】:

    您的问题涉及许多级别的 cpu/内存架构......不知道您想到的确切 cpu 架构/内存架构/版本:虽然 cpu 命令只针对一个字节,但它会触发内存-控制器定位整个物理页面并将该页面(至少,预取可能启动)完全加载到二级/一级缓存。您的数据在填充缓存后传输。

    【讨论】:

      【解决方案2】:

      在典型的现代 CPU 上,是的,它会加载整个页面。

      它实际上无法以任何其他方式工作,因为给定页面的页表中只有两种状态:存在和不存在。如果页面存在,它必须映射到物理内存中的某个页面。如果不存在,则对该页面的每次访问都会产生页面错误。没有“部分存在”状态。

      为了让操作系统安全地标记页面存在,它必须将整个页面加载到物理内存中并更新页表以将虚拟页面指向物理页面。如果它只加载了一个字节或更少量,应用程序可能稍后会尝试访问同一页面上尚未加载的其他字节,并且它会读取垃圾。在这种情况下,CPU 无法生成另一个页面错误来让操作系统修复问题,除非页面被标记为不存在,在这种情况下,原始访问也无法完成。

      页面大小在硬件中是固定的,尽管某些架构提供了一些不同的选项供操作系统选择。例如,最近的 x86-64 CPU 允许页面为 4 KB、2 MB 或 1 GB。操作系统可以在运行时混合和匹配这些;页表中有位来指示每一页的大小。

      【讨论】:

      • 所以数据也从硬盘加载到内存中,页面也正确吗?现在还有2个问题。 chad line 是如何出现在这里的?我认为 CPU 也会根据缓存线的大小从内存中获取数据。第二个问题是,它如何将数据存储回内存中?再次根据页面大小?
      • @Dan:我的答案是关于如何将页面从磁盘加载到主内存中。您是正确的,页面的全部或部分也可能位于一个或多个级别的缓存中,但这纯粹是硬件问题,操作系统通常与它无关。
      • @Dan:如果操作系统希望通过将页面写入磁盘并将其从物理内存中逐出来“换出”页面,则它必须再次写出整个页面并将其标记为不存在于页表。然后它可以将物理内存的页面用于其他用途。如果页面在读入后没有被修改(如果是,硬件会设置一个“脏”位),那么可以跳过写操作。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-17
      • 2011-02-27
      相关资源
      最近更新 更多