1. 程式人生 > >ARM體系結構(二)

ARM體系結構(二)

ARM體系結構第二篇,主要理解CPU的記憶體介面,ARM啟動過程。

記憶體對映

S5PV210屬於Cortex-A8架構,有32位地址線和32位資料線,所以CPU的地址空間為4G,但是由於使用了統一編址,外設佔用了一部分地址空間,實際供記憶體使用的地址空間將小於4G,那麼對於這個4G的地址空間的分配,就是記憶體對映,或者說叫地址對映,下圖是S5PV210的記憶體對映分佈圖,來自於使用者手冊:S5PV210,記憶體對映圖
記憶體分佈的描述:
S5PV210記憶體分佈描述

  • iROM:internal ROM,內部只讀儲存器,整合到SOC內部的ROM
  • iRAM:internal RAM,內部的隨機讀寫儲存器,整合到SOC內部的RAM
  • DRAM:動態RAM
  • SRAM:靜態RAM
  • ONENAND/NAND:ONENAND是三星發明的一種NAND Flash的變種,提高了一些存取特性
  • SFR:特殊功能暫存器

來看一下iROM段的記憶體分佈圖:
iROM段記憶體分佈
iROM用於存放程式碼,iRAM用於存放資料,所以iROM和iRAM之間用Not Available來分割開,也是哈佛結構的體現,我們還可以看到區分的有Secure和Not Secure區域。

外部儲存器介面

儲存器分類

記憶體:內部儲存器,用於程式執行空間,例如DRAM,SRAM,DDR
外存:用於儲存的ROM,例如硬碟,Flash,NAND,iNAND,ONENAND,U盤,SD卡,SSD,光碟等

儲存器訪問方式

記憶體需要直接訪問,所以通過地址匯流排和資料匯流排的方式直接連線來訪問,好處是隨機訪問速度快,但是佔用的匯流排位數多,訪問的空間有限,通過使用者手冊看出,DRAM0和DRAM1加起來,S5PV210的記憶體地址空間為1.5G,
外存不是通過地址匯流排來直接連線訪問的,而是通過外存介面來連線,不會佔用過多的記憶體地址空間,S5PV210的外存地址空間段為:0xB000_0000~0xBFFF_FFFF的ONENAND/NAND區域,通過外存介面可以擴充資料儲存容量,但是速度沒有記憶體快,訪問要分幾個週期,時序比較複雜

常用外部儲存器

  • NorFlash:可以匯流排方式訪問,可以接到CPU的地址空間中,以記憶體的方式來訪問,S5PV210就可以將一塊NorFlash接到SROMC_BANK區域,實現記憶體方式的匯流排訪問(網絡卡其實也可以接到這個SROMC_BANK區域來訪問),桌上型電腦上的BIOS其實就是一塊NorFlash,CPU如果要從NorFlash訪問,就需要這樣接入SROMC_BANK區域,
  • NandFlash:不能通過匯流排方式訪問,需要使用命令介面通過時序來訪問,iROM區域就是用於NAND Flash來啟動的,分為SLC和MLC兩種工藝
    • SLC:容量不大,價格高,時序簡單,訪問簡單,穩定性高
    • MLC:容量可以做很大,價格低,容易出現壞塊和位翻轉,需要做ECC校驗,訪問比較複雜
      • eMMC/iNand/moviNand:同屬於eMMC,iNAND是SanDisk出產的eMMC,moviNand是三星出產的eMMC
      • oneNand:三星出的Nand標準
      • SD/TF/MMC卡:同屬於SD卡系列
      • eSSD:屬於SSD固態硬碟的嵌入式MLC的NandFlash
    • SATA/IDE/SCSI硬碟:機械訪問,速度慢

S5PV210啟動

記憶體

  • SRAM:靜態記憶體,容量小,價格高,不需要軟體初始化,直接上電就可以使用
  • DRAM:容量大,價格低,就是我們平常見的DDR,上電後不能直接使用,需要軟體初始化

外存

NorFlash:容量小,價格高,可以通過匯流排直接訪問,上電後可以直接讀取,一般用作啟動介質
NandFlash:容量大,價格低,不能以匯流排方式訪問,上電之後需要通過軟體進行初始化,然後才能使用時序介面進行訪問

嵌入式系統啟動

嵌入式的啟動介質:外接NandFlash + 外接DRAM + 內建SRAM(iRAM)

S5PV210:210內建了96KB的iRAM(SRAM),和一塊64K的iROM(NorFlash),啟動過程如下

  • CPU上電後從iROM中讀取預先設定的程式碼(BL0),地址在:0xD000_0000~0xD000_FFFF,這段程式碼進行
    • 初始化指令Cache,堆,棧,塊裝置複製函式(讀取外部啟動方式),PLL和系統內部時鐘,關看門狗,複製BL1(16K)到iRAM中並檢查BL1的校驗和,安全啟動相關設定,並跳轉到BL1去執行
    • 這段程式碼在出廠前設定的,所以暫時還不能初始化NandFlash和DRAM,然後判斷我們通過硬體跳線設定的啟動模式,從相應的外部儲存器讀取啟動程式碼(bootloader)到iRAM中,但是一般啟動程式碼都超過了iRAM的96K的容量,三星的解決方案是把啟動程式碼分2部分,依次讀取:
  • BL1(可配置,最大16K):iRAM執行該段程式碼,來初始化Flash,然後把BL2讀取到iRAM中
  • BL2(佔用剩餘80K的空間):初始化DRAM,將OS讀取到DRAM中,從而啟動OS
  • 啟動方式可以根據這個圖來看:
  • 啟動方式圖
  • 啟動流程圖是這樣的:
  • 啟動流程圖
    • WakeUp status:復位狀態,深度休眠或者深度停止
    • OM pin:撥碼開關
  • 如果第一次啟動失敗,則會進行第二次啟動,第二次啟動會走SD卡的通道2,如下圖所示:
  • 第二次啟動流程
  • 如果SD卡通道2啟動失敗,則會執行UART啟動,
  • 如果UART啟動失敗,則會執行USB啟動,
  • 如果都失敗了,則徹底啟動失敗

開發板啟動方式選擇

通過OM pin可以設定啟動方式,通過配置pin來設定,具體設定如圖所示:
撥碼開關配置圖
對照圖片來設定。

ARM架構和工作模式

  • ARM採用32位架構
    • Byte:8bit
    • Halfword:16bit(2Byte)
    • Word:32bit(4Byte)
  • 大部分ARM提供三種指令集
    • ARM指令集(32bit)
    • Thumb指令集(16bit)
    • Thumb2指令集(16&32bit)
    • Jazelle Core還提供了Java ByteCode的支援
  • 7中工作模式
    • USER:非特權模式,大部分任務執行在這種模式下
    • FIQ:快速中斷模式,高優先順序的中斷產生時會進入這種模式
    • IRQ:中斷模式,普通中斷產生時進入這種模式
    • SUPERVISOR:復位或者軟中斷指令被執行時進入這種模式
    • ABORT:存取異常時進入這種模式
    • UNDEF:執行到未定義指令時進入這種模式
    • SYSTEM:系統模式,核心執行在這種模式下,使用和USER模式相同的暫存器
    • 除USER是Normal模式之外,其他都是Privilege特權模式
    • 除SYSTEM之外其他特權模式都是異常模式
    • 可以通過寫CPSR暫存器主動切換模式,也可以由CPU自動切換
    • 各種模式下許可權和可訪問的暫存器是不一樣的

ARM內部通用暫存器

ARM的CPU內部有17個基本通用暫存器,根據不同的工作模式可以定義成37個暫存器,每個暫存器都是32位,相對於其他裝置的SFR來說,會更復雜一些,通用型暫存器通過暫存器的名字來訪問:
暫存器描述
每種模式下最多看到18個暫存器,其他暫存器雖然名字相同,但都屬於該模式的專用暫存器,在當前模式看不見。
例如USER模式下的r13(sp)和r14(lr),是不重複的,是使用者模式專用的暫存器,這兩個暫存器在模式切換的時候是不需要考慮重複問題的,所有模式下的暫存器見下圖:
ARM暫存器描述圖

CPSR程式狀態暫存器

該暫存器一共32bit
- 0~4是模式位,表示處理器的7中模式之一
- 5是T位,切換處理器狀態,0是ARM狀態,1是Thumb狀態
- 6~7分別表示I,F中斷禁止位,I= 1,禁止IRQ,F= 1,禁止FIQ
- 8~23未定義
- 24是J位,處理Jazelle狀態,J = 1,支援Jazelle,僅支援ARM 5TE/J架構
- 25~26未定義
- 27是Q位,指示飽和狀態,Q = 1,飽和,僅支援ARM 5TE/J架構
- 28~31是V,C,Z,N條件位:
- V = 1:表示ALV運算溢位
- C = 1:表示ALV運算的進位標識位溢位
- Z = 1:表示ALV運算得到了一個0
- N = 1:表示ALV運算得到了一個Negative負結果

PC程式狀態暫存器

  • 稱為程式指標,PC指向哪裡,CPU就會執行哪條指令,
  • 例如程式跳轉時把目標地址放在PC中,
  • 整個CPU只有一個PC

ARM異常處理方式

異常

異常是指程式在執行過程中,發生了正常工作之外的流程,異常會打斷正在執行的工作,且希望異常處理完成之後回來繼續進行原來的工作,中斷也是異常的一種,7中工作模式中除了USER和SYSTEM之外的工作模式都是用來處理異常。

異常向量表

  • 異常向量表是CPU處理異常的手段,所有CPU都有異常向量表,屬於硬體設計範圍,
  • 當異常發生時,CPU會自動動作,由PC跳向異常向量處(異常處理地址)來處理異常,有時還會伴隨一系列輔助動作,
  • 異常向量表是硬體想軟體提供的處理異常的支援

ARM異常處理機制

  • 當異常產生時,ARM Core需要:
    • 拷貝CPSR到SPSR_<對應模式>
    • 設定適當的CPSR
      • 改變處理器狀態進入ARM狀態
      • 改變處理器模式進入相應的異常模式
      • 設定中斷禁止位禁止響應中斷,以防異常處理被打斷
    • 儲存返回地址到LR_<對應模式>
    • 設定PC為相應的異常向量
  • 當異常返回時,ARM Core需要
    • 從SPSR_<對應模式>恢復CPSR
    • 從LR_<對應模式>恢復PC
    • 以上操作都在ARM狀態進行
  • 異常處理有一些是CPU自動動作,有一些是需要程式設計師手動操作的,CPU設計時提供的異常向量表,一般屬於一級向量表,有的CPU為了支援多箇中斷,還會提供二級向量表,處理的方式和一級向量表類似。