ARM v8 Cortex R52内核 08 内存保护单元 Memory Protection Unit
8.1 About the MPU
Cortex R52 处理器具有两个可编程的MPU,由EL1和EL2控制。每个MPU允许将4GB内存地址划分为多个区域。
每个内存区域由基地址、限制地址、访问权限和内存属性定义。
对于数据访问,MPU检查当前转换机制是否允许对某个区域进行读取或者写入操作。对于指令访问,MPU检查访问是否在该区域允许,并且MPU检查转换机制是否允许执行。对于数据和指令的访问,如果允许访问,则MPU将分配该区域定义的内存熟悉。如果访问是不允许的,就会发送权限故障,以下原因会导致转换错误:
- 如果一个访问在MPU的多个区域中命中;
- 如果一个访问没有命中任何MPU区域,并且background区域不能被使用(基于MPU配置和当前特权等级)。
由于流水线操作的结果,处理器尝试去预测程序流和未来数据的访问情况,因此他会提前获取数据和指令在它们使用之前。除非或直到流水线完成相应指令的执行,否则这些尝试(交易)被称为投机交易。这些尝试可能会导致处理器生成超出允许范围的地址,或者没有权限进行访问。在这些例子中,通过MPU,防止了投机性访问生成总线的情况,并且也不会引发翻译或者权限错误的问题。
每一个处理器内核都有一个EL1控制的MPU区域,并且带着16,20或24个可编程区域,并且还有一个EL2控制的MPU区域,可选择支持0,16,20或24个可编程区域。当EL2控制的MPU区域和虚拟化被使能,所有使用EL0/EL1转换机制的事务都会在两个MPU中进行查找。结果属性被合并,以取得最不严格的属性。这两个保护阶段使得虚拟机监控程序能够保持对EL0/EL1转换机制的控制,并因此支持虚拟化。当软件使用EL2转换机制执行时,只使用受EL2控制的MPU。
8.2 MPU寄存器
一个区域是从基地址开始,一直延伸到包括限制地址的连续地址范围。
基地址由PRBAR(EL2控制的MPU为HPBAR)配置,限制地址由PRLAR(EL2控制的MPU为HPRLAR)配置。基地址对齐在64字节边界上,限制地址对齐在低于64字节边界的字节上。基地址和限制地址都是包含的,这意味着一个区域内的地址由以下方式给出:
PRBAR.BASE:0b000000 <= address <= PRLAR.LIMIT:0b111111
此处是 bit 连接操作符
一个区域的最小大小为64字节。
PRBAR和PRLAR还具有访问权限(PRBAR.AP)、共享性(PRBAR.SH)、不可执行位(PRBAR.XN)和内存属性索引(PRLAR.AttrIndx)。
内存属性是通过使用PRLAR.AttrIndx将Memory Attribute Indirection Registers (MAIRx)进行索引来确定的。
通过设置或清除区域使能位(PRLAR.EN),可以启用或禁用一个区域。在EL2控制的MPU中,还可以通过写入Hypervisor MPU Region Enable Register (HPRENR)来启用或禁用区域。
8.2.1 EL1-controlled MPU background region
当MPU被禁用时(SCTLR.M=0),EL1控制的MPU背景区域将作为默认的内存映射。
当MPU被启用时,可以通过设置SCTLR.BR来启用背景区域。在这种情况下,EL1翻译机制中未命中任何可编程区域的访问将使用背景区域。当MPU被启用时,EL0翻译机制的访问将导致错误。
EL1控制的MPU背景区域,指令访问。
下表显示了由EL1控制的MPU背景区域,用于指令访问。
EL1控制的MPU背景区域,数据访问。
下表显示了由EL1控制的MPU背景区域,用于数据访问。
8.2.2 EL2-controlled MPU background region
当EL2控制的MPU被禁用时(HSCTLR.M=0),EL2控制的背景区域将作为所有访问的默认内存映射。
当启用EL2控制的MPU时,可以将其用于未命中任何可编程区域的EL2访问,方法是设置背景区域使能(HSCTLR.BR=1)。当启用EL2控制的MPU时,在EL0/EL1转换体系中未命中EL2可编程区域的访问会产生一个翻译错误。这是由于两阶段翻译导致的结果。
下表显示了由EL2控制的MPU背景区域,用于指令访问。
下表显示了由EL2控制的MPU背景区域,用于数据访问。
8.2.3 默认缓存能力 Default cacheability
当启用默认缓存能力(HCR.DC=1)时,使用EL1控制的MPU后台区域的事务具有Normal、Inner Write-Back、Outer Write-Back和Non-Shareable属性,并且同时启用Read-Allocate和Write-Allocate提示。当HCR.DC=1时,在后台区域中命中的指令访问始终是可执行的。
默认属性是最宽松的,这意味着与EL2控制的MPU中的任何属性结合时,结果属性与EL2控制的MPU属性相同。这使得EL2控制的MPU能够有效地使命中后台区域的EL1转换体系下来自EL1转换体系的事务对其透明化。当HCR.DC=1时,所有来自EL0/EL1转换体系的转换都执行两阶段MPU查找,并且处理器表现得好像设置了HCR.VM一样。
8.3 Virtualization support 虚拟化支持
为了去支持虚拟化,进行了MPU查找的两个阶段。
虚拟化允许在EL1和EL0运行的进程(通常是一个或多个客户操作系统及其应用程序)由在EL2运行的进程(通常是单个hypervisor)进行管理。
EL1控制的MPU检查在EL0或EL1运行的进程中的事务,并由在EL1或EL2运行的进程进行编程。当启用虚拟化时,EL2控制的MPU还会检查从EL0/ EL1转换机制执行的事务,并由在EL2上运行的软件进行编程。只有在使用了EL2转换机制下执行的事务才会使用由EL2控制的MPU。
当虚拟化被启用(HCR.VM=1)并且EL2控制的MPU被启用(HSCTLR.M=1)时,由EL1控制的MPU允许的事务将作为两阶段查找的一部分由EL2控制的MPU进行检查。如果两个MPUs都允许该事务,则从第一阶段中获取的内存属性与第二阶段中匹配区域中的属性相结合,并应用较严格的属性集于该事务。
8.3.1 Combining MPU memory attributes 合并MPU内存属性
下表显示了内存类型分配作为两阶段查找的一部分是如何组合的。
Combining the cacheability attribute
下表显示了缓存可用性分配在两阶段查找中的组合方式。
Combining the shareability attribute
下表显示了共享性分配作为两阶段查找的一部分是如何合并的。
8.4 MPU register access
MPU的基址和限制寄存器可以通过间接或直接访问。
Indirectly
通过写入PRSELR(EL2 MPU的HPRSELR)来选择一个区域。通过写入PRBAR和PRLAR(EL2 MPU的HPRBAR和HPRLAR)来编程所选定的区域。
Directly
基址和限制寄存器,对于区域n,通过将区域编号编码到以下系统寄存器访问指令的CRm和opcode2中直接访问:
CRm = 0b1rrr, where rrr = region_number[3:1].
访问基寄存器:
op2 = 0b000, for even-numbered regions.
op2 = 0b100, for odd-numbered regions.
访问限制寄存器:
op2 = 0b001, for even-numbered regions.
op2 = 0b101, for odd-numbered regions.
写入基寄存器和限值寄存器:
PRBAR0-PRBAR15
MCR p15, 0, <Rt>, c6, CRm, op2
PRLAR0-PRLAR15
MCR p15, 0, <Rt>, c6, CRm, op2
HPRBAR0-HPRBAR15
MCR p15, 4, <Rt>, c6, CRm, op2
HPRLAR0-HPRLAR15
MCR p15, 4, <Rt>, c6, CRm, op2
PRBAR16-PRBAR24
MCR p15, 1, <Rt>, c6, CRm, op2
PRLAR16-PRLAR24
MCR p15, 1, <Rt>, c6, CRm, op2
HPRBAR16-HPRBAR24
MCR p15, 5, <Rt>, c6, CRm, op2
HPRLAR16-HPRLAR24
MCR p15, 5, <Rt>, c6, CRm, op2
读基数寄存器和极限寄存器:
PRBAR0-PRBAR15
MRC p15, 0, <Rt>, c6, CRm, op2
PRLAR0-PRLAR15
MRC p15, 0, <Rt>, c6, CRm, op2
HPRBAR0-HPRBAR15
MRC p15, 4, <Rt>, c6, CRm, op2
HPRLAR0-HPRLAR15
MRC p15, 4, <Rt>, c6, CRm, op2
PRBAR16-PRBAR24
MRC p15, 1, <Rt>, c6, CRm, op2
PRLAR16-PRLAR24
MRC p15, 1, <Rt>, c6, CRm, op2
HPRBAR16-HPRBAR24
MRC p15, 5, <Rt>, c6, CRm, op2
HPRLAR16-HPRLAR24
MRC p15, 5, <Rt>, c6, CRm, op2
8.5 MPU Register summary
以下表格是对影响MPU的寄存器进行总结。所有寄存器都可以通过(coproc==0b1111)访问。
翻译来源:
Arm® Cortex®-R52 Processor Technical Reference Manual.