本帖最后由 lemonboard 于 2023-12-11 09:24 编辑
有幸参加《奔跑吧!Linux内核》的读书活动。我是潜水多年的一名电子工程师。拿到这本书有些时间了,坦白讲,书挺厚的,阅读的压力蛮大的。今天是第一篇,我给大家分享的主题是内存管理的预备知识。“ARM64内存管理都有什么?”
在移动端,嵌入式领域,以ARM公司为内核的处理器占了绝对的地位,本书也是选用ARM64为硬件内核进行讲解。
**内存框图**
ARM64的内存管理框图如下图所示:
箭头方向也代表了内存对页查询的操作方向。包括了:MMU,高速缓存,主存储器中的页表。其中,MMU还包括TLB与页表遍历单元。本次文中提到的内存管理指系统软件层面的实现方案,因此主存中仅包括了“页表”部分,其余硬件部分由硬件控制则省略了。
**页表**
由于操作系统的架构实现下,存在虚拟地址(VA)与物理地址(PA)之分,页表则也会设计成这种对应关系。这里要注意一下 ,ARMv8架构还支持4KB,16KB,64KB这3种页面颗粒度。
**页表映射**
在AARM64架构中,地址总线有最多48位,且被划分为两个空间,每个空间最多256TB的寻址范围。两个空间使用寄存器TTBR0和TTBR1来存放基地址。
P.S.为什么是48位,而不是64位?书中也谈到了,主要还是成本!48根线就够乱了,64根岂不是……再看48位寻址范围256TB也够用了。
上面这张图是地址映射在Aarch64架构下的映射,在Linux内核中页表也是相似的。
作者在QEMU虚拟机吗,ARM64架构的Linux5.0内核的内存分布。
我们再总结一下内存分布:
**高速缓存管理**
ARM64指令集提供了对高速缓存进行管理的指令,包括管理无效高速缓存和清除高速缓存的指令。
ARMv8架构中最多可以支持L1-L7高速缓存。将从以下角度观察内存:
- 全局缓存一致性角度。这个观察点就是L2高速缓存,因为两个处理器都可以在L2高速缓存中看到相同的副本。
- 处理器缓存一致性角度。这个观察点就是DDR4内存,因为CPU和GPU都能共同访问DDR4内存。
**TLB管理**
TLB是高速缓存的一种,把虚拟地址到物理地址翻译的结果存储在TLB表项中。我也支持其称为快表,当处理器需要访问内存时首先从TLB中查询是否有对应的表项,当TLB命中时,处理器就不需要到MMU中查询页表了。