ARM裸機全集之ARM體系結構(學習筆記)

ARM體系結構與彙編指令
1.2.1 可編程器件的編程原理
1.2.1.1 電子器件的發展方向
模擬器件-數字器件
ASIC-可編程器件

1.2.1.2.可編程期間的特點
CPU在固定頻率的時鐘控制下節奏運行
CPU可以通過總線讀取外部存儲設備中的二進制指令集,然後解碼執行
這些可以被CPU解碼執行的二進制指令集是CPU設計的時候確定的,是CPU的設計者(ARM公司)定義的
本質是一串由0和1組成的數字,這就是CPU的彙編指令集


1.2.2 指令集對CPU的意義
1.2.2.1 彙編語言與C等高級語言的差別
彙編難寫,C好寫
彙編無可移植性,C語言有一定可移植性,Java等更高級語言移植性更強。
彙編語言效率最高,C語言次之,Java等更高級語言效率更低。
彙編不適合完成大型複雜的項目,更高級語言更適合完成更大、更復雜的項目。

1.2.2.2 編程語言的發展過程
純機器碼編程
彙編語言編程
C語言編程
C++語言編程
Java C#等語言編程
腳本語言編程

1.2.2.3 彙編語言的本質
彙編的實質是機器指令(機器碼)的助記符,是一種低級符號語言。
機器指令集是一款CPU的編程特徵,是這款CPU的設計者制定的。
CPU的內部電路設計就是爲了實現這些指令集的功能。機器指令集就好象CPU的API接口一樣。


總結:

1.可移植性
CPU的機器碼(機器指令集)在CPU的設計階段就已經定死了,不同的CPU擁有不同的機器碼。
而彙編語言的本質就是機器碼的助記符,通過彙編器翻譯成機器碼,所以彙編沒有可移植性。
C語言的可移植性是由編譯器決定的,在不同的操作系統上用不同的編譯器,就可以的到相同效果的彙編代碼。
2.何爲高級語言,何爲低級語言
語言越高級,越接近人的思維;越低級,越接近機器的思維。
語言越低級,工作效率越高(機器),語言越高級,工作效率越低,但越接近應用層(方便程序員使用),
相當於要完成同樣的機器動作,越高級的語言可以使用跟少的代碼,大大減輕了程序員的勞動。


1.2.3 RISC和CISC的區別
1.2.3.1 什麼是RISC、CISC
CISC(300條指令左右,Intel的奔騰)complex instruction computer複雜指令集計算機
最少的指令完成任務,一個功能一個指令,功耗高。
RISC(30條指令,ARM)Reduced Instruction-Set computer 精簡指令集計算機最基本的功能指令集,功耗低,讓軟件來完成具體的任務。


1.2.3.2 CPU的發展與RISC和CISC的關係
早期簡單CPU,指令和功能都很有限
CISC年代 —— CPU功能擴展依賴於指令集的擴展,實質是CPU內部組合邏輯電路的擴展。
RISC年代 —— CPU僅提供基礎功能指令(譬如內存與寄存器通信指令,基本運算與判斷指令等),功能擴展由使用CPU的人利用基礎架構來靈活實現。
總結:
RISC和CISC慢慢的趨向大一統.



1.2.4 統一編址&獨立編址&哈佛結構&馮諾依曼結構
1.2.4.1 IO(IO其實是CPU與外設的接口,可以習慣的認爲就是外設)
何爲內部或外部外設(本質就是有沒有在芯片內部)
IO與內存統一編址方式(把外設寄存器當作一個內存地址來讀寫,以訪問內存的方式訪問外設)
IO與內存獨立編址方式(通過CPU專用的指令來訪問外設,這就是CISC爲什麼有這麼多的指令了,每多一個外設,就要增加相應的指令。)


1.2.4.2 內存
ROM(Flash)、RAM
前者用來存放程序,後者用來存放數據
內存與CPU的關係
通過總線直接連接,能達到訪問的最大效率。

1.2.4.3 程序與數據
程序運行時兩大核心元素:程序 + 數據
程序是我們寫好的源代碼經過編譯、彙編之後得到的機器碼,這些機器碼可以拿給CPU去解碼執行,CPU不會也不應該去修改程序,所以程序是隻讀的。
數據是程序運行過程中定義和產生的變量的值,是可以讀寫的,程序運行實際就是爲了改變數據的值。

1.2.4.4 馮諾依曼結構與哈佛結構
馮諾依曼結構:程序與數據放在同樣的內存空間裏,彼此沒有界限,容易產生誤差,例如Intel的CPU就是採用的
馮諾依曼結構,所以它的內部程序是可以修改,計算機病毒就是利用了這一點
哈佛結構:程序與數據放在不同的內存塊中,雖然都在內存中,但他們的地址範圍都是固定的、彼此分離(ROM/RAM),CPU設計時
規定哪個範圍的內存地址中的二進制碼是可以讀寫,而哪個是隻讀的。譬如大部分的單片機(MCS51、ARM9等)均採用哈佛結構。



1.2.4.5 優劣對比
馮諾依曼結構中程序和數據不區分的放在一起,因此安全和穩定性是個問題,好處是處理起來簡單。
哈佛結構中程序(一般放在ROM、flash中)和數據(一般放在RAM中)獨立分開存放,因此好處是安全和穩定性高,缺點是軟件處理複雜一些(需要統一規劃鏈接地址等



1.2.5 軟件編程控制硬件的關鍵---寄存器
1.2.5.1 什麼是寄存器(他是外設的硬件組成部分,不是軟件)
寄存器屬於CPU外設的硬件組成部分
CPU可以像訪問內存一樣訪問寄存器
寄存器是CPU的硬件設計者制定的,目的是留作外設被編程控制的“活動開關”
正如彙編指令集是CPU的編程接口API一樣,寄存器是外設硬件的軟件編程接口API。
使用軟件編程控制某一硬件,其實就是編程讀寫該硬件的寄存器。

1.2.5.2 寄存器分類
SoC中有2類寄存器:通用寄存器和SFR
通用寄存器(ARM中有37個)是CPU的組成部分,CPU的很多活動都需要通用寄存器的支持和參與。
SFR(special function register,特殊功能寄存器)不在CPU中,而存在於CPU的外設中,
我們通過訪問外設的SFR來編程操控這個外設,這就是硬件編程控制的方法。

1.2.5.3 怎樣通過寄存器來控制硬件
編程操作寄存器類似於訪問內存
寄存器中每個bit位都有特定含義,因此編程操作時需要位操作。
單個寄存器的位寬一般和CPU的位寬一樣,以實現最佳訪問效率


1.2.6 ARM體系結構總結
ARM是RISC
常用ARM彙編指令只有二三十條
ARM是低功耗CPU
ARM的架構非常適合單片機、嵌入式,尤其是物聯網領域;而服務器等高性能領域目前主導還是Intel
ARM採用的是I/O與內存統一編址
ARM採用的是哈佛結構

1.2.7 S5PV210的地址映射詳解
1.2.7.1 什麼是地址映射
CPU的設計決定了他的地址總線,地址總線決定了尋址空間,尋址空間大小就是理想狀態的內存大小

1.2.7.2 專業術語
ROM:read only memory 只讀存儲器
RAM:ramdom access memory 隨機訪問存儲器
IROM:internal rom 內部ROM,指的是集成到SoC內部的ROM
IRAM:internal ram 內部RAM,指的是集成到SoC內部的RAM
DRAM:dynamic ram 動態RAM
SRAM,STATIC RANDOM ACCESS MEMORY  就是靜態隨即存儲器
SROM static read only memory 靜態只讀存儲器
ONENAND/NAND: 集合了NANDFlash和NORFlansh的有點(NOR Flash 和 NAND Flash 是現在市場上兩種主要的非易失閃存技術。)
SFR:special function register
總結:

會看memorry map ,
S5PV210:(記憶)
0x2000_0000 0x3FFF_FFFF  512MB  DRAM 0
0x4000_0000 0x7FFF_FFFF  1024MB DRAM 1
0xD000_0000 0xD000_FFFF  64KB   IROM


1.2.8 CPU和外部存儲器的接口
1.2.8.1 SoC常用外部存儲器
NorFlash
NandFlash
eMMC/iNand/moviNand
oneNAND
SD卡/TF卡/MMC卡
eSSD
SATA硬盤

1.2.8.2 X210開發板支持的外部存儲器
X210有2個版本,Nand版和iNand版,分別使用Nandflash和iNand爲外部存儲器。我們使用的是iNand版本,板載4GB iNand
S5PV210共支持4個SD/MMC通道,其中通道0和2依次用作啓動。X210開發板中SD/MMC0通道用於連接板載MMC,因此外部啓動時只能使用SD/MMC2通道(注意通道3不能啓動)。見《S5PV210_iROM_ApplicationNote_Preliminary_20091126.pdf》中P6

總結:

1、現代SoC支持多種外部存儲器
2、外部存儲器主要用來存儲程序(可執行代碼),相當於電腦的硬盤。
3、各種不同外部存儲器原理不同,大小、性價比不同,一般產品廠家根據需要選擇適合自己產品的外存使用。
4、外部存儲器和CPU連接一般不是通過地址&數據總線直接相連,因爲地址空間不夠用。一般都是通過專門的接口來連接的



1.2.9 S5PV210的啓動過程詳解
內存:
SRAM 靜態內存特點是容量小、價格高,優點是不需要軟件初始化直接上電就能用
DRAM 動態內存特點是容量大、價格低,缺點是上電後不能直接使用,需要軟件初始化纔可以使用
單片機中:內存需求量小,而且希望開發簡單,適合全部用SRAM 
嵌入式系統:內存需求量大,而且沒有NorFlash等啓動介質
PC機:內存需求量大,而且軟件複雜,不在乎DRAM的初始開銷,適合全部用DRAM

外存:
NorFlash:特點是容量小,價格高,優點是可以和CPU直接總線式相連,CPU上電後可以直接讀取,所以一般用作啓動介質
NandFlash(跟硬盤一樣):特點是容量大,價格低,缺點是不也不知道我們板子上將來接的是能總線式訪問,也就是說不能上電後CPU直接讀取,需要CPU運行一些初始化軟件,然後通過時序接口讀寫。

所以一般PC機都是:很小容量的BIOS(Norflash)+很大容量的硬盤(類似於NandFlash)+大容量的DRAM
一般的單片機:很小容量的NorFlash + 很小容量的SRAM
嵌入式系統:因爲NorFlash很貴,所以現在很多嵌入式系統傾向於不用NorFlash,直接用:外接的大容量Nand + 外接大容量DRAM + SoC內置SRAM


S5PV210的啓動過程: 外接的大容量Nand + 外接大容量DRAM + SoC內置SRAM210,還內置了一塊96KB的SRAM(IRAM),同時還有一塊內置64KB的NorFlash(IROM)

第一步:CPU上電後先從內部IROM中讀取預先設置的代碼,執行。這一段IROM代碼做了一些基本初始化(CPU時鐘、看門狗。。)(這一段IROM代碼是三星出廠前設置的,三星也不知道我們的板子將來接的是什麼DRAM);然後這段代碼會判斷我們的啓動模式(通過硬件跳線可以更改板子的啓動模式),然後從相應的外部存儲器去讀取第一部分代碼(BL1,大小爲16KB);到內部SRAM
第二步:從IRAM去運行剛上一步讀取來BL1,然後執行。BL1負責初始化NandFlash,然後將BL2讀取到I
RAM(剩餘的80kb),然後運行
第三步:從IRAM運行BL2,BL2初始化DRAM,然後將OS讀取到DRAM中,然後啓動os,啓動過程結束。

1.2.11 如何在開發板上選擇不同的啓式
SoC通過OMpin來識別外部啓動介質
 

體驗從SD0的eMMC啓動

開發板收到默認就是從eMMC啓動,內部預先燒錄了android。

 

 

從SD2啓動
可以使用外置SD卡從SD2通道啓動,但這需要先破壞板載的eMMC中的android鏡像。破壞方法見九鼎官方的裸機教程文檔《x210v3開發板裸機教程.pdf》中2.5.2節(P19)
OMpin設置和SD0啓動一樣

USB調試模式(101101 1xxxx1)


 

總結:
撥碼開關設置我們只需動OM5即可,其他幾個根本不需要碰。需要SD啓動時OM5打到GND,需要USB啓動時OM5打到VCC
可以先不銷燬eMMC中的android,而使用USB啓動來做裸機調試。之後課程中我們會使用USB啓動和SD卡啓動兩種方式共同來完成實驗,讓大家對比學習。

 

 

1.2.12 ARM的編程模式和7種模式
爲什麼要分7種模式

1.2.12.1 ARM的基本設定
ARM 採用的是32位架構.
ARM 約定:(不同的CPU有不同的約定,但Byte :8 bits是統一的)
Byte : 8 bits
Halfword :16 bits (2 byte)
Word : 32 bits (4 byte)


大部分ARM core 提供:
ARM 指令集(32-bit) 
Thumb 指令集(16-bit )
Thumb2指令集(16 & 32bit)
Jazelle cores 支持 Java bytecode

1.2.12.2 ARM處理器工作模式
ARM 有7個基本工作模式:
User : 非特權模式,大部分任務執行在這種模式


FIQ :   當一個高優先級(fast) 中斷產生時將會進入這種模式
IRQ :   當一個低優先級(normal) 中斷產生時將會進入這種模式
Supervisor :當復位或軟中斷指令執行時將會進入這種模式
Abort : 當存取異常時將會進入這種模式
Undef : 當執行未定義指令時會進入這種模式


System : 使用和User模式相同寄存器集的特權模式
注意: 
除User(用戶模式)是Normal(普通模式)外,其他6種都是Privilege(特權模式)
Privilege中除Sys模式外,其餘5種爲異常模式。
各種模式的切換,可以是程序員通過代碼主動切換(通過寫CPSR寄存器);也可以是CPU在某些情況下自動切換。
各種模式下權限和可以訪問的寄存器不同。

1.2.12.3 CPU爲什麼設計這些模式?
CPU是硬件,OS是軟件,軟件的設計要依賴硬件的特性,硬件的設計要考慮軟件需要,便於實現軟件特性。
操作系統有安全級別要求,因此CPU設計多種模式是爲了方便操作系統的多種角色安全等級需要。


1.2.13 ARM的37個寄存器詳解
1.2.13.1 ARM寄存器

                                            

這裏看到的就是ARM內核裏面的所有寄存器了,一共有37個。我們前面說過,ARM體系一共有7種模式,其中用戶模式和系統模式擁有物理空間上完全相同的寄存器,而其它5種異常模式都有一些自己獨立的寄存器。
我們看圖中左邊顯示的是當前模式的可見的寄存器,右邊顯示的是其它模式備用的寄存器。其中深藍色的部分爲當前模式與用戶模式共用的寄存器,而彩色部分爲各個寄存器獨立物理空間的寄存器。
這樣安排的好處是當各種異常發生的時候,每種異常模式都可以保存一些重要的數據,使異常處理程序完成之後返回異常前的程序時不會破壞原有的寄存器或狀態。
System模式使用user模式寄存器集
總結:
ARM共有37個寄存器,都是32位長度
37個寄存器中30個爲“通用”型,1個固定用作PC,一個固定用作CPSR,5個固定用作5種異常模式下的SPSR。


1.2.13.2 CPSR程序狀態寄存器


條件位:
N = Negative result from ALU 
Z = Zero result from ALU
C = ALU operation Carried out
V = ALU operation oVerflowed
Q 位:
僅ARM 5TE/J架構支持
指示飽和狀態
J 位
僅ARM 5TE/J架構支持
J = 1:  處理器處於Jazelle狀態
中斷禁止位:
I  = 1: 禁止  IRQ.
F = 1: 禁止  FIQ.
T Bit:
僅ARM  xT架構支持
T = 0: 處理器處於 ARM 狀態
T = 1: 處理器處於 Thumb 狀態
Mode位:處理器模式位


注意:
CPSR中各個bit位表明了CPU的某些狀態信息,這些信息非常重要,和後面學到的彙編指令息息相關(譬如BLE指令中的E就和CPSR中的Z標誌位有關)
CPSR中的I、F位和開中斷、關中斷有關
CPSR中的mode位(bit4~bit0共5位)決定了CPU的工作模式,在uboot代碼中會使用匯編進行設置。


1.2.13.3 PC(r15)程序控制寄存器
PC(Program control register)爲程序指針,PC指向哪裏,CPU就會執行哪條指令(所以程序跳轉時就是把目標地址代碼放到PC中)
整個CPU中只有一個PC(CPSR也只有一個,但SPSR有5個)。



1.2.14 ARM的異常處理方式簡單介紹


1.2.14.1 什麼是異常 
正常工作之外的流程都叫異常
異常會打斷正在執行的工作,並且一般我們希望異常處理完成後繼續回來執行原來的工作
中斷是異常的一種


1.2.14.2 什麼是異常向量表
所有的CPU都有異常向量表,這是CPU設計時就設定好的,是硬件決定的。
當異常發生時,CPU會自動動作(PC跳轉到異常向量處處理異常,有時伴有一些輔助動作)
異常向量表是硬件向軟件提供的處理異常的支持。


1.2.14.3異常的處理機制
當異常產生時, ARM core:
拷貝 CPSR 到 SPSR_<mode>(保存了Tbit的值,用於異常處理結束返回時,回到這個處理器狀態)
設置適當的 CPSR 位: 
改變處理器狀態進入 ARM 態
改變處理器模式進入相應的異常模式
設置中斷禁止位禁止相應中斷 (如果需要)
保存返回地址到 LR_<mode>
設置 PC 爲相應的異常向量

返回時, 異常處理需要:
從 SPSR_<mode>恢復CPSR
從LR_<mode>恢復PC 
Note:這些操作只能在 ARM 態執行.


總結:
異常處理中有一些是硬件自動做的,有一些是程序員需要自己做的。需要搞清楚哪些是需要自己做的,才知道如何寫代碼。
以上說的是CPU設計時提供的異常向量表,一般成爲一級向量表。有些CPU爲了支持多箇中斷,還會提供二級中斷向量表,處理思路類似於這裏說的一級中斷向量表。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章