Linux Support for ARM LPAE 分析

https://blog.****.net/duanlove/article/details/16986133

介绍

    早期的ARM系统仅需要MB级别的RAM,但是,随着设备的升级,现在更多复杂的智能手机设备 需要 百M甚至GB级别的RAM,而32bit的物理地址空间就显得捉襟见肘了。

更让人紧张的是,这些地址空间不仅仅是RAM占用了,还有 外设、FLASH存储器以及系统ROM也占用了部分地址空间。

     新兴起的 移动虚拟化 需要更多是RAM,当然在 Guest OS级别一般来说是不需要这么多的。 ARM LPAE 对linux系统的开发提供了这方面的支持。第一个linux上对LPAE的支持是是在 2010年十月份,发布在LKML(https://lkml.org/)上的。LKML全称是 Linux Kernel Mailing List ,中文 linux 内核邮件列表。它是专门维护linux 内核的一个组织。

经典ARM MMU 与支持LPAE的比较

经典的ARM MMU特性如下:

    32bit的物理地址空间。

    2级页表转换。

               1.  通过TTBR0标示的 用户空间的映射; 以及TTBR1 标示的内核空间的映射。但是对于 内核空间和user空间的内存是严格限制的。

               2. 32bit 的页表项( table entres: 页表项,或者说 页表条目)。

    1级页表八婆韩4096个页表项(4 pages for PGD)。

              1.  每个页表项可以映射为 1MB的段(section)。

              2.  每个页表项可以指向 二级页表。

              3.  实现已定义的 16MB supersections。

   二级页表包含256个条目,每个条目指向4KB的页。  每个二级页表1KB 。

传统的ARM MMU 的限制
Linux Support for ARM LPAE 分析

ARM PLAE的特性:

40bit的物理地址(1TB)

40bit的中间物理地址(1TB)空间(Guest 物理地址空间)

三级页表转换

1. TTBR0寄存器用作用户空间的映射,TTBR1用作kernel空间的映射。
    具备1GB的内核空间映射,不适用一级页表。
2. 每个级别有64bit的页表项

一级页表包含4个页表项(stage1 转换)

1GB的段 或者 指向二级页表。

二级页表包含512个条目(所有的条目总共占4KB的存储空间)

1. 2MB的段, 或者指向三级页表。

三级页表包含512个条目。

1. 每个条目映射4KB范围的地址。
2. 可以为连续的页表 设置 contiguity flag(一系列连续的flag) 。

LDRD/STRD (64bit 的load/store) 指令是ARM处理器用于支持LPAE的原子性指令。即指令执行过程中是不可能中断的。

仅仅支持简单的页表权限模型。

1. 没有内核读写 和 用户控件只读 的权限组合.

Domains (域)已经不复存在。(他们在ARMv7部分的linux里已经被移除了)

另外有额外的bit位提供给OS使用.

专用的bit位提供给 用户控件, 比如 只读 和访问标志设置.

ASID 是TTBR0寄存器的一部分.

1. 简单的上下文切换代码. 不需要去处理预测的TLB, 去获取错误的ASID.
2. Context ID寄存器可以被专门用来调试或者trace.

另外的权限控制

1. PXN - privilege execute never (非特权执行)
2. SCTLR.WXN, SCTLR.UWXN - 防止从可以写的地址空间执行(仅用于用户空间的访问)。
3. APTable - 在子页表级别里用来限制权限
4. XNTable ,PXNTable - 在子页表级别 复写掉XN 和PXN bit位

用于内存区域属性的新寄存器.

1. MAIR0, MAIR1 - 32bit的内存属性的间接寄存器.
2. 可以同时配置8种内存类型.

Linux Support for ARM LPAE 分析
Linux Support for ARM LPAE 分析Linux Support for ARM LPAE 分析

Linux Support for ARM LPAE 分析

Linux Support for ARM LPAE 分析
Linux Support for ARM LPAE 分析Linux Support for ARM LPAE 分析

Linux Support for ARM LPAE 分析
Linux Support for ARM LPAE 分析
Linux Support for ARM LPAE 分析Linux Support for ARM LPAE 分析
Linux Support for ARM LPAE 分析Linux Support for ARM LPAE 分析
Linux Support for ARM LPAE 分析Linux Support for ARM LPAE 分析Linux Support for ARM LPAE 分析Linux Support for ARM LPAE 分析Linux Support for ARM LPAE 分析
Linux Support for ARM LPAE 分析

微笑