国产精品免费无遮挡无码永久视频-国产高潮视频在线观看-精品久久国产字幕高潮-国产精品99精品无码视亚

查看: 4682|回復(fù): 1
打印 上一主題 下一主題

ARM寄存器、工作模式和指令集

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2015-8-3 14:53:00 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
本章介紹ARM處理器的基礎(chǔ)特性,包括寄存器工作模式指令集的細(xì)節(jié)。我們也會(huì)涉及一些處理器實(shí)現(xiàn)細(xì)節(jié),包括指令流水線分支預(yù)測(cè)
  ARMv7架構(gòu)是一個(gè)32位處理器架構(gòu)。它是一種load/store架構(gòu),意味著數(shù)據(jù)處理指令操作通用寄存器中的值。只有加載(load)和存儲(chǔ)(store)指令訪問(wèn)存儲(chǔ)器。通用存儲(chǔ)器也是32位的。本書中,字(word)代表32位,雙字(doubleword)代表64位,半字(halfword)代表16位寬。

  盡管ARMv7架構(gòu)是一種32位架構(gòu),單獨(dú)的處理器對(duì)所有模塊和內(nèi)部連接的實(shí)現(xiàn)不一定必須都是32位寬。例如,對(duì)于指令獲取和數(shù)據(jù)訪問(wèn),具有64位或更寬的路徑是可能的。

  實(shí)現(xiàn)ARMv7-A架構(gòu)的處理器不具有由架構(gòu)固定的存儲(chǔ)器映射。處理器能訪問(wèn)4GB的虛擬地址空間,存儲(chǔ)器和外設(shè)都可以在那個(gè)空間范圍之內(nèi)自由地映射。我們將會(huì)在第9章和第10章中講述存儲(chǔ)器管理,那里我們會(huì)看到緩存和內(nèi)存管理單元(MMU)。


4.1 指令集

  大多數(shù)ARM處理器支持超過(guò)一種指令集:
 >ARM--- 一種32位指令集
 >Thumb--- 一種16位指令集,具有更好的代碼密度(但是相比ARM代碼,性能有所降低)在程序的控制之下,處理器可以在這兩種指令集之間來(lái)回切換。
所有的Cortex-A系列處理器實(shí)現(xiàn)了Thumb-2技術(shù),它擴(kuò)展了Thumb指令集。混合使用32位和16位指令,以Thumb指令集的代碼密度和接近ARM指令集的性能。自從所有的Cortex-A系列處理器支持這一擴(kuò)展,針對(duì)它們的軟件常被編譯成Thumb指令集。(本文作者注:按照文章《如何使用Thumb-2改善代碼密度和性能》所述,Thumb-2代碼大小約為ARM代碼的74%,性能則為其98%)
4.2 模式

  ARM架構(gòu)有9種處理器模式,在表4-1中所總結(jié)。有8種特權(quán)模式一種非特權(quán)模的用戶模式。在用戶模式,在某些操作上具有限制,例如MMU訪問(wèn),修改操作模式是一種特權(quán)操作。注意,模式與異常事件有聯(lián)系,將會(huì)在第12章異常處理中講述。


4.3 寄存器

  ARM架構(gòu)具有一批通用寄存器,提供處理器內(nèi)部的數(shù)據(jù)存儲(chǔ)。除了通用寄存器,還有R15程序計(jì)數(shù)器,和包含ALU標(biāo)志位與其它執(zhí)行狀態(tài)信息的程序狀態(tài)寄存器。這些寄存器中很多是分組的,那就是,除非是在特定處理器模式,否則處理器不能訪問(wèn)。當(dāng)進(jìn)入一個(gè)不同的處理器模式,這些分組的寄存器自動(dòng)地切入和換出。每個(gè)異常模式(不包括系統(tǒng)模式)附加有一個(gè)備份程序狀態(tài)寄存器,包含一份異常觸發(fā)時(shí)程序狀態(tài)寄存器的拷貝。


因此,在圖4-1中,如果處理器是在IRQ模式,我們可以看見(jiàn)R0,R1...R12(與在用戶模式看到的相同的寄存器),加上SP_IRQ和LR_IRQ(僅在IRQ模式中可以訪問(wèn)的寄存器)和R15(程序計(jì)數(shù)器,PC)。我們通常不必指定模式中的寄存器名。如果我們?cè)谝恍写a中引用R13,處理器會(huì)訪問(wèn)當(dāng)前模式對(duì)應(yīng)的SP寄存器

  在用戶模式程序狀態(tài)寄存器(CPSR)的受限形式被稱為應(yīng)用程序狀態(tài)寄存器(APSR)。R15是程序計(jì)數(shù)器,保持當(dāng)前程序地址(實(shí)際上,在ARM狀態(tài),它總是指向提前8個(gè)字節(jié)當(dāng)前指令的位置;在Thumb狀態(tài),它總是指向提前4個(gè)字節(jié)當(dāng)前指令的位置)。

  我們可以寫值到PC以修改程序流。LR鏈接寄存器,存放函數(shù)或異常的返回地址。R13,通常被用作堆棧指針R0-R12通用寄存器。一些16位Thumb指令可訪問(wèn)的寄存器受限---可訪問(wèn)的子集被稱為低寄存器(low registers),由R0-R7組成。圖4-2顯示了對(duì)通用數(shù)據(jù)處理指令可見(jiàn)的寄存器子集。


 R0-R14的復(fù)位值不可預(yù)測(cè)。堆棧指針(SP),在使用堆棧之前,必須被啟動(dòng)代碼初始化。AAPCS或AEABI(見(jiàn)第17章 應(yīng)用二進(jìn)制接口)指定了軟件應(yīng)該如何使用通用寄存器,為了不同工具鏈或編程語(yǔ)言之間的互操作。

4.3.1 程序狀態(tài)寄存器
  程序狀態(tài)寄存器形成了一組額外的分組寄存器集。每中異常模式有它自己的備份程序狀態(tài)寄存器(Saved Program Status Register ,SPSR),當(dāng)一個(gè)異常發(fā)生時(shí)自動(dòng)保存一份異常前CPSR拷貝

  《ARM架構(gòu)參考手冊(cè)》(ARM Architecture Reference Manual)描述了程序狀態(tài)是如何在32位應(yīng)用程序狀態(tài)寄存器(Application Program Status Register ,APSR)中報(bào)告的,其它狀態(tài)和控制位(系統(tǒng)級(jí)信息)任然保留在CPSR。本書中涉及的ARMv7-A架構(gòu)APSR實(shí)際上同CPSR是相同的寄存器,盡管它們有分開的名字。APSR只能訪問(wèn)N/Z/C/V/Q和GE[3:0]位。這些位通常不能直接訪問(wèn),由條件代碼設(shè)置指令設(shè)置,并由有條件執(zhí)行的指令測(cè)試。重命名因此是嘗試清理舊的ARM架構(gòu)中CPSR的混合訪問(wèn),圖4-3顯示了CPSR的組成。


  獨(dú)立位代表如下:
 > N --- 來(lái)自ALU的負(fù)結(jié)果
 > Z --- 來(lái)自ALU的零結(jié)果
 > C --- ALU操作進(jìn)位
 > V --- ALU操作溢出
 > Q --- 累積飽和
 > J --- 指示處理器是否在加速狀態(tài)
 > GE[3:0] --- 由一些SIMD指令使用
 > IT[7:2] --- Thumb-2指令組的If-Then條件執(zhí)行
 > E --- 控制load/store字節(jié)序
 > A --- 禁止異步中止
 > I --- 禁止IRQ
 > F --- 禁止FIQ
 > T --- 指示處理器是否在Thumb狀態(tài)
 > M[4:0] --- 指定處理器模式(FIQ,IRQ等)
  處理器可以在模式間切換通過(guò)指令直接寫CPSR模式位(用戶模式不能)。更為常見(jiàn)的,處理器修改模式異常事件的結(jié)果
4.4 指令流水線
  指令流水線是一種被用于處理器設(shè)計(jì)的技術(shù),提升指令的吞吐量。信息的處理由一連串對(duì)輸入數(shù)據(jù)不同的操作組成。為了優(yōu)化性能,處理器核被設(shè)計(jì)為級(jí)聯(lián)的基本功能單元塊,每個(gè)塊由前面單元的輸出作為輸入:在每個(gè)時(shí)鐘,單元N處理單元N-1的輸出數(shù)據(jù)。這么選擇主要的原因是簡(jiǎn)單的處理塊能夠比復(fù)雜的運(yùn)行得快,因此流水線的結(jié)構(gòu)能夠讓數(shù)字電路設(shè)計(jì)工作在GHz時(shí)鐘頻率。每個(gè)指令從一步移動(dòng)到另一步,通過(guò)幾個(gè)時(shí)鐘周期。
每個(gè)流水線階段處理執(zhí)行一個(gè)指令過(guò)程的一部分,因此在給定的任何時(shí)鐘周期,一些不同的指令可能會(huì)在流水線的不同階段。處理器的總體速度由最慢一步的速度決定,這比執(zhí)行所有步驟需要的時(shí)間極大地減少。一個(gè)非流水線架構(gòu)較為低效,因?yàn)樘幚砥鲀?nèi)一些模塊會(huì)在指令執(zhí)行期間被閑置。

經(jīng)典的流水線由三個(gè)階段組成 --- 取指、譯碼和執(zhí)行,如圖4-4中所示。更為普遍地,一個(gè)指令流水線會(huì)被分成下面廣泛的定義:
 > 指令預(yù)取:決定將會(huì)被獲取指令在內(nèi)存中的位置,執(zhí)行相關(guān)總線訪問(wèn)
 > 指令獲取:從內(nèi)存系統(tǒng)中讀取讀取將被執(zhí)行的指令
 > 指令譯碼:得出將被執(zhí)行的指令,為數(shù)據(jù)路徑生成合適的控制信號(hào)
 > 寄存器獲取:提供正確的寄存器值
 > 發(fā)出:發(fā)出指令到合適的執(zhí)行單元
 > 執(zhí)行:實(shí)際的ALU或乘法器操作等
 > 內(nèi)存訪問(wèn):執(zhí)行數(shù)據(jù)加載或存儲(chǔ)
 > 寄存器寫回:用結(jié)果更新處理器寄存器
  在單獨(dú)的處理器實(shí)現(xiàn)時(shí),這些步驟的一些可被組合成一個(gè)單一的流水線階段,或一些步驟可被分布在幾個(gè)周期。較長(zhǎng)的流水線意味著每個(gè)流水線之間的關(guān)鍵路徑中更少的邏輯門,從而更快地執(zhí)行。然而,典型地指令之間會(huì)有依賴。如果一個(gè)指令依賴于前一指令的結(jié)果,控制邏輯需要插入位置(或泡沫)到流水線,直到依賴解決。需要附加的邏輯來(lái)檢測(cè)和解決這樣的依賴。

  一般來(lái)說(shuō),ARM架構(gòu)試圖對(duì)編程者隱藏流水線影響。這意味著,編程者只能通過(guò)閱讀處理器手冊(cè)來(lái)決定流水線結(jié)構(gòu)。然而,一些流水線工件仍然存在。例如,程序計(jì)數(shù)器寄存器(R15)在ARM狀態(tài)時(shí),指向超前于當(dāng)前正執(zhí)行指令兩個(gè)指令的指令,最初ARM1處理器三階段流水線的遺留物。

  長(zhǎng)流水線一個(gè)更近一步的缺點(diǎn)是有時(shí)來(lái)自內(nèi)存的指令的串行執(zhí)行會(huì)被打斷。這可能會(huì)發(fā)生在一個(gè)分支指令執(zhí)行的結(jié)果,或被一個(gè)異常事件(例如一個(gè)中斷)。當(dāng)此發(fā)生時(shí),處理器無(wú)法決定下一條應(yīng)該被獲取指令的正確位置,直到分支被解決。在典型的代碼中,很多分支指令是有條件的,作為循環(huán)或者if聲明的結(jié)果。因此,分支是否會(huì)被執(zhí)行不能再指令獲取時(shí)決定。如果我們獲取的指令緊跟著一個(gè)分支,并且分支被執(zhí)行,流水線必須清空,來(lái)自分支目的地的指令新指令集必須從內(nèi)存獲取。隨著流水線變長(zhǎng),分支懲罰的代價(jià)變得更高
 Cortex-A系列處理器具有分支預(yù)測(cè)邏輯,目的是減少分支懲罰的影響。本質(zhì)上,處理器預(yù)測(cè)一個(gè)分支是否會(huì)被執(zhí)行,獲取的指令要么來(lái)自緊跟分支之后的指令(如果預(yù)測(cè)表明條件分支不會(huì)被執(zhí)行),要么來(lái)自分支的目標(biāo)指令(如果預(yù)測(cè)表明分支會(huì)被執(zhí)行)。如果預(yù)測(cè)正確,分支不會(huì)清空流水線如果預(yù)測(cè)錯(cuò)誤,流水線必須清空,并且獲取來(lái)自正確位置的指令來(lái)充填。我們將在下面的分支預(yù)測(cè)里看到更多細(xì)節(jié)。

4.4.1 多發(fā)布流水線

  一個(gè)精致的處理器流水線是我們可以有超過(guò)一個(gè)硬件單元來(lái)處理流水線階段。在ARM11處理器家族,例如,有三個(gè)并行后端流水線 --- 一個(gè)ALU流水線,一個(gè)load/store流水線和一個(gè)乘法流水線。指令可被發(fā)布進(jìn)這些中的任何流水線。這個(gè)想法的一個(gè)合乎邏輯的發(fā)展是,有多個(gè)執(zhí)行硬件的實(shí)例 --- 例如兩個(gè)ALU流水線。我們就可以在一個(gè)周期發(fā)布超過(guò)一個(gè)指令到這些并行流水線 --- 一個(gè)指令級(jí)并行的例子。這樣的處理器被稱為超標(biāo)量體系結(jié)構(gòu)(superscalar)Cortex-A8,Cortex-A9和Cortex-A15處理器超標(biāo)量處理器 --- 它們可以在一個(gè)時(shí)鐘周期中潛在地譯碼和發(fā)布超過(guò)一個(gè)指令。Cortex-A5和Cortex-A7處理器相對(duì)受限制,只能雙發(fā)射特定指令的組合 --- 例如,一個(gè)分支和一個(gè)數(shù)據(jù)處理指令可以在同一周期內(nèi)發(fā)布。指令仍然從內(nèi)存中的串行指令流中發(fā)布。需要額外的硬件邏輯來(lái)檢查指令間的依賴性,例如,在一個(gè)指令必須等待其它指令結(jié)果的情況下。
  亂序執(zhí)行為提升流水線效率提供了空間。如果指令被串行執(zhí)行,一個(gè)指令在下一個(gè)處理之前完全退休。在亂序處理中,多內(nèi)存訪問(wèn)可以是立刻顯著的,并且可以以不同的順序完成。

  經(jīng)常地一個(gè)指令必須停滯,由于依賴(例如,需要使用來(lái)自前面指令的結(jié)果)。我們可以執(zhí)行下面的沒(méi)有共享這一依賴的指令,提供指令之間的邏輯危害是嚴(yán)格推崇的。Cortex-A9Cortex-A15處理器使用這一技術(shù)實(shí)現(xiàn)非常高等級(jí)的效率和指令吞吐量。它們可以被認(rèn)為是可變長(zhǎng)度的流水線,因?yàn)榱魉長(zhǎng)度取決于一個(gè)指令使用的后端執(zhí)行流水線。它們可以獨(dú)立地執(zhí)行指令,并且在每個(gè)時(shí)鐘可以譯碼兩個(gè)指令,但是有在一個(gè)獨(dú)立時(shí)鐘周期發(fā)布最高四條指令的能力。這可以提高性能,如果流水線已經(jīng)變得暢通,前面由于一些原因停滯了。
4.4.2 寄存器重命名
  Cortex-A9處理器有一個(gè)有趣的微架構(gòu)實(shí)現(xiàn),使用了一個(gè)寄存器重命名方案。作為標(biāo)準(zhǔn)ARM架構(gòu)一部分的寄存器集對(duì)程序員可見(jiàn),但是處理器的硬件實(shí)現(xiàn)實(shí)際上有一個(gè)更為大的物理寄存器池,邏輯上動(dòng)態(tài)地映射程序員可見(jiàn)寄存器到物理寄存器。圖4-5顯示了分開的架構(gòu)寄存器池和物理寄存器池。

考慮一種情況,代碼寫一個(gè)寄存器的值到外部存儲(chǔ)器緊接著其后讀取一個(gè)不同外部存儲(chǔ)器位置的值到相同的寄存器。這在前面的處理器中可能會(huì)引起流水線停滯,盡管在此特殊的例子中,沒(méi)有實(shí)際上的數(shù)據(jù)依賴。寄存器重命名避免這個(gè)問(wèn)題,通過(guò)確保兩個(gè)R0實(shí)例被重命名到不同的物理寄存器,移除了依賴。這允許了一個(gè)編譯器或匯編程序員在沒(méi)有內(nèi)部指令之間的依賴時(shí),重用寄存器,而不需要考慮因?yàn)橹赜眉拇嫫鲗?dǎo)致的架構(gòu)上的懲罰。重要的是,這允許了write-after-write和write-after-read序列的亂序執(zhí)行。(write-after-write的危害出現(xiàn)在兩個(gè)獨(dú)立的指令寫值到相同的寄存器。處理器必須確保來(lái)自這兩條指令之后的指令看到的是后一條指令的結(jié)果)

  為避免與標(biāo)志位設(shè)置和比較相關(guān)的指令間的依賴,APSR標(biāo)志也使用相同的技術(shù)
4.5 分支預(yù)測(cè)
  如我們已看到的,分支預(yù)測(cè)邏輯在Cortex-A系列處理器中對(duì)實(shí)現(xiàn)高吞吐量是一個(gè)重要的因素。沒(méi)有分支預(yù)測(cè),我們不得不等待知道一個(gè)條件分支執(zhí)行,在我們能夠決定獲取下一條指令位置之前。

  一個(gè)條件跳轉(zhuǎn)指令第一次被獲取時(shí),沒(méi)有關(guān)于下一條指令地址的可依賴信息。舊的ARM處理器使用靜態(tài)分支預(yù)測(cè)。這是最簡(jiǎn)單的分支預(yù)測(cè)方法,因?yàn)?/font>它不需要關(guān)于分支的先前信息。我們推測(cè)向后的分支會(huì)被采用向前的分支不會(huì)。向后的分支具有一個(gè)目標(biāo)地址,低于它自己的地址。我們因此可以看一個(gè)單一的操作位來(lái)決定分支方向。這個(gè)技術(shù)可以給與合理的預(yù)測(cè)精度,歸因于代碼中循環(huán)的普遍,循環(huán)代碼總是包含后向分支,并且后向總比前向多很多。由于Cortex-A系列處理器的流水線長(zhǎng)度,我們通過(guò)使用更為復(fù)雜的給予更好預(yù)測(cè)精度的分支預(yù)測(cè)方法,可以獲得更好的性能。

  動(dòng)態(tài)分支預(yù)測(cè)可以進(jìn)一步減少平均分支懲罰,通過(guò)使用在前面執(zhí)行時(shí)條件分支是否被采用的歷史信息Cortex-A8處理器中的分支目標(biāo)地址緩存(Branch Target Address Cache ,BTAC),也稱為分支目標(biāo)緩沖(Branch Target Buffer ,BTB),是一個(gè)緩存保存有前次分支指令執(zhí)行的信息。它使得硬件能夠推測(cè)一個(gè)條件分支是否會(huì)被采用。
  處理器仍然必須評(píng)估附帶在分支指令上的條件代碼。如果分支預(yù)測(cè)硬件預(yù)測(cè)正確,流水線不必停滯。如果分支預(yù)測(cè)硬件評(píng)估錯(cuò)誤,處理器必須清空流水線并充填它。
4.5.1 返回堆棧(return stack)
  在分支預(yù)測(cè)中的描述看到了處理器可以用于預(yù)測(cè)分支是否會(huì)被采用的策略。對(duì)絕大多數(shù)分支指令,目標(biāo)地址固定并編碼在指令中。然而,有一類分支,分支目標(biāo)的目的地不能通過(guò)看指令決定。例如,如果我們執(zhí)行一個(gè)數(shù)據(jù)處理操作,它修改了PC(例如,MOV,ADD or SUB),我們必須等待ALU來(lái)評(píng)估結(jié)果,在我們能夠直到分支目標(biāo)之前。類似的,如果我們從內(nèi)存加載PC,使用一個(gè)LDR,LSM,或POP指令,我們不能知道目標(biāo)地址直到加載完成。

  通常,這樣的分支(常稱為間接分支)不能在硬件上被預(yù)測(cè)。然而,有一個(gè)常見(jiàn)的情況可以很有用地被優(yōu)化,在預(yù)取硬件中使用一個(gè)后進(jìn)先出堆棧(return stack)。任何時(shí)候一個(gè)函數(shù)調(diào)用(BL或BLX)指令被執(zhí)行,我們進(jìn)入壓入接下來(lái)的指令到這個(gè)堆棧。任何時(shí)候當(dāng)我們遇到一個(gè)指令,它可以被識(shí)別為函數(shù)返回指令(BX LR,或一個(gè)在寄存器列表中包含PC的堆棧pop操作),我們可以投機(jī)地從堆棧pop一個(gè)條目硬件比較指令生成的地址和堆棧預(yù)測(cè)的地址。如果未命中,流水線被清空,我們從正確的位置重新開始。
更多詳情可咨詢老師:電話18365409359QQ3311615775深圳(南山+民治+龍崗+西鄉(xiāng)),廣州,鄭州,長(zhǎng)沙,南寧八大實(shí)訓(xùn)基地統(tǒng)一授課中!!


沙發(fā)
發(fā)表于 2015-8-4 06:15:27 | 只看該作者

本版積分規(guī)則

關(guān)于我們  -  服務(wù)條款  -  使用指南  -  站點(diǎn)地圖  -  友情鏈接  -  聯(lián)系我們
電子工程網(wǎng) © 版權(quán)所有   京ICP備16069177號(hào) | 京公網(wǎng)安備11010502021702
快速回復(fù) 返回頂部 返回列表