一、ARM處理器簡介及RISC特點
ARM處理器簡介
ARM(Advanced RISC Machines)是一個32位RISC(精簡指令集)處理器架構,ARM處理器則是ARM架構下的微處理器。ARM處理器廣泛的使用在許多嵌入式系統。ARM處理器的特點有指令長度固定,執行效率高,低成本等。
RISC設計主要特點
1、指令集——RISC減少了指令集的種類,通常一個周期一條指令,采用固定長度的指令格式,編譯器或程序員通過幾條指令完成一個復雜的操作。而CISC指令集的指令長度通常不固定。
2、流水線——RISC采用單周期指令,且指令長度固定,便於流水線操作執行。
3、寄存器——RISC的處理器擁有更多的通用寄存器,寄存器操作較多。例如ARM處理器具有37個寄存器。
4、Load/Store結構——使用加載/存儲指令批量從內存中讀寫數據,提高數據的傳輸效率。
5、尋址方式簡化,指令長度固定,指令格式和尋址方式種類減少。
二、數據大小和指令集
用於ARM時:
半字(Halfword)表示16位(兩個字節)
字(Word)表示32位(四個字節)
雙字Doubleword表示64位(8字節)
大多數ARM實現兩個指令集
32位ARM指令集
16位Thumb指令集
最新的ARM內核引入了新的指令集Thumb-2
提供32位和16位指令的混合
保持代碼密度,增加靈活性
Jazelle-DBX內核也可以執行Java字節碼
三、ARM處理器存儲格式
32位的微處理器,ARM體系結構所支持的最大尋址空間為4GB,空間划分如下;
用戶空間(0—3G),這段空間映射到物理內存的高端內存
內核空間(3G—4G),這段空間映射到低端內存,這段空間又分為以下四部分,分別為
(a)直接映射區(0—896M):這段虛擬地址空間和低端內存地址存在線性的地址關系即虛擬地址3G+X=物理地址X
(b)動態映射區(896—1016M):這段 空間具體映射到物理內存的什么位置不確定,該區域的地址由內核中的vmalloc來實現 分配,其特點是虛擬地址空間連續,但是物理地址空間不一定連續。vmalloc函數返回的是虛擬地址,但是其映射的物理地址有可能在高端內存,也有可能在低端內存。
(c)永久內存映射區(pkmap1016—1020M):使用kmap函數將高端內存的地址映射到這部分區域,這樣就可以通過這個 虛擬地址來訪問高端內存的地址。通過這4M的窗口可以重復映射所有的高端內存。
(d)固定映射區:(1020—1024M):這4M的地址是有特定用途的固定地址,這4M的區域映射的物理內存作為ACPI電源管理等寄存器的地址。
ARM64架構處理器采用48位物理尋址,最大可以支持256T的地址空間,對於目前的應用來說已經足夠了。但是虛擬地址依然采用64,虛擬地址遠遠大於物理地址。所以在處理器架構設計上,把虛擬地址空間划分為三部分,分別為用戶空間,非規范區和內核空間,其中內核空間和用戶空間每個部分最大支持256T的訪問。
用戶空間:(0x0000_0000_0000_0000——0x0000_FFFF_FFFF_FFFF)256T
內核空間:(0xFFFF_0000_0000_0000——0xFFFF_FFFF_FFFF_FFFF)256T
其余部分被稱為非規范區域。
內核空間由做了詳細的划分,分為以下部分:
(a)Vmalloc區域:0xFFFF_0000_0000_0000——0xFFFF_7BFF_BFFF_0000(126974G)
(b)Vmemmap區域:0xFFFF_7BFF_C000_0000——0xFFFF_7FFF_C000_0000(4096G)
(c)PCI I/O區域:0xFFFF_7FFF_AE00_0000——0xFFFF_7FFF_BE00_0000(16M)
(d)Moudules區域:0xFFFF_7FFF_C000_0000——0xFFFF_8000_0000_0000(64M)
(e)Normal memory線性映射區:0xFFFF_8000_0000_0000——0xFFFF_FFFF_FFFF_FFFF(128T)
ARM體系結構可以用兩種方法存儲字數據,分別為大端模式和小端模式。
大端模式(高地高低):字的高字節存儲在低地址字節單元中,字的低字節存儲在高地址字節單元中。
小端模式(高高低低):字的高字節存儲在高地址字節單元中,字的低字節存儲在低地址字節單元中。
四、內核的工作模式:
ARM有七種基本操作模式:
每種模式都可以訪問自己的堆棧和不同的寄存器子集,某些操作只能在特權模式下執行
1、用戶模式(user):ARM正常程序執行模式,大多數應用程序/操作系統的模式
2、快速中斷模式(FIQ):高優先級的中斷產生會進入該種模式,用於高速通道傳輸;
3、外部中斷模式(IRQ):低優先級中斷產生會進入該模式,用於普通的中斷處理;
4、特權模式(SVC):CPU復位和軟中斷SWI指令會進入該模式;
5、數據訪問中止模式(Abort):當內存訪問沖突時會進入該模式;
6、系統模式(System): 用於運行特權級操作系統任務;
7、監控模式(Monitor):cortex-a8以上cpu特有的模式,主要用於安全方面;
8、未定義指令中止模式(Undefined):當未定義的指令執行時進入該模式,可用於支持硬件協處理器的軟件仿真。
用戶模式:
應用程序不能夠訪問受操作系統保護的系統資源。
應用程序不能進行處理器模式的切換。
系統模式
不屬於異常模式,不是通過異常進入的。
系統模式屬於特權模式,可以訪問所有的系統資源,也可以直接進行模式的切換。
主要供操作系統使用。
特權模式:
系統復位后進入管理模式,運行系統初始化程序,如中斷允許/禁止,完成各模式的堆棧設置主時鍾設置,SDRAM配置等。
當執行軟件中斷指令SWI時(比如開啟一個新的進程),進入管理模式 。
異常模式:除用戶模式和系統模式外的其他5種處理器模式
以各自的中斷或異常方式進入,並且處理各自的中斷或異常。
特權模式:除用戶模式外的其他6種處理器模式
特權程序可以訪問所有的系統資源,也可以任意的進行處理器模式的切換。
五、寄存器
(1)ARM Cortex-A8處理器有40個32位長的寄存器:
a、32個通用寄存器
b、7個狀態寄存器:1個CPSR(當前程序狀態寄存器)
6個SPSR(備份程序狀態寄存器)
c、1個PC(程序計數器)
(2)通用寄存器包括R0-R15,可以分為3類:
A、未分組寄存器R0 – R7:
在所有運行模式下,未分組寄存器都指向同一個物理寄存器,他們未被系統用作特殊的用途。因此在中斷或異常
處理進行異常模式轉換時,由於不同的處理器運行模式均使用相同的物理寄存器,所以可能造成寄存器中數據的破壞。
B、分組寄存器R8 – R14:
對於分組寄存器,他們每次所訪問的物理寄存器都與當前的處理器運行模式相關。
R13常用作存放堆棧指針,用戶也可以使用其他寄存器存放堆棧指針,稱為SP;
R14稱為鏈接寄存器(LR),當執行子程序時,R14可得到R15(PC)的備份,執行完子程序后,又將R14的值
復制回PC,即使用R14保存返回地址。
C、程序計數器PC(R15):
寄存器R15用作程序計數器(PC),在ARM狀態下,位[1:0]為0,位[31:2]用於保存PC;在Thumb狀態下,位[0]為0,
位[31:1]用於保存PC。對於ARM指令集而言,PC總是指向當前指令的下兩條指令的地址,即PC的值為當前指令的
地址值加8個字節。
(4)程序狀態寄存器:
CPSR(Current Program Status Register,當前程序狀態寄存器),CPSR可在任何運行模式下被訪問,它包括
條件標志位、中斷禁止位、當前處理器模式標志位以及其他一些相關的控制和狀態位。包含以下內容:
ALU狀態標志的備份;
當前的處理模式
中斷使能標志;
設置處理的狀態;
每一種運行模式下都有一個專用的物理狀態寄存器,稱為SPSR(Saved Program Status Register,備份的程序
狀態寄存器),當異常發生時,SPSR用於保存當前CPSR的值,從異常退出時則可由SPSR來恢復CPSR。
由於用戶模式和系統模式不屬於異常模式,這兩種狀態下沒有SPSR,因此在這兩種狀態下訪問SPSR,結果是未知的。
六、異常中斷
1、硬件中斷&軟件中斷:
硬件中斷是隨機的,不可預測的
軟件中斷是事先安排的(如workQueue、task)
2、ARM處理器有七種類型的異常::
(1)復位異常(Reset):處理器在工作時, 突然按下重啟鍵, 就會觸發該異常;
(2)數據異常(Data Abort):讀取數據失敗;
(3)快速中斷異常(FIQ):快速中斷要比普通中斷響應速度要快一些;
(4)外部中斷異常(IRQ):普通中斷;
(5)預取異常(Prefetch Abort):預取指令失敗, ARM 在執行指令的過程中, 要先去預取指令准備執行,
如果預取指令失敗, 就會產生該異常;
(6)軟中斷異常(SWI):軟件中需要去打斷處理器工作, 可以使用軟中斷來執行 ;
(7)未定義指令異常(Undefined Instruction):處理器無法識別指令的異常, 處理器執行的指令是有規范的,
如果嘗試執行不符合要求的指令, 就會進入到該異常指令對應的地址中;
當異常發生時,分組寄存器R14和SPSR用於保存處理器狀態,
異常返回時,SPSR內容恢復到SPSR,鏈接寄存器R14的內容恢復到程序計數器PC。
下圖中每種異常對應一種內核的工作模式,當然每種異常產生,內核都會進入特定的工作模式;
3、異常處理流程:
(1)中斷響應所做的工作:
A、保存短點:保存下一將要執行的指令的地址,也就是把這個地址送入堆棧;
B、尋找中斷入口:根據不同的中斷源產生的中斷,查找不同的入口地址;
C、執行中斷處理程序;
D、中斷返回:執行完中斷指令后,就從中斷返回到主程序繼續執行;
(2)異常向量表
每一個異常發生時,總是從異常向量表開始跳轉,所謂的異常向量表,是指由7個異常向量及其處理函數跳轉
關系組成的表:
0x00000000: b reset
0x00000004: ldr pc, _undefined_instruction
0x00000008: ldr pc, _software_interrupt
0x00000008: ldr pc, _software_interrupt
0x0000000c: ldr pc, _prefetch_abort
0x00000010: ldr pc, _data_abort
0x00000014: ldr pc, _not_used //保留
0x00000018: ldr pc, _irq
0x0000001c: ldr pc, _fiq
(3)當一個ARM異常返回時,需要完成如下任務:
通用寄存器的恢復;
狀態寄存器的恢復;
PC指針的恢復;
參考:https://blog.csdn.net/frank_zyp/article/details/84646051
https://blog.csdn.net/chengtong222/article/details/64440661