我的问题是有多快mprotect。保护 1 MB 连续内存与 1 GB 连续内存相比有何区别?我当然可以测量时间,但我想知道幕后情况。
Linux的x86-64用户虚拟地址空间为47位.这实际上意味着Linux可以映射具有大约~128 TB虚拟地址范围的进程.
然而,让我感到困惑的是x86-64架构支持每个进程的ISA定义的4级分层页表(排列为基数树).页表的根目录最多只能映射512 GB的连续虚拟地址空间.那么Linux如何支持512GB以上的虚拟地址范围呢?它是否为每个进程使用多个页表?如果是,那么对于一个进程,CR3(x86-64的寄存器包含页表基址的地址)应包含哪个给定进程?我错过了什么吗?
内存控制器的作用是什么,它们与处理器内部的 MMU 有何不同?MMU 的工作是将虚拟地址转换为物理地址(除其他外)并将此物理地址发送到向 DRAM 发送特定信号并将结果返回给 MMU 的内存控制器?或者是 MMU 的内存控制器的一部分?
据我所知,英特尔x86_64的超线程内核中没有共享MMU和TLB。
但是,如果两个不共享地址空间的线程被调度到同一物理核心,它们如何运行?
我认为,在那种情况下,线程没有任何机会达到TLB,因为线程具有自己的地址空间。
如果那样的话,我认为这种表现将被降级。
我对虚拟内存管理的操作系统和 MMU 之间的界限在哪里感到困惑。
如果MMU负责将虚拟地址转换为物理地址并且有内部页表,那么为什么操作系统也需要有页表呢?
我正在寻找 AMD 特定的性能计数器,它可以在TLB发生未命中时对页面遍历所消耗的周期进行计数。我知道英特尔有这样的指标。
但是AMD上存在这种情况吗?我查看了http://developer.amd.com/wordpress/media/2013/12/56255_OSRR-1.pdf,但没有找到任何接近我需要的内容。
我还查看了perf源代码https://elixir.bootlin.com/linux/latest/source/arch/x86/events/amd/core.c#L248它似乎也没有。
也许它有不同的名字?有什么建议么?
我有以下基于 ARM 的 SoC 规格:
我想知道什么是 PDE 缓存?我想它类似于 TLB,但我不确定。
回答
似乎 PDE(页面目录条目)是中间表遍历缓存,它确实可以与 TLB 分开实现。
Cortex-A15 MPCore 处理器实现了专用缓存,将中间级别的转换表条目存储为表遍历的一部分。
据我所知,CPU的一次内存访问涉及到CPU缓存和MMU。CPU 将尝试在缓存中找到它的目标,如果发生缓存未命中,CPU 将转向 MMU。在 MMU 访问期间,对应页表项的访问/脏位将由硬件设置。
然而,据我所知,除非出现缓存未命中,否则大多数 CPU 设计都不会触发 MMU,这里我的问题是,是否仍会在缓存命中时设置页表条目的访问/脏位?还是跟架构有关?
下图摘自ARMv8-A程序员指南:
我对突出显示的条目类型有点困惑。先说一下我目前的理解(假设EL3中的阶段1翻译,粒度为4KB的场景)。
首先,“条目”和“描述符”这个名称在这种情况下似乎是可以互换的。
然后,根据ARM ARM文档(例如图D5-6),似乎有3种类型的有效描述符:
还有几个约束(有效描述符),即:
那么回到上图,我不明白为什么还有另一个表条目用于L1和L2?因为图中的第一行已经描述了 L0/L1/L2 的表描述符。那么,即使这是另一种表描述符类型,为什么中间内容被标记为“输出块地址”(而不是“下一级表地址”)呢?
mmu ×10
cpu-cache ×3
tlb ×3
arm ×2
linux ×2
architecture ×1
armv8 ×1
c ×1
cortex-a8 ×1
hardware ×1
linux-kernel ×1
memory ×1
mmap ×1
page-tables ×1
perf ×1
performance ×1
x86 ×1
x86-64 ×1