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

寄存器总览

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

寄存器分类

  • @Register 1 :ID codes

  • @Register 2 :Control registers

  • CP15寄存器2 3 4 5 6、8、10和13被分配给 VMSA/PMSA。

    • 有关这些寄存器的详细信息,请参阅第B4章虚拟内存系统架构、第B5章受保护内存系统架构和第B8章快速上下文切换扩展。
  • CP15寄存器7和9被分配给缓存和写缓冲区的控制。

    • 有关这些寄存器的详细信息,请参阅第B6章缓存和写入缓冲区。
  • CP15寄存器11被分配到1级存储器DMA支持。

    • 详见B7章紧耦合存储器。
  • CP15寄存器15保留用于实现定义的目的。

    • 有关本登记册中可用设施的详细信息,请参阅《实施技术参考手册》或其他具体实施文件。
  • CP15寄存器12和14被保留以供将来扩展。

    • 访问(读或写)这些寄存器中的任何一个都是不可预测的,并且未从ARMv6.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字段都描述统一缓存,并且必须相同。
		Dsize
			指定数据缓存的大小、行长度和关联性,如果S==0,则指定统一缓存的大小、行长度和关联性。
		Isize
			指定指令缓存的大小、行长度和关联性,如果S==0,则指定统一缓存的大小、行长度和关联性。
		ctype
			指定未由S位以及Dsize和Isize字段指定的缓存的详细信息。表中未指定的所有值都保留以供将来扩展。

	有关缓存的详细讨论,请参阅第B6章缓存和写入缓冲区。
	有关缓存类型寄存器字段的编码,请参见第B6-14页的缓存类型寄存器

寄存器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 控制

  • #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 // cache lockdown

  • #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:Tightly-coupled Memory Control

  • #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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章