文章目录
一、TCR寄存器
在ARM Core中(aarch64),还有几个相关的系统寄存器:
- TCR_EL1 banked
- TCR_EL2
- TCR_EL3
比特位 | 功能 | 说明 |
---|---|---|
ORGN1、IRGN1、ORGN0、IRGN0 | cache属性** | outer/inner cableability的属性(如直写模式、回写模式) |
SH1、SH0 | cache的共享方式 | cache的共享属性配置(如non-shareable, outer/inner shareable) |
TG0/TG1 | Granule size | Granule size(其实就是页面的大小,4k/16k/64k) |
IPS | 物理地址size | 物理地址size,如32bit/36bit/40bit |
EPD1、EPD0 | - | TTBR_EL1/TTBR_EL0的enable和disable |
TBI1、TBI0 | - | top addr是ignore,还是用于MTE的计算 |
A1 | - | ASID的选择,是使用TTBR_EL1中的,还是使用TTBR_EL0中的 |
AS | - | ASID是使用8bit,还是使用16bit |
(1)、T1SZ、T0SZ
- T1SZ, bits [21:16] 通过TTBR1寻址的内存区域的大小偏移量,也就是TTBR1基地址下的一级页表的大小
- T0SZ, bits [5:0]
(2)、ORGN1、IRGN1、ORGN0、IRGN0
其实可以总结为这样:
(3)、SH1、SH0
SH1, bits [29:28]
SH0, bits [13:12]
其实可以总结为这样:
Shareable的很容易理解,就是某个地址的可能被别人使用。我们在定义某个页属性的时候会给出。Non-Shareable就是只有自己使用。当然,定义成Non-Shareable不表示别人不可以用。某个地址A如果在核1上映射成Shareable,核2映射成Non-Shareable,并且两个核通过CCI400相连。那么核1在访问A的时候,总线会去监听核2,而核2访问A的时候,总线直接访问内存,不监听核1。显然这种做法是错误的。
对于Inner和Outer Shareable,有个简单的的理解,就是认为他们都是一个东西。在最近的ARM A系列处理器上上,配置处理器RTL的时候,会选择是不是把inner的传输送到ACE口上。当存在多个处理器簇或者需要双向一致性的GPU时,就需要设成送到ACE端口。这样,内部的操作,无论inner shareable还是outershareable,都会经由CCI广播到别的ACE口上。
(4)、TG0/TG1 - Granule size
(5)、IPS
(6)、EPD1、EPD0
(7)、TBI1、TBI0
(8)、A1
(10)、AS
除了以上介绍的bit之外,剩余的bit都是特有功能使用或reserved的
二、示例展示
1、设置inner/outer cache的属性(只写模式/回写模式/write allocate/No-write allocate)
如下代码所示,设置
#define TCR_IRGN_WBWA ((UL(1) << 8) | (UL(1) << 24)) //使用TTBR0和使用TTBR1时后的inner cache的属性设置
#define TCR_ORGN_WBWA ((UL(1) << 10) | (UL(1) << 26)) //使用TTBR0和使用TTBR1时后的outer cache的属性设置
#define TCR_CACHE_FLAGS TCR_IRGN_WBWA | TCR_ORGN_WBWA // inner + outer cache的属性值
ENTRY(__cpu_setup)
......
/*
* Set/prepare TCR and TTBR. We use 512GB (39-bit) address range for
* both user and kernel.
*/
ldr x10, =TCR_TxSZ(VA_BITS) | TCR_CACHE_FLAGS | TCR_SMP_FLAGS | \
TCR_TG_FLAGS | TCR_ASID16 | TCR_TBI0 | TCR_A1
tcr_set_idmap_t0sz x10, x9
......
msr tcr_el1, x10
ret // return to head.S
ENDPROC(__cpu_setup)
属性设置了1,也就是回写模式、write allocate模式