linux内存管理 (二) 3.2 硬件 CP15系统控制协处理器的寄存器描述

寄存器总览

在这里插入图片描述在这里插入图片描述

寄存器分类
  • @Register 1 :ID codes

  • @Register 2 :Control registers

  • @Register 2 3 4 5 6、8、10和13被分配给 VMSA/PMSA。

  • @Register 7 和 @Register 9 被分配给缓存和写缓冲区和 TCM 的控制。

  • @Register 11 被分配到 L1 DMA支持。

  • @Register 15 保留用于实现定义的目的。

    • 有关本寄存器中的详细信息,请参阅相应的 TRM 或其他具体文件。
  • @Register 12 和 @Register 14 被保留以供将来扩展。

    • ARMv6中未定义,访问(读或写)这些寄存器中的任何一个都是不可预测的
寄存器详细描述
  • #Register 0 : ID codes

描述
	CP15寄存器0 包含1个主寄存器,多个副寄存器.(通过opcode2标识)用于包含用于ARM和系统实现的一个或多个标识码。
		0b000 : Main ID 
		0b001 : Cache type
		0b010 : Tightly Coupled Memory (TCM) type
		0b011 : TLB type
		0b100 : MPU type

读
	读取该寄存器时,MRC指令的opcode2字段选择所需的标识码
		如果遇到与未实现或保留的ID寄存器相对应的<opcode2>值,系统控制协处理器将返回主ID寄存器的值。

	且 CRm字段必须指定为c0(如果不是,则指令不可预测)

	非 Main ID寄存器的值 不能等于 Main ID寄存器的值。软件可以通过读取主ID寄存器和所需寄存器并比较它们的值来确定它们是否存在.如果两个值不相等,所需的寄存器存在。
	MRC p15,0,Rd,c0,c0,<opcode2>;

写
	写入CP15寄存器0是不可预测的。


寄存器0 : 主寄存器
	MRC p15,0,R1,c0,c0,0; // 读到R1中
	当使用<opcode2>==0读取CP15寄存器0时,将返回一个标识码,从该标识码中可以确定ARM体系结构版本号,以及是否已实现Thumb®指令集。
	
	谁定义了 主寄存器的 字段
	注意,CP15寄存器0中的一些字段是在体系结构[31:24]上定义的,其余的是实现定义的
	这里并提供了关于确切的处理器变量的更详细的信息。有关每个处理器使用的精确识别码,请参阅各个数据表。
		实现者代码
		主ID寄存器的位[31:24]包含实现器代码。定义了以下代码(架构代码的所有其他值由ARM有限公司保留):
			0x41 A(限臂)
			0x44 D(数字设备公司)
			0x4D M(摩托罗拉飞思卡尔半导体公司)
			0x56 V(惊奇半导体公司)
			0x69 i(英特尔公司)

	如果[31:24]0x41, 表示剩余的字段是arm定义的
	
	ARM处理器实现ID	
	如果位[19]为零,则位[15:12]应解释为:
		•如果它们是0x0,这表示一个过时的部件(pre-ARMv4架构)
		•如果是0x7,则表示处理器属于ARM7系列,请参考 ARM7处理器ID解释
		•如果不等于0x7,则涉及比ARM7更新的处理器系列。请参考 ARM7之后的处理器ID解释

		ARM7处理器ID解释
			位[3:0]包含处理器的实现定义的修订号。
			位[15:4]包含处理器的主要部件号的实现定义表示。这个数字的前四位是0x7。
			位[22:16]包含实现定义的变量号。
			位[23]指示涉及基于ARM7的进程的两种可能体系结构中的哪一种:0体系结构3(过时的部分)1体系结构4T。
			位[31:24]  0x41=A ARM实现代码。
			位[23:0] 自ARM7以来的处理器实现具有通用的位格式[23:0],这在ARM和体系结构许可证持有者的实现中是常见的。根据位[19]的值,定义了两种通用格式。以下各节将对它们进行说明。
		ARM7之后的处理器ID解释
			位[3:0]包含处理器的实现定义的修订号。
			位[15:4]包含处理器的主要部件号的实现定义表示。此数字的前四位不允许为0x00x7。
			位[19:16]包含架构代码。定义了以下架构(architecture)代码:
				0x1 ARM架构v4 
				0x2 ARM架构v4T 
				0x3 ARM架构v5 
				0x4 ARM架构v5T 
				0x5 ARM架构v5TE 
				0x6 ARM架构v5TEJ 
				0x7 ARM架构v6 
				0xF 修订的CPUID格式。详情可从ARM获得。
				体系结构代码的所有其他值由ARM限制
			位[23:20]保留,包含实现定义的变量号。这通常用于区分同一主部件的两个变体,例如,两个不同的缓存大小变体。
			位[31:24]包含实现程序代码。参见B3-8-8页上的实现程序代码

寄存器1 : cache type register

	MRC p15,0,R1,c0,c0,1; // 读到R1中

	缓存类型寄存器提供有关缓存的以下详细信息:
		•是统一缓存还是单独的指令和数据缓存
		•尺寸、线长和关联性
		•是直写缓存还是回写缓存
		•缓存清理和锁定功能。
	缓存类型寄存器的格式为:
		S
			指定高速缓存是统一高速缓存(S==0),还是单独的指令和数据高速缓存(S==1)。
			如果S==0,则Isize和Dsize字段都描述统一缓存,并且必须相同。
		ctype
			指定未由S位以及Dsize和Isize字段指定的缓存的详细信息。表中未指定的所有值都保留以供将来扩展。
		Isize
			指定指令缓存的大小、行长度和关联性,如果S==0,则指定统一缓存的大小、行长度和关联性。
		Dsize // 缓存类型寄存器中的Dsize(bit[11:0])和Isize[23:12]字段具有相同的格式
			指定数据缓存的大小、行长度和关联性,如果S==0,则指定统一缓存的大小、行长度和关联性。

			bit[11](P位)表示虚拟地址的位[13:12]的页分配是否存在限制:
				0不应用限制
				1限制,请参阅第B6-11页的页表映射限制。
			bit[10]
				保留用于将来的扩展。
			bit[9:6](size)和bit[2](M)
				缓存大小
			bit[5:3](assoc)和bit[2](M)
				缓存的关联性
			bit[1:0](len)
				缓存的行长度

	缓存相关值的计算

		Cache size = ASSOCIATIVITY × NSETS × LINELEN
		= NWAYS × NSETS × LINELEN
		= NWAYS × 2^S × 2^L bytes

		当缓存存在时(即assoc==0b000,M==1),可以使用以下公式来确定上面公式中定义的值LINELEN、ASSOCIATIVITY和NSETS:
			LINELEN = 1 << (len+3) /* In bytes */
			MULTIPLIER = 2 + M
			ASSOCIATIVITY = MULTIPLIER << (assoc-1)
			NSETS = 1 << (size + 6 - assoc - len)
			Multiplying these together gives the overall cache size as:
			CACHE_SIZE = MULTIPLIER << (size+8) /* In bytes */

			NSETS 不可能为负值
				(SIZE+6-assoc-len)<0的缓存长度字段无效,因为它们对应行长度、关联性和整个缓存大小的不可能组合。

寄存器2 : TCM type register
	MRC p15,0,R1,c0,c0,2; // 读到R1中
	紧耦合存储器(TCM)类型寄存器的格式为:
		ITCM	位[2:0]
			表示所实现的指令紧耦合的(或统一的)存储器的数量。
			此值在0-4范围内,所有其他值都保留。
			所有itcm必须能被指令端和数据端访问。
		DTCM  	位[18:16]
			表示实现的数据紧耦合存储器的数量。
			此值在0-4范围内,所有其他值都保留。

	在第B7章紧耦合存储器中详细讨论了紧耦合存储器

寄存器3 : TLB type Register
	MRC p15,0,R1,c0,c0,3; // 读到 R1中
	TLB的大小和组织是由实现定义的。
	这个只读寄存器描述了可锁定的TLB项,以及是否存在单独的指令和数据或统一的TLB。
	这允许操作系统建立如何管理TLB。
	TLB类型寄存器通过读取CP15寄存器0来访问,操作码2字段设置为0b011。


	TLB类型寄存器的格式为:
		S位
			(S==0,指定TLB是统一的TLB
			(S==1,单独的指令和数据TLB。
		DLsize
			如果S==0,则指定统一TLB可锁定的条目数
			如果S==1,则指定数据TLB中可锁定的条目数
		ILsize
			S==0 , 则为SBZ。
			S==1 , 则指定指令TLB中可锁定的条目数,
	第B4章虚拟存储系统体系结构e提供了虚拟存储系统体系结构的详细描述

寄存器4 : MPU type
	MRC p15,0,R1,c0,c0,4; // 读到 R1中
	存储器保护单元(MPU)类型寄存器的格式为:
		S位
			(S==0) 指定MPU是统一的MPU,
			(S==1) 单独的指令和数据MPU
		DRegion 
			如果S==0,则指定统一MPU中受保护区域的数目。
			如果S==1,则指定数据MPU中受保护区域的数目;
		IRegion 
			S==0,则为SBZ。
			如果S==1,指定指令MPU中受保护区域的数目,

	保护存储器系统体系结构的详细描述见第B5章保护存储器系统体系结构。
	注:MPU类型寄存器随PMSAv6.MSAv6一起引入。

  • #Register 1:控制寄存器
描述
	CP15寄存器1包含ARM处理器的配置控制位。
	它包含由“opcode_2”字段选择的3个寄存器。
		当opcode_2为0时,选择架构上指定的控制寄存器。
		当opcode_2为1时,选择实现定义的辅助控制寄存器。
		当opcode_2为2时,选择架构上指定的Coprocessor access control register


读
	MRC p15,0,Rd,c1,c0,<opcode2>;
写
	MCR p15,0,Rd,c1,c0,<opcode2>;


寄存器0: 架构上指定的控制寄存器


	此寄存器包含:
		•内存系统块的各种配置 和 ARM处理器的各种配置 
		•启用/禁用 由 CP15寄存器控制的缓存、MMU和其他内存系统块。这些存储系统块在启用之前 要能够 被正确 配置.


	怎么读写
		现在没有用到的位 可能会在未来增加。
		因此,该寄存器通常应使用读/修改/写技术进行更新,以确保当前未分配的位不会被不必要地修改。
		如果不遵守此规则,可能会导致代码对将来的处理器产生意外的副作用。
	值是多少
		当CP15寄存器1中的控制位不适用于特定实现时,它将读取最能反映该实现的值,并忽略写入。(此一般规则的具体示例记录在下面的各个位描述中)
		除了根据此规则读取为1的位之外,CP15寄存器1中的所有位在复位时被设置为0。

	系统控制协处理器寄存器1中的以下位用于控制MMU:

		bit[0] : M 
			这是MMU的启用/禁用位:
				0=禁用MMU。
				1=启用MMU
			在没有MMU的系统上,该位必须读取为零并忽略写入

		bit[1] : A
			在ARM体系结构v6中,它控制严格对齐
				0=对齐而非严格
				1=严格对齐。
			如果数据访问未与访问的数据项的宽度对齐,则会生成数据中止异常。
			
			在v6之前的体系结构中,对于可选地允许检查数据存储器访问对齐的存储器系统,该位启用和禁用对齐错误检查:
				0=校准故障检查已禁用
				1=校准故障检查已启用。

			对于其他内存系统,此位忽略写操作,并根据内存系统是否检查数据内存访问的对齐情况读取10。

		bit[2] : C 
			如果使用一级统一缓存,则这是统一缓存的启用/禁用位。
			如果使用单独的一级缓存,则这是数据缓存的启用/禁用位。
			无论哪种情况:
				0=禁用一级统一/数据缓存
				1=启用一级统一/数据缓存。
			如果一级缓存未实现,则此位读取为0并忽略写入。
			如果无法禁用一级缓存,则此位读取为1并忽略写入。
			此位的状态不影响系统中的其他缓存级别。
		bit[3] : W 
			这是写缓冲区的启用/禁用位:
				0=禁用写缓冲区
				1=启用写缓冲区。
			如果未实现写入缓冲区,则此位读取为零(RAZ),并忽略写入。
			如果无法禁用写缓冲区,则此位作为一个位读取,并忽略写操作。
		bit[4:6] : SBO 
			这些位读取为1,忽略写入。

		bit[7] : B
			该位用于将ARM处理器配置为内存系统的端部。
			支持小端和大端字不变量存储系统的ARM处理器使用此位配置ARM处理器,以重命名32位字中的4字节地址。
			在V6中,这成为支持遗留big-endian操作系统和应用程序的机制。
				0=配置的小端存储系统(LE)
				1=配置的大端字不变存储系统(BE-32)

			两个配置位CFGEND[1:0]如第A2-35页表A2-7所述,定义重置时的端元模型。
			以前的架构允许实现定义的配置选项在外部预先设置或重置此位,具体取决于外部内存子系统

		bit[8] : S
			系统保护位,支持向后兼容。此位的影响在第B4-8页的访问权限中描述。
			在ARMv6中不推荐使用该功能。
		bit[9] : R
			ROM保护位,支持向后兼容。此位的影响在第B4-8页的访问权限中描述。
			在ARMv6中不推荐使用该功能。
		bit[10] : F
			该位的含义由实现定义。
		bit[11] : Z
			在支持分支预测的ARM处理器上,这是用于分支预测的启用/禁用位:
				0=禁用程序流预测
				1=启用程序流预测。
			如果无法禁用程序流预测,则此位读取为1并忽略写入。
				程序流预测包括指令流预测的所有可能形式的推测性变化。示例包括静态预测、动态预测和返回堆栈。
			在不支持分支预测的ARM处理器上,此位读取为0,忽略写入。
		bit[12] : I
			如果使用单独的一级缓存,这是一级指令缓存的启用/禁用位:
				0=禁用一级指令缓存
				1=启用一级指令缓存。
			如果使用一级统一缓存或未实现一级指令缓存,则此位将读取为0并忽略写入。
			如果无法禁用一级指令缓存,则此位读取为1并忽略写入。
			此位的状态不会影响系统中缓存的更高级别。

		bit[14] : V
			该位用于选择异常向量的位置:
				0=选择的正常异常向量(地址范围0x00000000-0x0000001C1=选择的高异常向量(地址范围0xFFFF0000-0xFFFF001C)。
			一个实现可以提供一个输入信号来确定复位后该位的状态。
		bit[14] : RR
			如果高速缓存允许使用具有更可预测性能的替代策略,则该位选择它:
			0=正常替换策略(例如,随机替换)
			1=可预测策略(例如,循环替换)。
		bit[15] : L4
			当设置时,该位禁止ARMv5T Thumb interworking行为。它阻止了bit[0]更新CPSR T位。
			ARMv6中不推荐使用禁用功能
			受此影响的指令有:
				•第A4-36页上的LDM
				•第A4-43页上的LDR
				•第A7-82页善的POP
		bit[16] : DT
			SBO
		bit[17] : SBZ
			该位读取为0,忽略写入。
		bit[18] : IT
			SBO。
		bit[19] : SBZ
			该位读取为0,忽略写入。
		bit[20] : ST
			SBZ/UNP。

		bit[21] : FI
			配置快速中断配置。
			此位可用于通过禁用实现定义的性能特性来减少实现中的中断延迟:
				0=启用所有性能功能
				1=启用低中断延迟配置。
		bit[22] : U
			此位启用未对齐的数据访问操作,包括支持混合的小端和大端数据。
				0=未对齐的加载被视为旋转对齐的数据访问(传统代码行为)。
				1=允许未对齐的加载和存储,并启用混合端数据支持。
		bit[23] : XP
			扩展页表配置。此位配置硬件页表转换机制:
				0=子页AP位已启用。
				1=禁用子页AP位。在这种情况下,硬件转换表支持其他功能。
		bit[24] : VE
			配置矢量中断。允许使用实现定义的硬件机制来确定中断向量:
				0=中断向量固定:
					•如果V bit =0,则IRQ为0x00000018;如果V bit==1,IRQ at 0xFFFF0018
					•如果V bit==0,则FIQ为0x0000001C;如果V bit==1,FIQ at 0xFFFF001C
				1=中断向量由实现定义的硬件机制定义。

		bit[25] : EE
			混合尾数异常项。
			EE位用于定义CPSR中E位在进入异常向量时的值,包括reset。

			该值还用于指示用于页表查找的页表数据的结束位置。
			该位可由系统复位时的CFGEND[1:0]引脚预设。
			详见A2-34页的Endian配置和控制。
		bit[26] : L2
			启动二级统一缓存

		bit[26:31]
			保留。
			这些位通常使用读/修改/写技术进行更新,以确保当前未分配的位不会被不必要地修改。
			如果不遵守此规则,可能会导致代码对将来的处理器产生意外的副作用。
			在某些情况下可能有用的一个例外是,可以将0写入这些位以将它们还原到重置状态。




寄存器1: 实现定义的辅助控制寄存器
	这个寄存器的内容是实现定义的。
	即使这个实现没有在这个寄存器中创建任何控制位,寄存器也保证有特权读/写访问。


寄存器2: 架构上指定的Coprocessor access control register 协处理器访问寄存器
	这个寄存器控制对 (CP15和CP14以外) 的所有协处理器的访问。
	此寄存器的典型用途是使操作系统能够控制应用程序之间的协处理器资源共享。
	
	操作系统控制流程
		当应用程序试图使用该资源时,会导致未定义的指令异常(所有应用程序都被拒绝访问共享资源。)
		然后,未定义的指令处理程序中可以通过在协处理器访问寄存器中设置适当的位来授予对该资源的访问权。

		那么每个应用程序会对应 一组 bit[0:27],也就是有很多组bit[0:27],但是实体的寄存器只有一组,所以就存在一个问题:如何保存每个程序的bit[0:27],状态保存机制会解决这个问题

	该寄存器bit[0:27]保存了CP0-CP13的访问权限,每个协处理器访问权限 由两个bit 组成
	每2个bit对应于每个协处理器的访问权限:
		00	访问被拒绝。尝试访问相应的协处理器会生成未定义的异常。
		01  特权访问,用户模式不可访问 . 尝试在用户模式下访问相应的协处理器会生成未定义的异常。
		10	保留(不可预测)
		11	完全访问(由相关协处理器定义)。


	内存顺序模型相关:
		更新此寄存器后,应先执行预取刷新指令,然后才能保证对协处理器访问寄存器的更改的效果可见。
		更改此寄存器之后和预取刷新之前执行的任何指令都不应是受协处理器访问权限更改影响的协处理器指令。

	值相关
		系统重置后,所有协处理器访问权限都设置为拒绝访问。
		任何未实现的协处理器应导致相关的位字段读取为零(RAZ)。
		如果多个协处理器用于一组功能(例如,在使用VFP的情况下,其中使用CP10和CP11),则在这些协处理器的协处理器访问寄存器字段中具有不同的值可能会导致不可预测的行为。 

		可以通过此寄存器来判定哪些 协处理器存在.
			这允许系统软件将所有-1写入协处理器访问寄存器,然后读回结果以确定哪些协处理器存在,作为自动配置序列的一部分。


	在应用程序之间共享资源需要一种状态保存机制。两种可能性是:
		•在上下文切换期间,如果最后一个执行的进程具有对协处理器的访问权限,操作系统将保存协处理器的状态
		•操作系统在请求访问协处理器后,将旧协处理器状态与最后一个访问它的进程一起保存。

  • #Register 2:翻译表基

提供两个转换表基址寄存器和一个控制寄存器,可以通过 Opcode2 来选择
	00 : Translation Table Base 0 (TTBR0)
	01 : Translation Table Base 1(TTBR1) 
	10 : Translation Table Base Control

寄存器2: 翻译表基址控制寄存器 
	确定特定修改虚拟地址的页表是否应使用翻译表基址寄存器0或翻译表基址寄存器1。
	仅有3个bit起作用 bit[0:2] , 表示为 N
		N=0
			则始终使用TTBR0。
			当N=0(重置情况)时,转换表基与体系结构的早期版本向后兼容。

		N>0 
			且修改的虚拟地址的位[31:32-N]都为零
				则使用TTBR0,
			且修改的虚拟地址的位[31:32-N]不都为零
				使用TTBR1。N必须在0<=N<=7的范围内。

			N>0 时的情况 再次理解
				N=0;
				N=1;如果VA[31]==0,则使用TTBR0,否则使用TTBR1。
				N=2;如果VA[31:30]==0b00,则使用TTBR0,否则使用TTBR1。
				N=3;
				N=4;
				N=5;
				N=6;
				N=7;

寄存器0 : TTBR0
	有效位及边界
		只有翻译表基0寄存器的位[31:14-N]是有效的,用于存储Translation Table Base
		因此,如果N=0,则页表必须位于16KB边界上;如果N=1,则页表必须位于8KB边界上。类推的如下表格
			N=0   16KB
			N=1   8KB
			N=2   4KB
			N=3   2KB
			N=4   1KB
			N=5   512B
			N=6   128B
			N=7   64B
	用途:
		TTRB0用于进程特定的地址,每个进程维护一个单独的第一级页表。
		在上下文切换时, TTBR0 和 ContextID寄存器 被修改。

寄存器1 : TTBR1
	有效位及边界
		转换表基1寄存器的位[31:14]是有效的,用于存储Translation Table Base
		因此,TTBR1必须位于16KB边界上。
	用途:
		TTBR1用于 操作系统和IO地址
		在上下文切换时, TTBR1不会改变。

寄存器0 和寄存器1 的 字段比较:
	Translation Table Base 字段不同

	其他字段相同 // RGN、IMP、S和C位提供对页表遍历的内存属性的控制:
		RGN 	
			指示 L1之外的页表内存 是否可缓存到 L1
				00 VMSAv5:外部不可缓存 // VMSAv6:普通内存不可缓存
				01 不可预测
				10 外部可缓存直写
				11 外部可缓存回写。
		IMP 	
			实现定义,未使用时应为零。
		S
			0: 不可共享内存。
			1: 可共享内存

		C 	
			0: 不可内部缓存
			1: 可内部缓存
注意
	页表遍历是否可以从一级缓存读取是实现定义的
	因此,为了确保一致性,
		1.页表必须存储在内部直写内存中
		2.或者,如果在内部回写中,则必须在修改后清除相应的缓存条目,以确保硬件页表遍历机制可以看到它们。
  • #Register 3:域访问控制
域访问控制寄存器由16个两位字段组成,每个字段定义16个域中的一个域的访问权限。
域值在第B4-10页的域中定义。

  • #Register 4: Reserved
读写CP15寄存器4是不可预测的。
  • #Register 5:故障状态寄存器
根据Opcode2字段的值,该寄存器允许访问数据和指令故障状态寄存器
	00 Combined/Data FSR
	01 Instruction FSR


寄存器0 : DFSR
	故障状态寄存器包含上次中止的源。
	它指示发生中止时正在尝试的域(如果可用)和访问类型。
	DFSR是读/写寄存器。这可用于在调试器中保存和还原上下文。

	bit[11] 
		指示中止的数据访问是
			读取(0)访问
			写入(1)访问。
		例如: 对于CP15缓存维护操作错误,读取值为1。
	位[7:4]
		仅用于DFSR,指定发生内存系统中止时正在访问哪个域。
	位[103:0]
		中止的原因。详见第B4-20页表B4-1。

寄存器1 : IFSR
	故障状态寄存器包含上次中止的源。
	它指示发生中止时正在尝试的域(如果可用)和访问类型。
	IFSR是读/写寄存器。这可用于在调试器中保存和还原上下文。

	位[7:4]
		仅用于DFSR,指定发生内存系统中止时正在访问哪个域。
	位[103:0]
		中止的原因。详见第B4-20页表B4-1
  • #Register 6:故障地址寄存器
根据Opcode2字段的值,该寄存器允许访问数据和监视点故障地址寄存器
	00 Combined/Data FAR
	01 Watchpoint FAR (WFAR)
	10 Instruction FAR (IFAR): optional

寄存器0:
	可读写,这对于调试器还原其值很有用. 当FAR由MCR指令写入时,其值被视为数据,FCSE不执行地址修改。
	在中止时更新,根据根据B4-22页的表B4-2更新.
	FAR包含一个使用FCSE机制的MVA(参见B8-3页的修改虚拟地址)。
寄存器1:
	可读写,这对于调试器还原其值很有用
	在中止时更新,根据根据B4-22页的表B4-2更新.
	WFAR的内容是一个虚拟地址,而不是一个修改过的虚拟地址(MVA)。
	WFAR特性正在从CP15迁移到CP14中的调试架构,因此,在ARMv6中不推荐通过CP15解码WFAR。修改后的位置见第D3-2页的协处理器14调试寄存器。
寄存器2:
	可读写,这对于调试器还原其值很有用
	在中止时更新,根据根据B4-22页的表B4-2更新.它只在预取中止时更新。
	IFAR包含一个使用FCSE机制的MVA(参见B8-3页的修改虚拟地址)。
	IFAR在VMSAv6中是可选的,在PMSAv6中是必需的。

  • #Register 7:cache 和 write buffer 和 TCM 控制
读写:
	系统控制协处理器寄存器7是一个只写寄存器。
	大多数CP15寄存器7操作只能在特权模式下执行。少量指令也可以在用户模式下执行,在第B6-21页的表B6-6中标记为c,尝试在用户模式下执行特权操作将导致未定义的指令异常。

	MCR p15,0,<Rd>,c7,<CRm>,<opcode2>


描述:
	用于控制一级缓存和写缓冲区
	在预取缓冲区和分支目标缓存(如果存在)
		上实现一些类似的函数
		并实现等待中断时钟控制功能。

相关术语:
	Clean
		对于写回数据缓存
			1.该缓存线将立即写入主内存 // 这意味着如果缓存线包含尚未写入主内存的存储数据
			2.并将该行标记为Clean
	Invalidate
		对于所有缓存
			缓存线(或缓存中的所有行)被标记为无效。在将该行重新分配到地址之前,该行不会发生缓存命中。
		
		对于写回数据缓存
			这不包括清除缓存线,除非也声明了这一点。

	Prefetch
		在location does not abort时,指定虚拟地址处的内存缓存线被加载到缓存中,并标记为可缓存。
		如果预取有中止(由于MMU或MPU),则 该操作 不会访问内存。
		
		在ARMv6中
			虚拟地址没有对齐要求。
		
		在ARMv6之前
			地址必须与缓存线对齐。
			使用格式C锁定的缓存必须支持此操作,请参阅第B6-14页的表B6-1。
			在其他情况下,操作是由实现定义的。

	Data synchronization barrier

		之前的 数据写屏障,数据写载体(DWB) 的升级版
		DSB 请参考 新的ARMv6定义,请参阅B2-18页上的DataSynchronizationBarrier(DSB)CP15寄存器7。
		数据同步屏障可以在特权和用户操作模式下执行。

	Data memory barrier

		在ARMv6中引入,并在B2-18页的DataMemoryBarrier(DMB)CP15寄存器7中描述。
		DMB可以在特权模式和用户模式下执行。


	Wait for interrupt
		将ARM置于低功耗状态,并停止其进一步执行,直到发生中断或调试请求。
		在WFI状态下,中断和调试事件总是导致ARM处理器重新启动,而不管中断是否被屏蔽。
		调试事件需要启用调试。
		当中断确实发生时,MCR指令完成,下一条指令执行(如果中断事件和中断被屏蔽),或者IRQ或FIQ处理程序正常输入。
		R14_irq或R14_fiq中的返回链路包含MCR指令的地址加8,以便用于中断返回的正常指令(SUBS PC,R14,#4)返回到MCR之后的指令。


	Prefetch flush

		刷新指令预取缓冲区的效果是,
			在执行此指令后,之前预取的指令失效, 按程序顺序从内存系统(包括一级缓存或TCM)中提取此指令后发生的所有指令。
		此操作对于确保正确执行自修改代码非常有用。

		预取刷新可以在特权模式和用户模式下执行。


	Data
		是写入寄存器7的值。这是MCR指令中指定的寄存器<Rd>中的值。

		在ARMv6中,如果数据被声明为虚拟地址,则不需要对其进行缓存线对齐。

		该地址被用来 在缓存中查找特定操作

		如果 为 缓存miss ,Invalidation and cleaning operations 将没有影响

		如果相应的条目不在TLB中,这些指令可能会导致 一次 硬件页表遍历。

		FCSE相关
			如果正在使用第B8章快速上下文切换扩展中描述的快速上下文切换扩展(FCSE),
				则本节中对MVA的所有引用都是指修改后的虚拟地址,即FCSE转换将生成的地址
				并且不执行进一步的转换。

			在进行FCSE转换之前,将修改后的虚拟地址与非全局页面的ASID相结合。
			正如B8-2页上的About the FCSE所述,在非全局页面中使用FCSE可能会导致不可预测的行为。


		对 single line cache control operations 的 循环 可用于 clean and/or invalidate 与指定地址范围相关的所有缓存线

		被声明为set/way的数据
			则该数据通过指定其所属的缓存集和该集内的路号来标识要应用该操作的缓存线。

			此类型的操作循环可用于 清除或失效 所有缓存

			格式如第B6-21页的表B6-5所示,其中L、A和S是缓存大小参数LINELEN、ASSOCIATIVITY和NSETS的对数基数2,如果是A,则四舍五入为整数。

			这些参数可以在缓存类型寄存器中找到。

			NSETS 是使用其他两个参数从大小信息派生的。

			数据中的TC字段指示数据是否应应用于缓存或配置为SmartCache的任何TCM,如第B7-6页SmartCache行为中所述。

其他

	Cleaning and invalidating operations for the entire data (or unified) cache

		高速缓存的操作CP15寄存器7指定清除整个数据(或统一)高速缓存的操作,以及执行清除和失效整个数据(或统一)高速缓存的操作。
		如果这些操作被中断,则中断时捕获的R14值是启动高速缓存清除操作的指令的地址+4。这允许中断的标准返回机制重新启动操作。
		如果对于某个特定操作来说,高速缓存是干净的(或干净和无效的)是必要的,则用于该操作的高速缓存的清洁(或清洁和无效的)指令序列必须允许在未禁用中断的任何时间到达中断。
		这是因为中断可能会写入以前清理过的缓存块。
		因此,高速缓存脏状态寄存器指示自上次成功清除高速缓存后是否已写入高速缓存。
		缓存脏状态寄存器是只读寄存器。要访问它,请使用以下说明:
		MRC p15,0,Rd,c7,c10,6
		缓存脏状态寄存器的格式如表B6-7所示。
		C(位[0])高速缓存脏状态
			0 
				自上次 高速缓存清除或重置成功离开高速缓存清除 以来,没有任何写入操作命中高速缓存。
			1
				高速缓存可能包含脏数据。

		可以询问缓存脏状态寄存器以确定缓存是否干净,如果在禁用中断时完成此操作,则后续操作可以依赖于拥有干净的缓存。

		下面的序列说明了这种方法。
		
		注意,在这个例程中,长缓存清除操作是在启用中断的情况下执行的。

	Test and clean operations

		在ARMv5中存在 可替代的 清洁(和无效的清洁)方案。
		该方案通过执行以程序计数器为目标的MRC指令,提供了一种有效的方法来清除或清除并使完整的数据缓存失效。
		全局缓存脏状态位写入Z标志。
		带有目标R15的MRC指令的一个属性是它更新条件标志。
		见第A4-70页的MRC。
		实现定义了在指令的每次迭代中测试多少行。

		要使用此方法清理整个数据缓存,可以使用以下代码循环:
			tc_loop MRC p15,0,r15,c7,c10,3;测试并清除
				BNE tc_loop

		使用此方法清除并使整个数据缓存失效,可以使用以下代码循环:
			tci_loop MRC p15, 0, r15, c7, c14, 3 ; test, clean and invalidate
			BNE tci_loop

块传输
	可以选择使用CP15寄存器7支持表B6-8中所示的块操作。
	在ARMv6的体系结构中引入了块操作。
	如果操作未实现,则它们必须导致未定义的指令异常。
	块操作的允许组合如下:
		•所有(四)项操作
		•清洁、清洁和失效,以及失效操作
		•无。
	支持SmartCache行为的实现(请参阅第B7-6页上的SmartCache行为)必须实现范围清理和无效操作。

	a、 用于清除和/或使缓存中一系列地址无效的缓存块传输操作是块操作。在完成此操作之前,不得执行以下指令。非阻塞操作可以允许在操作完成之前执行以下指令。在发生异常的情况下,非阻塞操作不会向核心发出异常信号。这允许实现在执行非阻塞操作时退出以下指令,而无需保留精确的处理器状态。


	每个范围操作都是使用MCRR指令启动的。
	两个寄存器的数据用于指定块的起始地址和块的结束地址。
	所有块操作都在缓存(或SmartCache)行上执行,这些缓存(或SmartCache)行包括块起始地址和块结束地址(含)之间的地址范围。
	如果块起始地址大于块结束地址,则效果不可预测。
	一次只支持一个块传输。当第一个块传输正在进行时,尝试启动第二个块传输将导致放弃第一个块传输并启动第二个块传输。
	块传输状态寄存器指示块传输是否正在进行。这可以用来防止不需要等待的情况。应该在上下文开关上停止块传输。

	所有块传输都是可中断的。
	当阻塞传输中断时,捕获的R14值是启动阻塞操作的指令的地址+4。
	这允许中断的标准返回机制重新启动操作。
	出于性能原因,在执行非阻塞预取范围指令时,实现应允许执行以下指令。
	在这种实现中,在中断上捕获的R14值由以下指令流中呈现给中断的执行状态确定。
	但是,将预取范围指令视为阻塞操作的实现必须捕获如前一段所述的R14值。
	如果在运行预取范围操作时更改了FCSE PID(请参阅第B8-7页的CP15寄存器),则预取范围在何时看到此更改是不可预测的。


	异常行为

		如果无法获取有效的页表条目,阻塞块传输将导致转换错误时数据中止。CP15 FAR表示导致故障的地址,CP15 FSR表示故障原因。
		预取范围操作中的任何错误都会导致操作失败而不发出错误信号。

	寄存器编码

		使用CP15寄存器7指令支持寄存器编码块操作,如第B6-27页表B6-9所示。
		这些操作只能使用MCRR指令执行。忽略对这些寄存器的所有其他操作。
		指令格式如下:
		a、 真实的虚拟地址,在快速上下文切换扩展进行任何修改之前(参见第B8章快速上下文切换扩展)。此地址由FCSE逻辑翻译。b、 只能在特权模式下访问。如果在用户模式下尝试操作,将导致未定义的指令异常。
		c、 可在用户和特权模式下访问。每个范围操作都在包含起始地址和结束地址(包括起始地址和结束地址)的缓存(或智能缓存)行之间操作。

		MCRR指令传递的起始地址和结束地址数据值的格式如表B6-10所示,其中L是缓存大小参数LINELEN的对数基数2。由于忽略了最低有效地址位,传输将自动调整为跨越编程地址的行长倍数。
		起始地址虚拟地址(位[31:L])块传输的第一个虚拟地址结束地址虚拟地址(位[31:L])块传输停止的虚拟地址(该地址位于包含块传输要处理的最后一个地址的行的起始处)。
		注意只有这些块操作使用真正的虚拟地址。所有其他基于地址的缓存操作都使用MVA。
		另外提供了两个CP15寄存器7操作来支持块传输管理:
		StopPrefetchRange MCR p15,0,Rd,c7,c12,5;Rd SBZ PrefetchStatus MRC p15,0,Rd,c7,c12,4;Rd返回两个操作在用户和特权模式下均可访问的状态。由于所有块操作都是互斥的,即任何时候只能有一个操作处于活动状态,因此预取状态操作返回上次发出的预取请求、指令或数据的状态。
		块传输状态寄存器的格式如表B6-11所示。
		R(位[0])块预取运行0操作中无预取1操作中预取

配置为SmartCache的TCM的缓存清理和失效操作
	所有缓存线和块清除及失效操作都基于虚拟地址,
	如CP15寄存器7中所定义,包括配置为智能缓存的TCM区域,请参阅第B7-6页的智能缓存行为。
	作为SmartCache操作的TCMs支持SetWay操作。在这种情况下,将数字的方式视为TCM数字,并且设置的数字的含义保持不变。
	为了区分应用于高速缓存和应用于TCM的这些操作,使用set/way数据寄存器的底部位,如第B6-21页表B6-5所示。
	TC(位[0])TCM位。指示此寄存器引用的是中药,而不是缓存。
	0寄存器引用缓存。
	1寄存器指的是TCM作为智能缓存运行的TCM的行长度必须与缓存类型寄存器中定义的缓存行长度相同。
	Invalidate、clean和clean+Invalidate整个缓存操作对作为SmartCache运行的TCMs没有影响。
  • #Register 8:TLB 功能 操作
描述
	CP15寄存器8是用于控制tlb

读写
	只写寄存器。
	试图用MRC指令读取CP15寄存器8是不可预测的
寄存器种类
	register 89个寄存器(功能) , 依据 <CRm><opcode2> 来索引 // 使用表中未指定的任何<CRm>和<opcode2>组合的结果都是不可预测的。

	在这里,写一种寄存器对应一种功能

		CRm 	opcode2 			寄存器

unified	
		C5 		0 					Invalidate entire unified TLB or both instruction and data TLBs
		C5      1					Invalidate unified single entry
		C5      2					Invalidate on ASID match unified TLB
instruction
		C6      0					Invalidate entire instruction TLB
		C6      1					Invalidate instruction single entry
		C6      2					Invalidate on ASID match instruction TLB
data
		C7      0					Invalidate entire data TLB
		C7      1					Invalidate data single entry
		C7      2					Invalidate on ASID match data TLB


其他特性
	TLB maintenance operations and the memory order model on page B2-22 中描述了相对于周围指令更新TLB内容的函数的同步。

	在 MVA->PA 之前,必须将修改的虚拟地址(MVA)与非全局页面的ASID相结合。
	正如B8-2页上的About the FCSE所述,在非全局页面中使用FCSE可能会导致不可预测的行为。

	如果指令或数据TLB操作 用于具有统一TLB的实现,则该操作在统一TLB上执行。

	由于不能保证在任何时候都将未锁定的条目保存在TLB中,因此这允许将所有无效的整个TLB操作视为实现中的别名。
	类似的考虑也适用于没有锁定条目的单条目操作和ASID操作。

寄存器0 : Invalidate TLB
		// 将TLB中所有的条目失效
		这将使TLB中所有未锁定的条目失效。
		TLB维护操作的同步在第B2-22页的TLB维护操作和内存顺序模型中描述。

寄存器1 : Invalidate single entry
		// 将TLB中 与VMA 匹配的所有条目失效
		可用于在重新映射之前使内存区域失效。
		对于要重新映射的每个内存区域(节、小页预VMSAv6、小页或大页),应在该区域中 执行 对 修改的虚拟地址的 invalidate single entry.

		此功能可以选择TLB条目无效
			1.与 提供的MVA 和 ASID 匹配的TLB条目
			2.与 提供的MVA 匹配的全局TLB条目,此功能的全局TLB项没有检查ASID。
	
		Invalidate Single Entry函数需要一个经过修改的虚拟地址作为参数。
			根据是否设置了XP控制位,传递的修改虚拟地址的格式不同。
			如果XP控制位为0
				则修改的虚拟地址的格式仅为32位MVA,并且忽略位[11:0]
			如果XP控制位为1
				则修改后的虚拟地址格式如下:
					bit[31:12] MVA
					bit[11:8]  IGN
					bit[7:0]   ASID

寄存器2 : Invalidate on ASID Match
		// 将TLB中与 ASID 匹配的所有条目失效
		它使与提供的ASID匹配的非全局页面的所有TLB条目失效。Invalidate on ASID Match 需要一个ASID作为参数。

		如果指令或TLB操作用于具有统一TLB的实现,则在统一TLB上执行等效功能。

		中断特性
			这是一个可中断的操作

			在使用set associative tlb的实现中,此操作可能需要一些周期才能完成,并且指令可以中断。
			中断时,R14状态指示MCR指令未执行。因此R14指向MCR+4的地址,中断程序在MCR指令下自动重新启动。

			如果此操作被中断并随后重新启动,则无法预测由使用所提供ASID的中断获取到TLB的任何条目是否因重新启动的无效而无效。

		
  • #Register 9:cache 和 write buffer 和 TCM // cache lockdown
	缓存的好处
		它们通常会提高对数据和指令的平均访问时间
	缓存的问题
		通常会增加最坏情况下的访问时间。
		出现这种情况有很多原因,包括:
			•在系统确定发生缓存未命中并启动主内存访问之前有一个延迟
			•如果正在使用回写缓存,则可能会有进一步的延迟,因为需要存储正在重新分配的缓存线的内容
			•整个缓存线是从主存加载的,而不仅仅是ARM处理器请求的数据。

		在实时应用中,这种最坏情况下访问时间的增加可能非常显著。

	缓存问题的解决
		缓存锁定是大多数ARM内存系统的一个特性,旨在缓解这种情况。
		它允许将关键代码和数据(例如,高优先级中断例程及其访问的数据)加载到缓存中,从而使包含它们的缓存线不会随后重新分配。
		这可以确保对相关代码和数据的所有后续访问都是缓存命中,因此可以快速完成。
		
		系统控制协处理器中的缓存类型寄存器(CP15寄存器0)包含所采用的锁定机制的信息,请参阅第B6-14页的缓存类型寄存器。
	

	与寄存器7操作的交互
		缓存锁定只会阻止缓存未命中时使用的正常替换策略选择在锁定区域中重新分配缓存线。
		寄存器7使缓存内容失效、清除或清除并使其失效的操作会像正常情况一样影响锁定的缓存线。
		如果使用无效操作,则必须确保它们不使用影响锁定缓存线的虚拟地址或缓存集/方式组合。(否则,如果很难避免影响锁定的缓存线,请稍后重复缓存锁定过程。)

	四种操作格式
		ARM架构支持缓存锁定机制的四种格式,即格式A、格式B、格式C和格式D。
			在ARMv6中,不推荐使用注释格式B。
			格式A、B和C都以缓存方式操作(请参见第B6-5页的“设置关联性”)。
			格式D是一种缓存条目锁定机制。


		适用于格式A、B和C锁定的一般条件用于访问CP15寄存器9锁定寄存器的指令如下:

			MCR p15,0,Rd,c9,c0,0;写入统一/数据锁定寄存器
			MRC p15,0,Rd,c9,c0,0;读取统一/数据锁定寄存器
			MCR p15,0,Rd,c9,c0,1;写入指令锁定寄存器
			MRC p15,0,Rd,c9,c0,1;读取指令锁定寄存器 

		缓存方式由每个缓存集的一条缓存线组成,标记为从0到关联性-1。
		LINELEN,关联性和NSETS是在B6-6页的cache size中描述的cache size参数。
		格式A、B和C都使用缓存方式进行锁定粒度(锁定块)。
		缓存锁定方案可以使用从1到关联性-1的任意数量的锁定块。
		如果锁定了N个锁定块,则它们的索引为0到N-1,并且锁定块N到关联性-1可用于正常缓存操作。
		基于缓存方式的锁定实现不能锁定整个缓存。
		必须至少保留一个高速缓存路块才能进行正常的高速缓存操作。
		不遵守此限制会导致不可预知的行为。
		为了锁定,缓存方式被定义为锁定块,每个锁定块由来自每个缓存集的一行组成。
		锁定块从0索引到关联性-1。锁定块中的缓存线被选择与锁定块具有相同的方式号(请参见第B6-5页的“设置关联性”)。
		因此,锁定块n由每个缓存集的索引为n的缓存线组成,n从0到关联性-1。
		每个锁定块可以容纳NSETS内存缓存线,前提是每个内存缓存线与不同的缓存集相关联。
		建议系统设计为每个锁定块包含一组NSET连续内存缓存线。
		这是从缓存线边界开始的NSETS×LINELEN连续内存位置。
		这样的集合很容易识别,并且保证由与每个高速缓存集相关联的一条高速缓存线组成

	格式A和B
		格式A和B锁定

			A和B使用一个被选择为足够宽的方式字段来保存任何锁定块的方式编号。其宽度W是缔合性的对数底2,必要时四舍五入到最接近的整数。

			锁定寄存器的格式如表B6-13所示。
			读取格式寄存器返回上次写入的值。
			编写格式寄存器具有以下效果:
			•每个缓存集中的下一个缓存未命中将用该缓存集中的指定方式替换缓存线
			•缓存的替换策略受到限制,因此它只能以指定的方式和更高的方式选择缓存线,直到再次写入寄存器。
			格式B锁定寄存器的格式如表B6-14所示。
			读取格式B寄存器将返回上次写入的值。
			编写格式B寄存器具有以下效果:
			•如果L==1,则所有缓存未命中都用相关缓存集中的指定方式替换缓存线,直到再次写入寄存器
			•如果L==0-如果L的前一个值为0,并且WAY的前一个值小于新值,则行为是不可预测的。
			-如果L的上一个值不是0,则缓存的替换策略将受到限制,以便它只能选择指定方式和更高方式的缓存线,直到再次写入寄存器。
		
		格式A和B缓存锁定过程

			锁定N个锁定块的过程如下:
				一。确保在执行此过程期间不会发生处理器异常,例如禁用中断。如果由于某种原因这是不可能的,那么任何可以被调用的异常处理程序使用的所有代码和数据都必须被视为此过程在步骤23中使用的代码和数据。
				2。如果正在锁定指令缓存或统一缓存,请确保此过程执行的所有代码都在内存的不可缓存区域中。
				三。如果正在锁定数据缓存或统一缓存,请确保以下代码使用的所有数据都位于内存的不可缓存区域中,但要锁定的数据除外。
				四。确保要锁定的数据/指令位于内存的可缓存区域。
				5个。确保要锁定的数据/指令不在缓存中,并根据需要使用缓存清除和/或失效指令。
				6。对于i=0到N-1中的每一个:
				a、 用WAY==i(用于格式a和B)和L==1(用于格式B)写入寄存器9。
				b、 对于锁定块i中要锁定的每个缓存线:
				如果正在锁定数据缓存或统一缓存,请使用LDR指令从内存缓存线加载单词。这样可以确保将内存缓存线加载到缓存中。
				如果指令缓存被锁定,请使用寄存器7预取指令缓存线操作(<CRm>==c13,<opcode2>==1)将内存缓存线提取到缓存中。
				7号。用WAY==N(用于格式A和B)和L==0(用于格式B)写入寄存器9。
				注意:如果正在使用第B8章中描述的快速上下文切换扩展(FCSE),则在步骤6b中必须小心,原因如下:


			•如果数据缓存或统一缓存被锁定,则用于LDR指令的地址将由FCSE修改
			•如果指令缓存被锁定,则寄存器7操作所用的地址被视为数据,因此不受FCSE的修改。为尽量减少由此引起的混淆,建议锁定程序应:
			•首先禁用FCSE(将PID设置为零)
			•在适当的情况下,通过将适当的PID值放入其使用的虚拟地址的前7位,生成修改后的虚拟地址。


		格式化A和B缓存解锁过程

			要解锁缓存的锁定部分,请使用WAY==0(格式化A和B)和L==0(格式化B)写入寄存器9。
			在ARMv6中,不推荐使用注释格式B。
			
	格式C
		格式C锁定缓存锁定

			格式C是一种不同形式的基于缓存方式的锁定。它允许禁用或启用对每个缓存方式的分配。这提供了对特定应用程序造成的缓存污染的一些额外控制,以及用于将关键区域锁定到缓存中的传统锁定功能。每个高速缓存方式的锁定位决定是否允许正常的高速缓存分配机制访问该高速缓存方式。
			对于关联性较高的缓存,只能锁定031的缓存方式。
			最多可以锁定N路缓存的N-1路。这确保可以执行正常的缓存线替换。如果没有L==0的缓存方式,这将导致处理缓存未命中时出现不可预测的行为。
			锁定寄存器的32位(指令或数据,取决于操作码2的值)决定了相关高速缓存方式的L位。
			缓存锁定寄存器通常按读-修改-写顺序进行修改。例如,以下序列将指令缓存的方式0的L位设置为1:
			MRC p15,0,Rn,c9,c0,1或Rn,Rn,0x01 MCR p15,0,Rn,c9,c0,1;为Icache设置方式0 L位缓存锁定寄存器的格式如表B6-15所示。
			Bits[31:0]每种缓存方式的L位。如果未实现缓存方式,则该方式的L位读取为1,并忽略对该位的写入。每一位与其对应的缓存方式相关,即N位是指方式N。0对缓存方式的分配由标准替换算法(重置状态)确定1不对该缓存方式执行分配。
			只有在确定可能导致缓存线填充的所有未完成访问都已完成时,才应更改格式C锁定寄存器。
			因此,应在更改锁定寄存器之前执行数据同步屏障指令。

		Format C cache lock procedure
			使用Format C以N种缓存方式锁定到缓存方式i的过程涉及到无法分配到目标缓存方式i以外的任何缓存方式。这是用于将数据锁定到缓存中的体系结构定义的方法:
			一。例如,通过禁用中断,确保在执行此过程期间不会发生处理器异常。如果由于某种原因这是不可能的,那么任何可以被调用的异常处理程序使用的所有代码和数据都必须被视为此过程在步骤23中使用的代码和数据。
			2。如果正在锁定指令缓存或统一缓存,请确保此过程执行的所有代码都位于内存的不可缓存区域(包括紧密耦合的内存)中或以已锁定的缓存方式执行。
			三。如果正在锁定数据高速缓存或统一高速缓存,请确保以下代码使用的所有数据(要锁定的数据除外)位于内存的不可缓存区域(包括紧耦合内存)中,或处于已锁定的高速缓存方式中。
			四。确保要锁定的数据/指令位于内存的可缓存区域。
			5个。确保要锁定的数据/指令不在缓存中,并根据需要使用缓存清除和/或失效指令。
			6。写入寄存器9<CRm>==0,设置L==0表示位i,设置L==1表示所有其他方式。这允许分配到目标缓存方式。
			7号。对于要在缓存方式i中锁定的每个缓存线:
				•如果数据缓存或统一缓存被锁定,请使用LDR指令从内存缓存线加载一个字,以确保将内存缓存线加载到缓存中。
				•如果指令缓存被锁定,使用寄存器7预取指令缓存线操作(<CRm>==c13,<opcode2>==1)将内存缓存线提取到缓存中。
			8个。写入寄存器9<CRm>==0为位i设置L==1,并将所有其他位还原为启动此例程之前的值。


		格式化C cache unlock procedure
			要解锁缓存的锁定部分,请写入寄存器9,为每个位设置L==0。

	格式D
		格式D锁定此格式

			锁定单个一级缓存线条目,而不是使用缓存方式方案。这些方法因指令和数据缓存而异。用于访问CP15寄存器9格式D锁定寄存器的指令如下:
			MCR p15,0,Rd,c9,c5,0;获取并锁定指令缓存线,;Rd=MVA MCR p15,0,Rd,c9,c5,1;解除锁定指令缓存,;Rd忽略MCR p15,0,Rd,c9,c6,0;写入数据缓存锁定寄存器,;Rd=set/clear lock mode MRC p15,0,Rd,c9,c6,0;读取数据缓存锁定寄存器,;Rd=lock mode status MCR p15,0,Rd,c9,c6,1;解除锁定在ARMv6之前,一些格式D实现使用c1和c2,而不是c5和c6。必须检查ARMv6之前的体系结构变体实现的技术参考手册,因为CP15功能的提供不是强制性的,并且仅作为指导。
			缓存集中可以锁定的条目数有三条规则:
			•每个缓存集必须至少保留一个条目,才能进行正常的缓存操作。不遵守此限制会导致不可预知的行为。
			•实现定义了每个缓存集中可以锁定的方式。
			已锁定的最大缓存集项数<NWAYS。
			•实现定义了以格式D锁定其他条目的尝试是被分配为未锁定条目还是被忽略。
			对于指令缓存,fetch和lock操作用于获取和锁定单个缓存线。每个缓存线都由其修改后的虚拟地址指定(参见第B8-3页的修改后的虚拟地址)。要将代码锁定到指令缓存中,应用以下规则:
			•用于将行锁定到指令缓存的例程必须从非缓存内存执行
			•被锁定在指令缓存中的代码必须是可缓存的
			•在锁定缓存线之前,必须启用并使指令缓存失效。不遵守这些限制会导致不可预测的结果。必须使用全局指令缓存解锁命令解锁条目。
			必须首先设置全局锁定控制位,将缓存线锁定到数据缓存中。设置全局锁定控制位时发生的数据缓存线填充被锁定到数据缓存中。要将数据锁定到数据缓存中,应用以下规则:
			•被锁定的数据不得存在于缓存中。为满足此条件,可能需要缓存清除和无效操作。
			•要锁定的数据必须是可缓存的。
			•必须启用数据缓存。
			数据缓存锁定寄存器的格式如表B6-16所示。
			L(位[0])锁定位0不发生锁定1设置此位时,所有数据填充都被锁定。

TCM

	Each TCM bank has its own Region register. 

	该寄存器描述该TCM的物理基址和大小,并控制其启用和操作模式。

	在预取范围或DMA操作运行时更改TCM区域寄存器会产生不可预测的影响。

	要访问每个TCM bank寄存器,TCM 选择寄存器 被设置为感兴趣的TCM 。

	这些寄存器只能在特权操作模式下使用CP15寄存器9访问

	寄存器有是三个

	寄存器0 : TCM Selection Register
		TCM Number (Bits[1:0])
			指示区域寄存器应用于哪个TCM号。此值重置为0。如果写入TCM选择寄存器以指向未实现的存储器,则忽略该写入
	寄存器1 : Data TCM Region Register
	寄存器2 : Instruction/Unified TCM Region Register
		BaseAddress [31:12])
			给出了TCM的物理基址。
			假定基地址与TCM的大小对齐。忽略范围[(log2(RAMSize)-1:12]内的任何位。
			重置时基址为0。
		Size [6:2])
			读取时,指示TCM的大小,写入时忽略。尺寸字段的编码如表B7-2所示。
		SC(位[1])
			此变速器控制模块启用为智能缓存(如果变速器控制模块支持智能缓存):
				0=本地RAM(复位状态)
				1=智能缓存
			如果RAM不支持SmartCache,则该位将被读取为零,并且在写入时被忽略。
			这可用于确定变速器控制模块是否支持智能缓存。
		En(位[0]0=禁用(重置状态)
			1=启用
			如果没有实现TCM,则该TCM的TCM区域寄存器是SBZ/UNP。
		

		每个变速器控制模块的基址必须不同,这样存储器中的任何位置都不包含在一个以上的变速器控制模块中。
		如果存储器中的一个位置包含在多个TCM中,则指令或数据从哪个存储器返回是不可预测的。
		实施必须确保这种情况不会对变速器控制模块造成物理损坏
	其他
		B7.2.4智能缓存行为
			当TCM配置为SmartCache时,它形成一个相邻的缓存区域,其中的内存内容由外部内存支持。
			TCM的每一行与缓存线的长度相同(在等效缓存的缓存类型寄存器中指示),并且可以单独设置为有效或无效。
			写入RAM区域寄存器会清除每行的有效信息(标记为无效)。
			当对无效行进行读取访问时,将以与缓存未命中完全相同的方式从二级内存系统提取行,然后将提取的行标记为有效。
			支持SmartCache的TCM数量是由实现定义的。
			为了使TCM显示SmartCache行为,作为SmartCache操作的TCM所覆盖的内存区域必须标记为可缓存。
			对于对标记为不可缓存但位于TCM覆盖区域的内存位置的内存访问,如果相应的SmartCache行标记为无效,则该内存访问不得导致从外部内存提取该位置并标记为有效。
			如果相应的SmartCache行被标记为有效,则无法预测是对变速器控制模块还是对外部存储器进行访问。
			如果实现支持使SmartCache对内存透明的机制,则标记为共享的内存区域只能由SmartCache覆盖。
			因此,实现定义了SmartCache覆盖的内存区域是否可以标记为共享。

		B7.2.5本地RAM行为
			当变速器控制模块被配置为本地RAM时,它形成一个连续的存储器区域,如果变速器控制模块被启用,则该区域始终有效。
			因此,它不对用于SmartCache的每一行使用有效位。
			配置为本地RAM的TCM预期将用作系统物理内存映射的一部分,并且不期望由具有相同物理地址的外部内存级别来支持。
			因此,TCM的行为与标记为可通过缓存写入的内存区域的缓存不同。
			在这些区域中,当写入TCM中包含的存储器位置时,不会发生外部写入。
			DMA只能在配置为本地RAM的TCM区域工作。
			这避免了缓存重新填充和DMA操作之间的任何交互需求。
			尝试对配置为SmartCache的TCM区域执行DMA会导致内部DMA错误(紧密耦合的DMA超出范围),如第B7-9页的使用CP15寄存器11的L1 DMA控制中所述。

		B7.3访问TCM模块和高速缓存
			如果TCM和高速缓存都包含请求的地址,则无法预测从哪个内存返回指令或数据。
			实现必须确保这种情况不会对缓存或TCM造成物理损坏。
			预计这种事件只应在更改TCM的基址寄存器时,由于未能使高速缓存失效而引起。这是一个编程错误。
			对于哈佛的缓存和TCM安排,要求数据读写可以访问TCM配置为本地存储器的任何读写指令。
			这确保可以访问文本池、未定义的指令和SWI号,并有助于调试。
			这种实现的端口之间的仲裁是由实现定义的。
			因此,配置为本地存储器的指令TCM必须表现为统一的TCM,但可以针对指令获取进行优化。
			此要求仅适用于配置为本地RAM的TCM。
			必须在对指令TCM的写入和所依赖的正在写入的指令之间插入指令存储器屏障。
			此外,如果指令TCM中的某个分支被覆盖,则任何分支预测机制都应失效或禁用。
			相反的安排,即指令端口可以访问数据TCM,是不需要的。
			试图从指令端口访问数据TCM覆盖范围内的地址不会导致访问数据TCM。
			在这种情况下,指令必须从主存中获取。
			在某些系统中,这种访问可能会导致外部中止,因为主存中可能不支持地址范围。
			指令TCM不得编程为与数据TCM相同的基址(如果两个ram的大小不同,则两个ram的物理内存中的区域不得重叠),除非每个TCM配置为作为SmartCache运行。
			如果一个数据和一个指令TCM重叠,并且其中一个没有配置为SmartCache,那么从哪个内存返回指令数据是不可预测的。
			实施必须确保这不会对变速器控制模块造成物理损坏
  • #Register 10:TLB锁定
描述
	TLB锁定是一些ARM内存系统的一个特性
	它允许将指定翻译表行走的结果加载到TLB中
	这样它们就不会被后续翻译表行走的结果覆盖

为什么需要锁定
	翻译表遍历可能需要相当长的时间,特别是因为它们涉及到可能较慢的主内存访问。
	在实时中断处理程序中,由于TLB不包含处理程序的翻译和/或它访问的数据而导致的翻译表遍历会显著增加中断延迟。
锁定类型
	ARM体系结构支持两种基本的锁定模型:
		•a TLB lock by entry model
		•a translate and lock model

	TLB类型寄存器可用于判断
		是否实现了统一或哈佛TLB
		可用的可锁定TLB条目数

	在ARMv6中,仅支持a TLB lock by entry model


TLB锁定可选OPS
	两种锁定方式
		by entry model
		translate and lock model
	两种解锁方式
		by entry model
		translate and lock model

不同的TLB,支持的OPS不同
	如果实现具有统一的TLB,则只存在该寄存器的一个变体
		<opcode2> SBZ,<CRm>必须始终为c0。
		仅支持 一种锁定方式(by entry model) ,不支持解锁


	如果实现具有单独的指令和数据tlb,则该寄存器有两种变体,

		<opcode2>字段选择:
			<opcode2>==0选择数据TLB锁定寄存器。
			<opcode2>==1选择指令TLB锁定寄存器。
		CRm字段选择
			C0 锁定 by entry model
			C4 锁定 translate and lock model
			C8 解锁 

寄存器 : 6
  • #Register 11: L1 DMA control

描述:
	L1 DMA使用CP15寄存器11控制。有几个与CP15寄存器11相关联的寄存器,用于DMA的控制和监视。

读写
	一部分寄存器是 可以在用户模式下读写的.

寄存器
	Enable、Control、Internal Start Address、
	External Start Address、Internal End Address、
	Channel Status和Context ID寄存器是多个寄存器
	每个已实现的通道都有一个寄存器。
	访问哪个寄存器由 通道号寄存器 决定

	有 10个寄存器

寄存器1 : Identification and Status Registers
...
寄存器10 :  Context ID Registers


  • #Register 12: Reserved

  • #Register 13:进程ID

此寄存器确定当前正在运行的进程。

根据opcode2字段,可以存储两个不同的值
	00 		FCSE PID
	01 		ContextID


更新ASID时,当前指令和数据流应位于全局内存区域中,而不是ASID相关的内存区域中。


寄存器0 : FCSE PID
	重置时,FCSE PID寄存器的值应为零(SBZ)
	用来控制FCSE
	不赞成使用FCSE。
寄存器1 : ContextID
	default value
		重置时,ContextID寄存器的值未定义。

	位
		寄存器的低8位是当前运行的ASID
		高位为通用进程ID(ASID的扩展)

	内存顺序模型相关
		为确保所有访问都与正确的上下文ID相关,软件应在更改此寄存器之前执行数据同步屏障操作。

	实现可以使这个值对系统的其余部分可用。
		1. ETM
			整个寄存器由嵌入式跟踪宏单元(ETM)和调试逻辑使用。
			其值可由ETM broadcast 以指示当前正在运行的进程,并应 以 每个进程的编号 对齐编程 。
			如果ASID被重用,ETM可以区分进程。
			ETM使用它来确定 如何将虚拟内存映射到物理内存
		2.断点
			该寄存器还可以用于 使能 依赖于进程的断点和指令

  • #Register 14: Reserved

  • #Register 15: IMPLEMENTATION DEFINED

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值