linux內存管理 (三) [硬件] MMU的操作手冊

引言

爲什麼linux會發展成這個樣子,這當然是程序員對程序的要求決定的,
爲了滿足這些要求,提出了 進程地址空間抽象(1) , 其中 硬件上增加了新的模塊MMU(2), 軟件上根據MMU的使用手冊(3)更新了系統
另外在 進程地址空間抽象 的基礎上, 軟件上更新了很多新的內存特性(4).


這裏主要講 MMU的使用手冊(3)

回顧

MMU 是做什麼的 ? 翻譯
翻譯過程中用到了哪些硬件
cpu mmu mmu中的TLBs mmu中的TableWalkUnit cache 主存中的轉換表(頁表) 主存中其他部分
那在訪問內存前,那我們就需要講這些硬件進行預先設置
  • MMU 預留了哪些編程接口
CP15協處理器的操作指令以及CP15協處理器的寄存器
  • 怎麼設置
關聯硬件 
	cpu mmu mmu中的TLBs mmu中的TableWalkUnit cache 主存中的轉換表(頁表) 主存中其他部分
需要設置的硬件
	mmu mmu中的TLBs mmu中的TableWalkUnit cache 主存中的轉換表(頁表)
設置相關的指令及流程
	MRC(讀CP15寄存器到CPU寄存器) CHANGE(改變CPU寄存器的值)  MCR(讀CPU寄存器的值並寫值CP15寄存器)
設置相關的寄存器
	MMU/CACHE總控制
		Register 1: Control register //enable/disable
		Register 13: Process ID
	TLB
		Register 0: TLB type register (VMSAv6)
		Register 8: TLB functions
		Register 10: TLB lockdown
	TableWalkUnit
		Register 3: Domain access control
		Register 2: Translation table base
		Register 5: Fault status
		Register 6: Fault Address register
	CACHE:
		Register 0: cache type
		Register 1: cache and write buffer control bits
		Register 7: cache management functions
	
	主存中的轉換表(頁表):
		跟CP15寄存器無關,只需要在 Register 2: Translation table base 所在的主存地址建立 頁表即可

設置流程
	
	
	

協處理器

  • 協處理器按功能分類
CP0-CP7     ARM留給各生產商使用
CP8-CP9     保留
CP10        一般用於單精度浮點數計算
CP11        一般用於雙精度浮點數計算
CP12-CP13   保留ARM公司以後使用
CP14        一般用於Debug調試
CP15        cache 緩存(包括write buffer TLB)的管理、mmu內存的管理、中斷向量的管理 時鐘模式的管理等
  • 協處理器的操作指令
訪問CP15協處理器不能使用常規指令,ARM提供了一組專門操作協處理器的指令,這些指令與ARM自身的指令格式有很大的不同。

對CP15協處理器的操作使用mcr和mrc兩條協處理器指令,
這兩條指令的記法是從後往前看:
	mcr 是把r(cpu核寄存器)中的數據傳送到c(協處理器寄存器)中
	mrc則是把c(協處理器)中的數據傳送到r(cpu核寄存器)中。

對cp15協處理器的所有操作都是通過cpu核寄存器和cp15寄存器之間交換數據來完成的。

amrv4v5v6 P212 MCR
	MCR Move to Coprocessor from ARM Register
	MRC Move to ARM Register from Coprocessor

MCR{<cond>} <coproc>, <opcode_1>, <Rd>, <CRn>, <CRm>{, <opcode_2>}

Cond是條件碼 // {可選}
coproc 是協處理器編號,CP15的編號是15,因此是41// <必選>
CRn是CP15寄存器編號,4個位,也就是說協處理器的主寄存器(還有輔助寄存器)不會超過16個
Rd是CPU核寄存器編號,4個位

// 指令二進制碼是32位
bit 20是L位,表示該指令是讀還是寫
	如果L=1就表示Load,從外面讀到CPU核中,也就是mrc指令
	如果L=0就表示Store,也就是mcr指令

// 例子
MRC p15, 5, R4, c0, c2, 3 ; Coproc 15 transfer to ARM register
; opcode 1 = 5, opcode 2 = 3
; ARM destination register = R4
; coproc source registers are 0 and 2
MCR p14, 1, R7, c7, c12, 6 ; ARM register transfer to Coproc 14
; opcode 1 = 1, opcode 2 = 6
; ARM source register = R7
; coproc dest registers are 7 and 12

  • 協處理器的寄存器
協處理器也有屬於它自己的寄存器

CP15協處理器內部就有16個寄存器,通常使用Cn來表示,這裏的n代表協處理器寄存器的序號。
想使能cache只需要設置CP15相關的寄存器就可以了。

CP15處理器 系統控制協處理器

  • 功能
1.支持對緩存、緊耦合存儲器和協處理器的自動查詢。
2.它還提供了內存管理的控制機制(如適用,支持MMU和MPU)。
  • 寄存器
寄存器:
	種類及如何索引
		系統控制協處理器最多可包含16個主寄存器,每個主寄存器的長度爲32位。
		在系統控制協處理器的描述中,4位主寄存器編號用於標識寄存器,因爲它是決定寄存器功能的主要因素。
		寄存器訪問指令中的附加字段用於進一步優化訪問,從而增加CP15中物理32位寄存器的數量。

	屬性
		CP15寄存器可以是隻讀的、只讀的或讀/寫的。
		寄存器的詳細說明規定:
			•允許的訪問類型
			•每種訪問類型調用的功能
			•主寄存器是否標識多個物理寄存器,如果標識多個物理寄存器,如何區分它們
			•與登記冊使用有關的任何其他細節
  • 指令
MCR{<cond>} <coproc>, <opcode_1>, <Rd>, <CRn>, <CRm>{, <opcode_2>}
// cp15 的 mcr 和 mrc
MCR{<cond>} p15, 0, <Rd>, <CRn>, <CRm>{, <opcode2>} (L = 0)
MRC{<cond>} p15, 0, <Rd>, <CRn>, <CRm>{, <opcode2>} (L = 1)

一般情況下,對於cp15 
// Rd是cpu寄存器,目標寄存器 ,Cn是cp15寄存器,是源寄存器
// 意思是將cp15 的 Cn寄存器讀到 cpu的 Rd寄存器裏面來
mrc p15 ,0 ,Rd ,Cn ,C0 ,0
或
mrc p15 ,0 ,Rd ,Cn ,C0

對於CP15協處理器,規定opcode1應該爲0,opcode2和CRm是指令的選項,具體含義取決於不同的寄存器。
寄存器訪問指令 // 唯一定義的系統控制協處理器指令是:
	1. 種類
		•將ARM®寄存器寫入CP15寄存器的MCR指令
		•將CP15寄存器的值讀入ARM寄存器的MRC指令
		•ARMv6中引入的範圍操作MCRR說明,在早期版本的體系結構中是可選的。
		•MRRC對於實現定義的特性是可選的。 // MCRR格式(見第A4-64頁的MCRR)的解碼範圍較小。主寄存器是隱含的(沒有CRn字段),CRm和opcode字段用於解碼正確的函數。
		所有CP15 CDP、CDP2、LDC、LDC2、MCR2、MCRR2、MRC2、MRRC2、STC和STC2指令都未定義。
	2. 格式
		MCR/MRC指令的格式如下所示,

		MCR{<cond>} p15, 0, <Rd>, <CRn>, <CRm>{, <opcode2>} (L = 0)
		MRC{<cond>} p15, 0, <Rd>, <CRn>, <CRm>{, <opcode2>} (L = 1)[11:8](cp_num)表示CP15
		CRn字段表示主寄存器號

		CRm和opcode2提供額外的寄存器解碼。

		<cond> 這是執行指令的條件。條件在第A3-3頁的條件字段中定義。如果省略<cond>,則使用AL(always)條件。


		位[23:21]
			這些指令位是通用MRC和MCR指令中的<opcode1>字段,在有效的CP15指令中通常是0b000。
			但是,<opcode1>==1正用於2級緩存支持,並考慮用於其他一些專業任務。未分配的值是不可預測的。
		<Rd>
			這是傳輸中涉及的ARM寄存器(MCR的源寄存器和MRC的目標寄存器)。
			這個寄存器不能是R15,即使MRC指令通常允許它是R15。如果在CP15 MRC或MCR指令中爲<Rd>指定了R15,則該指令是不可預測的。

		<CRn>
			這是參與傳輸的主CP15寄存器(MCR的目標寄存器和MRC的源寄存器)。標準通用協處理器寄存器名爲c0、c1、…、c15。
		
		<CRm>
			這是一個附加協處理器寄存器名,用於訪問某些主寄存器,以指定有關寄存器版本和/或訪問類型的附加信息。
			當主寄存器的描述沒有指定<CRm>時,必須指定c0。如果指定了另一個寄存器,則指令是不可預測的。
		<opcode2>
			這是一個可選的3位數字,用於訪問一些主寄存器,以指定有關寄存器版本和/或訪問類型的附加信息。如果省略,則使用0。
			當主寄存器的描述沒有指定<opcode2>時,必須省略它或指定0。如果指定了另一個值,則指令是不可預測的。
	3.指令使用時間
		
		在ARMv6之前,MCR和MRC指令只能在處理器處於特權模式時使用。如果它們在處理器處於用戶模式時執行,則會發生未定義的指令異常。
		
		如果需要通過用戶模式程序訪問特權系統控制協處理器功能,通常的解決方案是操作系統定義一個或多個swi來提供它。
		由於不同處理器上可用的內存和系統設施的精確設置可能有很大的差異,因此建議所有此類SWI均在易於更換的模塊中實現,並且該模塊的SWI接口被定義爲儘可能獨立於處理器細節。
		
		ARMv6引入了以下命令的用戶訪問:
			•預取刷新
			•數據同步屏障
			•數據存儲屏障
			•清除和預取範圍操作。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章