快速链接:
.
👉👉👉 个人博客笔记导读目录(全部) 👈👈👈

在这里插入图片描述

★★★个人博客导读首页—点击此处 ★★★

相关文章
1、ARM架构中MMU/TLB/Cache的一些概念和寄存器
2、ARMV8-aarch64的MMU学习笔记

一、TCR寄存器

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

  • TCR_EL1 banked
  • TCR_EL2
  • TCR_EL3
    在这里插入图片描述
比特位功能说明
ORGN1、IRGN1、ORGN0、IRGN0cache属性**outer/inner cableability的属性(如直写模式、回写模式)
SH1、SH0cache的共享方式cache的共享属性配置(如non-shareable, outer/inner shareable)
TG0/TG1Granule sizeGranule 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模式
在这里插入图片描述

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐