名词解释
转换粒度(translation granule) 执行物理页和虚拟页之间转换的最小粒度(物理页大小)
内存页(Page) 内存页一般指转换粒度
内存块(block) 内存块一般指多个连续的内存页组成的一块内存,当然把一个内存页也称为内存块也是可以的
页表
目前64位架构的MMU通常使用4级页表(level 0,1,2,3),支持最大48位有效地址。页表项可以指向下一级页表(table descriptor)或者指向内存块/页(block descriptor, 下图中page descriptor也是block descriptor的一种,区别在于Page Descritpor仅表示最后一级页表的页表项),其中leve3页表只能指向内存页,level0级页表只能指向下一级页表,页表项基本结构如下图所示。
arm64可以通过配置TCR_ELx.DS支持5级页表来支持52bit物理内存
页表项各字段长度和说明如下,我们这里暂时只考虑以4KB为转换粒度并且使用48bit物理地址的情况
upper attributes占用高14位(对于table descriptor占用高12位),其和address字段之间的部分保留用于支持52bit的物理地址。
address字段占用中间36位(bit[47:12], 以4kb为粒度则地址的低12bit均为0,无需存放,因此address为实际48位物理地址的高36位),如果我们使用大内存页(即转换使用的最后一级页表<3),则address字段的低位字节将被忽略,具体来说,如果使用level 2级别页表作为最后一级,其一个页表项指向2MB的内存页,因此address字段中低9bit被忽略;如果使用level 1级别页表最为最后一级页表,其一个页表项指向1GB内存,,因此address字段低18bit将被忽略。
lower attribute占用bit[11:2],bit[1]表示该页表项的类型(0表示block descriptor,指向最终内存块;1表示table descriptor,指向下一级页表),bit[0]表示该表项是否有效(0表示该表项无效,1表示该表项有效),关于upper attributes和lower attribute,见页表项属性小节。
参考Arm® Architecture Reference Manual for Armv8(G.a) 2717页
页表项属性
Block descriptor
Lower attributes
字段 | 名称 | 说明 |
---|---|---|
bit[11] | nG (not Global) | 表示该页表项是全局的还是进程特定的,用于TLB刷新管理 |
bit[10] | AF (Access Flag) | 表示该页表项是否访问,如果设置为0,则在试图加载该页表项到TLB时会触发异常,需要将其设置为1才能正常加载到TLB中,可以使用该位来管理正在使用的内存页以便于在内存不足时换出未使用的内存页。 |
bit[7:6] | AP (Access Permission) | 表示数据访问权限(指令访问权限(即执行权限)位于upper attributes 中) |
bit[4:2] | AttrIndx | 内存属性索引,代表MAIR 寄存器中存储的第AttrIndx 个内存属性 |
下表为AP
字段的值以及对应的权限说明
AP[2:1] | Access from higher Exception level | Access from EL0 |
---|---|---|
0b00 | Read/write | None |
0b01 | Read/write | Read/write |
0b10 | Read-only | None |
0b11 | Read-only | Read-only
|
参考Arm® Architecture Reference Manual for Armv8(G.a) 2727页
MAIR寄存器
Attr
Attr | 说明 |
---|---|
0b0000dd00 | 外设内存(MMIO),dd 的值以及对应的含义见下表 |
0b0000dd01 | 与FEAT_XS有关,暂不讨论 |
0b0000dd1x | 无效值 |
0bqqqqiiii (qqqq != 0000并且iiii != 0000) | 普通内存,qqqq 和iiii 的值以及对应的含义见下表 |
0b01000000 | 与FEAT_XS有关,暂不讨论 |
0b10100000 | 与FEAT_XS有关,暂不讨论 |
0b11110000 | 与FEAT_MTE2有关,暂不讨论 |
0bxxxx0000 (xxxx != 0000,0100,1010,1111) | 无效值 |
外设内存MMIO
dd | 说明 |
---|---|
0b00 | Device-nGnRnE memory |
0b01 | Device-nGnRE memory |
0b10 | Device-nGRE memory |
0b11 | Device-GRE memory |
关于G、R、E的说明如下
(1)Gathering 或者non Gathering (G or nG)。这个特性表示对多个memory的访问是否可以合并,如果是nG,表示处理器必须严格按照代码中内存访问来进行,不能把两次访问合并成一次。例如:代码中有2次对同样的一个地址的读访问,那么处理器必须严格进行两次read transaction。
(2)Re-ordering (R or nR)。这个特性用来表示是否允许处理器对内存访问指令进行重排。nR表示必须严格执行program order。
(3)Early Write Acknowledgement (E or nE)。PE访问memory是有问有答的(更专业的术语叫做transaction),对于write而言,PE需要write ack操作以便确定完成一个write transaction。为了加快写的速度,系统的中间环节可能会设定一些write buffer。nE表示写操作的ack必须来自最终的目的地而不是中间的write buffer。
普通内存
qqqq | 说明 |
---|---|
0b00RW | Outer Write-Through Transient |
0b0100 | Outer Non-cacheable |
0b01RW | Outer Write-Back Transient |
0b10RW | Outer Write-Through Non-transient |
0b11RW | Outer Write-Back Non-transient |
iiii | 说明 |
---|---|
0b00RW | Inner Write-Through Transient |
0b0100 | Inner Non-cacheable |
0b01RW | Inner Write-Back Transient |
0b10RW | Inner Write-Through Non-transient |
0b11RW | Inner Write-Back Non-transient |
R表示Read-Allocate policy, W表示Write-Allocate policy
R or W | 说明 |
---|---|
0b0 | Not allocate,进行读或者写操作时不分配cache内的空间,即不将数据载入cache |
0b1 | Allocate,进行读或者写操作时分配cache内的空间,即将数据载入cache |
Transient表示该块内存使用时间很短,特定的架构实现可以利用该属性来优化cache管理
Inner和Outer是用于维护一致性时定义的共享域,具体共享域的划分和特定的架构实现有关
关于cache策略等详细内容参考Arm® Architecture Reference Manual for Armv8(G.a) D4.4.3节 2620页
参考Arm® Architecture Reference Manual for Armv8(G.a) D13.2.95节 3512页
Upper attributes
字段 | 名称 | 说明 |
---|---|---|
bit[54] | UXN/XN (Unprivileged eXecution Never) | 该bit为1表示禁止非特权级运行模式执行该内存页的代码(用户态代码执行控制) 为0表示允许非特权级运行模式执行该内存页的代码 |
bit[10] | PXN (Privileged eXecution Never) | 该bit为1表示禁止特权级运行模式执行该内存页代码(内核态代码执行控制) 为0表示允许非特权级运行模式执行该内存页的代码 |
Table Descriptor
字段 | 名称 | 说明 |
---|---|---|
bit[62:61] | AP Table | 设置对应的下级页表映射的所有内存页的数据访问权限(AP) |
bit[60] | UXN Table/XN Table | 设置下级页表映射的所有内存页的用户非特权级执行权限(UXN/XN) |
bit[59] | PXN Table | 设置下级页表映射的所有内存页的特权级执行权限(PXN) |
配置虚拟内存地址长度
通过设置TCR_ELx.T0SZ
可以配置TTBR0_ELx
使用的虚拟内存地址最大长度,最大长度为64 - TCR_ELx.T0SZ
,设置TCR_ELx.T1SZ
则可以用相同的方式配置TTBR1_ELx
使用的虚拟内存最大长度。通过配置虚拟内存的最大长度可以减少使用的页表级别(调整转换起始页表级别),例如配置虚拟地址最大长度为<=39bits时从level 1页表开始执行地址转换(即TTBR
寄存器中设置level 1级别的页表),当虚拟地址最大长度<=30bits时,从level 2页表开始执行地址转换。下图描述了设置不同的地址长度对有效地址的影响。
通常有效的48bit用户空间地址(TTBR0
)从0
到0x0000_FFFF_FFFF_FFFF
,有效的的内核空间地址(TTBR1
)从0xFFFF_0000_0000_0000
,当地址小于48bit时,以39bit为例,用户空间地址高25bit必须为0,而内核空间的高25bit必须为1采用有效的地址。
参考Arm® Architecture Reference Manual for Armv8(G.a) 2701页