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

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