ARM是知識(shí)產(chǎn)權(quán)(IP)供應(yīng)商纤壁,不制造芯片叁丧,也不出售芯片,而是轉(zhuǎn)讓設(shè)計(jì)方案冈止。ARM架構(gòu)是ARM公司第一款低成本RISC微處理器狂票。
RISC結(jié)構(gòu)特性
ARM內(nèi)核采用精簡(jiǎn)指令集計(jì)算機(jī)體系結(jié)構(gòu)(RISC),其指令集和相關(guān)的譯碼機(jī)制比復(fù)雜指令集計(jì)算機(jī)(CISC)要簡(jiǎn)單熙暴。
其目標(biāo)是闺属,設(shè)計(jì)出一套能在高時(shí)鐘頻率下,單周期執(zhí)行周霉,簡(jiǎn)單而有效的指令集掂器。
其設(shè)計(jì)的重點(diǎn),在于降低處理器中指令執(zhí)行部件的硬件復(fù)雜度俱箱,這是因?yàn)檐浖扔布菀滋峁└蟮撵`活性和更高的智能化国瓮,因此ARM具備了非常典型的RISC結(jié)構(gòu)特性:
大量通用的寄存器;
通過裝載/保存(load-store)結(jié)構(gòu),使用獨(dú)立的load和store指令完成數(shù)據(jù)在寄存器與外部存儲(chǔ)器之間的傳送,處理器只處理寄存器中的數(shù)據(jù)乃摹,從而避免多次訪問存儲(chǔ)器;
尋址方式簡(jiǎn)單禁漓,所有裝載/保存的地址都只由寄存器內(nèi)容和指令域決定;
使用統(tǒng)一和固定長(zhǎng)度的指令格式;
ARM體系存儲(chǔ)系統(tǒng)
ARM處理器采用馮.諾依曼結(jié)構(gòu),因此指令和數(shù)據(jù)共用一條32位總線孵睬,因此只有裝載播歼、存儲(chǔ)和交換指令可以對(duì)存儲(chǔ)器中的數(shù)據(jù)進(jìn)行訪問。
ARM規(guī)范僅僅定義了其處理器內(nèi)核與存儲(chǔ)器系統(tǒng)之間的信號(hào)掰读,以及局部總線秘狞,而實(shí)際的芯片(CPU芯片,而不是指內(nèi)核)一般在外部總線與處理器核的局部總線之間有一個(gè)存儲(chǔ)器管理部件:
負(fù)責(zé)將局部總線的信號(hào)和時(shí)序轉(zhuǎn)換為現(xiàn)實(shí)的外部總線信號(hào)和時(shí)序蹈集。
因此烁试,外部總線的信號(hào)和時(shí)序與具體的芯片相關(guān),而不是ARM規(guī)范定義的標(biāo)準(zhǔn)雾狈。具體的某個(gè)芯片的外部存儲(chǔ)系統(tǒng)的設(shè)計(jì)廓潜,需要參考其芯片的使用手冊(cè)。
對(duì)ARM來說善榛,它將存儲(chǔ)器看成是一個(gè)從0開始的線性遞增的字節(jié)集合:
字節(jié)0-3保存第1個(gè)存儲(chǔ)的字辩蛋;
字節(jié)4-7保存第2個(gè)存儲(chǔ)的字;
字節(jié)8-11保存第3個(gè)存儲(chǔ)的字移盆;
……
ARM處理器可以將存儲(chǔ)器中的字以兩種格式存儲(chǔ):? 大端格式和小端格式悼院。前者高位數(shù)據(jù)存取低地址,低位數(shù)據(jù)存入高地址咒循。后者反之据途。
地址空間
ARM結(jié)構(gòu)使用2的32次方個(gè)8位字節(jié)的地址空間,字節(jié)地址從:0到2∧32-1叙甸。
地址空間同樣也可以看作是2∧30個(gè)32位字颖医,地址則以字為單位進(jìn)行分配。就是將字節(jié)地址除以4裆蒸,如此熔萧,地址為A的字包含4個(gè)字節(jié),其地址分別為A僚祷、A+1佛致、A+2、A+3辙谜。
地址空間還可以看做包含2∧31個(gè)16位半字俺榆,地址是按照半字分配。地址為A的半字装哆,包含兩個(gè)字節(jié): A和A+1罐脊。
地址的計(jì)算通常通過普通的 整數(shù)指令 實(shí)現(xiàn)定嗓。這意味著,若地址向上或向下溢出地址空間通常會(huì)發(fā)生反轉(zhuǎn)爹殊,也就是說計(jì)算的結(jié)果以2∧32為模蜕乡。如果地址的計(jì)算沒有發(fā)生翻轉(zhuǎn),那么結(jié)果仍然位于0-2∧32-1范圍內(nèi)梗夸。
大多數(shù)指令都是通過指令所指定的偏移量與PC值相加并將結(jié)果寫入PC來計(jì)算目標(biāo)地址。若用公式
PC+偏移值=[(當(dāng)前程序執(zhí)行位置)+8]+偏移量
來確定溢出地址空間号醉,那么該指令依賴于地址的翻轉(zhuǎn)反症。由此可見,在技術(shù)上是不可預(yù)測(cè)的畔派,因此程序應(yīng)該保證穿過地址0xFFFF FFFF的向前轉(zhuǎn)移和穿過地址0x0000 0000的向后轉(zhuǎn)移的情況都不發(fā)生铅碍。
此外正常連續(xù)執(zhí)行的指令,實(shí)際上是通過“當(dāng)前程序執(zhí)行位置+4”來確定下一條將要執(zhí)行的指令线椰。
存儲(chǔ)器的字與半字
ARM處理器直接支持8位字節(jié)胞谈,16位半字或32位字的數(shù)據(jù)類型。其中憨愉,以能被4整除的地址開始連續(xù)的4個(gè)字節(jié)構(gòu)成1個(gè)字烦绳,字的數(shù)據(jù)類型為4個(gè)連續(xù)的字節(jié)。從偶數(shù)地址開始連續(xù)的兩個(gè)字節(jié)構(gòu)成一個(gè)半字配紫,半字的數(shù)據(jù)類型為2個(gè)連續(xù)的字節(jié)径密。ARM的指令的長(zhǎng)度剛好是一個(gè)字,而Thumb指令的長(zhǎng)度剛好為一個(gè)半字躺孝。
字對(duì)齊與非字對(duì)齊
如果數(shù)據(jù)以字的方式存儲(chǔ)享扔,那么它就是字對(duì)齊。否則就是非字對(duì)齊植袍。如果一個(gè)數(shù)據(jù)是以半字方式存儲(chǔ)的惧眠,那么它就是半字對(duì)齊,否則就是非半字對(duì)齊于个。
表半字與字對(duì)齊
ARM處理器是直接支持 對(duì)齊存放的半字或字?jǐn)?shù)據(jù)的存取氛魁,就是說可用一條相應(yīng)的指令來實(shí)現(xiàn)對(duì)應(yīng)操作:
。
程序執(zhí)行效率
如果訪問非對(duì)齊的半字或字?jǐn)?shù)據(jù)览濒,將需要多條指令組合 才能實(shí)現(xiàn)對(duì)應(yīng)的操作呆盖,這個(gè)弊端就很明顯了,這會(huì)大大地影響程序的執(zhí)行效率贷笛,因此应又,在C語言編程中,定義的多字節(jié)變量或結(jié)構(gòu)體乏苦,最好使其為對(duì)齊存放株扛。對(duì)齊存放的目的就是為提高代碼的執(zhí)行效率尤筐,而減少執(zhí)行指令數(shù)。
存儲(chǔ)器格式
地址空間要求洗地址A的規(guī)則:
位于地址A的字所包含的字節(jié)位于A洞就、A+1盆繁、A+2、A+3旬蟋。
上面并不能完全定義字油昂、半字和字節(jié)之間的映射,存儲(chǔ)系統(tǒng)使用以下兩種映射機(jī)制的其中一種:小端存儲(chǔ)器系統(tǒng)
大端存儲(chǔ)器系統(tǒng)