如何看待ARM的各種模式?
ARM工作模式根據(jù)功能不同,可分為7類:
User Mode:用戶模式。操作系統(tǒng)的Task一般以這種模式執(zhí)行。User Mode是ARM的非特權(quán)模式,這表示如果CPU處于這種模式下,很多指令將不能夠執(zhí)行,因此操作系統(tǒng)的資源得以保護(hù)。
System Mode:這是V4及其以上版本所引入的特權(quán)模式。
IRQ Mode:中斷模式。中斷(不包括軟中斷)處理函數(shù)在這種模式下執(zhí)
ARM工作模式根據(jù)功能不同,可分為7類:
User Mode:用戶模式。操作系統(tǒng)的Task一般以這種模式執(zhí)行。User Mode是ARM的非特權(quán)模式,這表示如果CPU處于這種模式下,很多指令將不能夠執(zhí)行,因此操作系統(tǒng)的資源得以保護(hù)。
System Mode:這是V4及其以上版本所引入的特權(quán)模式。
IRQ Mode:中斷模式。中斷(不包括軟中斷)處理函數(shù)在這種模式下執(zhí)行。
FIQ Mode:快速中斷模式。除了多了幾個(gè)寄存器外,其他同IRQ一樣。
Supervisor Mode:監(jiān)視模式。軟中斷(SWI)處理函數(shù)在這種模式下執(zhí)行。
Abort Mode:所有同內(nèi)存保護(hù)相關(guān)的異常均在這種模式下執(zhí)行。
Undefined Mode:處理無(wú)效指令的異常處理函數(shù)在這種模式下執(zhí)行。
ARM工作模式也可分為3大類:
用戶模式:User Mode
系統(tǒng)模式:System Mode
異常模式:所有其它5種模式
為什么可以把7類功能不同的模式分為3大類呢?
這是由于異常模式同用戶模式和系統(tǒng)模式有一個(gè)不一樣的地方,那就是,當(dāng)CPU產(chǎn)生中斷或異常而自動(dòng)切換到相應(yīng)異常模式后,CPU會(huì)根據(jù)產(chǎn)生中斷或異常的原因執(zhí)行相應(yīng)得中斷或異常向量。這些向量的位置是CPU事先定義好的,目前有兩種選擇:
(1) 處于內(nèi)存低地址0x00000000~0x0000001c,這種情況被稱之為L(zhǎng)ow vector
(2) 處于內(nèi)存高低之0Xffff0000~0xffff001c,這種情況被稱之為High vector。
一般的操作系統(tǒng)會(huì)在這些異常向量地址處放置一條跳轉(zhuǎn)指令。至于到底是使用Low vector,還是使用High vector,由CPU自己決定,ARM規(guī)范不做任何限制。
程序可以通過(guò)讀取CPSR的MODE域來(lái)判斷CPU當(dāng)前的執(zhí)行模式。
如何看待ARM的各種模式?
要回答這個(gè)問(wèn)題,我們要看不同模式下,有哪些東西不同。歸納來(lái)說(shuō),有如下兩個(gè)方面的不同:
(1) 物理寄存器不同
(2) 權(quán)限不同
如果將User Mode作為參考模式,那么:
(1) System Mode:寄存器一樣,僅僅是權(quán)限不同
(2) 其他Exception Mode:寄存器不一樣,權(quán)限也不一樣
從權(quán)限的角度看,System Mode和其他Exception Mode(FIQ,IRQ,Supervisor,Abort,Undefined)是一樣的,他們之間的區(qū)別僅僅是寄存器方面有一些差別。
從寄存器角度看,我們可以將CPSR中的MODE域看作一個(gè)類似于片選的東西,當(dāng)其值不一樣,所選中的寄存器也不一樣。
雖然指令中的寄存器是一樣的,但是經(jīng)過(guò)MODE域的片選后,實(shí)際就指向不同的物理寄存器了。
必須要特別注意,SYSTEM模式和USER模式除了權(quán)限不一樣外,其他都一樣,這樣可以讓操作系統(tǒng)自由訪問(wèn)16個(gè)寄存器(包括狀態(tài)寄存器)。
那么,模式切換是如何進(jìn)行的呢?
(1) 執(zhí)行SWI或Reset指令。如果在User模式下執(zhí)行SWI指令,CPU就進(jìn)入Supervisor模式。當(dāng)然,在其它模式下執(zhí)行SWI指令,也會(huì)進(jìn)入Supervisor模式,補(bǔ)過(guò)一般操作系統(tǒng)不會(huì)這么做。因?yàn)槌薝ser模式是非特權(quán)模式下,其他模式都屬于特權(quán)模式(這說(shuō)明ARM只有兩種執(zhí)行態(tài),不想Dummy的X86,定義了4種執(zhí)行態(tài))。執(zhí)行SWI一般是為了訪問(wèn)系統(tǒng)資源,在特權(quán)模式下可以訪問(wèn)所有的系統(tǒng)資源。SWI指令一般用來(lái)用來(lái)為操作系統(tǒng)提供API接口。
(2) 有外部中斷發(fā)生。如果發(fā)生了外部中斷,CPU就會(huì)進(jìn)入IRQ或FIQ模式,具體是哪種模式,得看外部的中斷源是接到CPU的那個(gè)Pin。
(3) CPU執(zhí)行過(guò)程中產(chǎn)生異常。典型的異常是由于MMU保護(hù)所引起的內(nèi)存訪問(wèn)異常,此時(shí)CPU會(huì)切換到Abort模式。如果是無(wú)效指令,則會(huì)進(jìn)入U(xiǎn)ndefined模式。
從上面我們發(fā)現(xiàn),有一種模式是CPU無(wú)法自動(dòng)進(jìn)入的,這種模式就是System模式。要進(jìn)入System模式必須由程序員自己編寫(xiě)指令來(lái)實(shí)現(xiàn)。其實(shí)很簡(jiǎn)單,在任何特權(quán)模式下改變CPSR的MODE域?yàn)镾ystem模式所對(duì)應(yīng)得數(shù)字即可。進(jìn)入System模式一般是為了利用“System 模式”和“User 模式”下的寄存器是一樣的。因此一般操作系統(tǒng)在通過(guò)SWI進(jìn)入Supervisor模式后,做一些簡(jiǎn)單處理后,就進(jìn)入System模式。
另外,在任何特權(quán)模式下,都可以通過(guò)修改CPSR的MODE域而進(jìn)入其他模式。不過(guò)需要注意的是,由于修改的CPSR是該模式下的影子CPSR,因此并不是實(shí)際的CPSR,所以一般的做法是修改影子CPSR,然后執(zhí)行一個(gè)MOVS指令來(lái)恢復(fù)執(zhí)行到某個(gè)斷點(diǎn)并切換到新模式。
存儲(chǔ)器格式(字對(duì)齊)
Arm體系結(jié)構(gòu)將存儲(chǔ)器看做是從零地址開(kāi)始的字節(jié)的線性組合。從零字節(jié)到三字節(jié)放置個(gè)存儲(chǔ)的字(32位)數(shù)據(jù),從第四個(gè)字節(jié)到第七個(gè)字節(jié)放置第二個(gè)存儲(chǔ)的字?jǐn)?shù)據(jù),排列。作為32位的微處理器,arm體系結(jié)構(gòu)所支持的尋址空間為4GB。
存儲(chǔ)器格式:
1、大端格式:高字節(jié)在低地址,低字節(jié)在高地址;
2、小端格式:高字節(jié)在高地址,低字節(jié)在低地址;
指令長(zhǎng)度: Arm微處理器的指令長(zhǎng)度是32位的,也可以為16位(thumb狀態(tài)下)。Arm微處理器中支持字節(jié)(8位),半字(16位),字(32位)三種數(shù)據(jù)類型,其中,字需要4字節(jié)對(duì)齊,半字需要2字節(jié)對(duì)齊。
注:所謂的指令長(zhǎng)度是一條完整的指令的長(zhǎng)度,而不是單純的mov這3個(gè)字母長(zhǎng)度。
ARM體系的CPU有兩種工作狀態(tài)
1、ARM狀態(tài):處理器執(zhí)行32位的字對(duì)齊的ARM指令;
2、Thumb狀態(tài):處理器執(zhí)行16位的、半字對(duì)齊的Thumb指令;
在程序運(yùn)行的過(guò)程中,可以在兩種狀態(tài)之間進(jìn)行相應(yīng)的轉(zhuǎn)換。處理器工作狀態(tài)的轉(zhuǎn)變并不影響處理器的工作模式和相應(yīng)寄存器中的內(nèi)容。CPU上電處于ARM狀態(tài)。
寄存器
ARM有31個(gè)通用的32位寄存器,6個(gè)程序狀態(tài)寄存器,共分為7組,有些寄存器是所有工作模式共用的,還有一些寄存器專屬于每一種工作模式:
R13——棧指針寄存器,用于保存堆棧指針;
R14——程序連接寄存器,當(dāng)執(zhí)行BL子程序調(diào)用指令時(shí),R14中得到R15的備份,而當(dāng)發(fā)生中斷或異常時(shí),R14保存R15的返回值;
R15——程序計(jì)數(shù)器;
快速中斷模式有7個(gè)備份寄存器R8—R14,這使得進(jìn)入快速中斷模式執(zhí)行很大部分程序時(shí),甚至不需要保存任何寄存器;其它特權(quán)模式都含有兩個(gè)獨(dú)立的寄存器副本R13、R14,這樣可以令每個(gè)模式都擁有自己的堆棧指針和連接寄存器。
當(dāng)前程序狀態(tài)寄存器(CPSR)
CPSR中各位意義如下:
T位:1——CPU處于Thumb狀態(tài), 0——CPU處于ARM狀態(tài);
I、F(中斷禁止位): 1——禁止中斷, 0——中斷使能;
工作模式位:可以改變這些位,進(jìn)行模式切換。