【转载】aarch64的TCR寄存器介绍



版权声明:本文为CSDN博主「代码改变世界ctw」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_42135087/article/details/109057232

寄存器

在ARM Core中(aarch64),还有几个相关的系统寄存器:

  • TCR_EL1 banked
  • TCR_EL2
  • TCR_EL3
比特位功能

说明

DS 52 bis PA

FEAT_LPA2 特性下,使用4K 或16K 页,

DS == 1时,

Bits[49:48] of translation descriptors hold output address[49:48]

Bits[9:8] of Translation table descriptors hold output address[51:50].

DS == 0时

output address [51:48] == 0b0000

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模式
在这里插入图片描述

2022-03-06 增加 DS 位 描述