Linux Support for ARM LPAE 分析

来源:互联网 发布:java构造方法修饰符 编辑:程序博客网 时间:2024/06/06 10:57


介绍

 

        早期的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 标示的内核空间的映射(这是arm结构的一种建议,但实际使用中,由于arm(armv7-A & armv7-R)只支持最大区分管理的空间为(0x80000000以下由TTBR0管理,以上由TTBR1管理),这与linux想要的0xC0000000做为分隔不同,所以用户空间和内核空间都用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 的限制

 

           

 

 

 

 

 

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种内存类型.


 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

微笑

 

 

 

 

 


原创粉丝点击