ARM內核與寄存器

ARM內核與寄存器詳解

目錄

  • ARM架構概述
  • ARM處理器模式
    • Cortex-M3內核的處理器模式
    • Cortex-A系列處理器模式
  • ARM寄存器集
    • 通用寄存器
    • 程序計數器(PC)
    • 鏈接寄存器(LR)
    • 堆棧指針(SP)
    • 狀態寄存器(CPSR/SPSR)
  • 協處理器寄存器
  • NEON和VFP寄存器
  • 寄存器使用規范
  • 常見ARM指令與寄存器操作

ARM架構概述

ARM(Advanced RISC Microprocessor)是一種RISC(精簡指令集計算機)處理器架構,最初由Acorn計算機公司設計,現在由ARM公司開發和授權。由于其低功耗和高性能特性,ARM處理器廣泛應用于移動設備、嵌入式系統和物聯網設備。

ARM架構已經發展了多個版本,從ARMv1到最新的ARMv9,不同版本引入了不同的功能和改進。主要的架構系列包括:

  • Cortex-A系列:應用處理器,用于高性能系統
  • Cortex-R系列:實時處理器,用于需要快速響應的系統
  • Cortex-M系列:微控制器,用于低功耗嵌入式設備

ARM處理器模式

ARM處理器有多種操作模式,每種模式有不同的寄存器可見性和權限級別:

模式描述進入方式
用戶模式普通程序執行程序正常運行
系統模式特權操作系統任務軟件切換
管理模式系統保護模式軟件中斷
中止模式處理內存訪問違例數據或指令預取中止
未定義模式處理未定義指令遇到未定義指令
快速中斷模式高優先級中斷處理FIQ中斷
中斷模式中斷處理IRQ中斷

Cortex-M3內核的處理器模式

注意:Cortex-M3內核采用了簡化的處理器模式系統,與傳統ARM架構不同。Cortex-M3主要有兩種運行模式:

  1. 線程模式(Thread Mode) - 用于運行應用程序代碼
  2. 處理器模式(Handler Mode) - 用于處理所有異常

Cortex-M3還引入了特權級別的概念:

  • 特權訪問 - 可訪問所有系統資源
  • 非特權訪問 - 受限制的資源訪問

以下是Cortex-M3中不同情況的模式對應關系:

傳統ARM模式Cortex-M3對應情況實際例子
用戶模式線程模式(非特權)運行普通應用程序代碼,如循環計算任務
系統模式線程模式(特權)操作系統執行特權操作,如初始化外設、配置MPU
管理模式通過SVC異常進入Handler模式應用程序調用SVC指令請求操作系統服務,如SVC #0切換任務
中止模式MemManage異常進入Handler模式程序訪問MPU禁止的內存區域;設置了只讀區域但嘗試寫入
未定義模式UsageFault異常進入Handler模式執行了未支持的浮點指令;除零操作;未對齊的內存訪問
快速中斷模式沒有直接對應,所有中斷進入Handler模式EXTI外部中斷;高優先級的ADC轉換完成中斷
中斷模式沒有直接對應,所有中斷進入Handler模式UART接收完成中斷;SysTick系統定時器中斷
Cortex-M3異常處理示例:
  1. 硬故障(HardFault)例子

    • 程序嘗試執行未映射內存區域的代碼
    • 訪問了未對齊的內存地址
    • 在中斷處理過程中出現嵌套錯誤
  2. SVC(管理模式)例子

    // 通過SVC調用請求操作系統服務
    __asm("SVC #42");  // 調用42號系統服務,例如RTOS切換任務
    
  3. BusFault例子

    // 訪問無效的外設地址
    volatile uint32_t *ptr = (uint32_t *)0x60000000; // 假設這是無效總線地址
    *ptr = 0x1234;  // 觸發BusFault異常
    
  4. 使用故障例子

    // 未對齊的訪問(如果啟用了對齊檢查)
    volatile uint32_t *ptr = (uint32_t *)0x20000001; // 非4字節對齊地址
    *ptr = 0x1234;  // 觸發UsageFault異常
    

Cortex-A系列處理器模式

Cortex-A系列處理器保留了傳統ARM架構的7種處理器模式,并增加了安全擴展和虛擬化擴展模式。以下是Cortex-A核在不同情況下的模式例子:

模式Cortex-A對應情況實際例子
用戶模式低特權應用程序手機上運行的普通APP;Linux用戶空間程序
系統模式高特權操作系統代碼操作系統內核執行特權任務;驅動程序操作硬件
管理模式系統調用處理應用程序通過SWI/SVC請求系統服務;Android的Binder調用
中止模式內存訪問違例處理程序訪問受MMU保護的內存區域;Linux中的段錯誤(SIGSEGV)
未定義模式處理未識別指令程序執行平臺不支持的指令;嘗試執行NEON指令但硬件不支持
快速中斷模式高優先級外設中斷DMA傳輸完成;高速存儲器控制器中斷;顯示刷新中斷
中斷模式普通外設中斷處理觸摸屏輸入;按鍵中斷;傳感器數據就緒中斷
監視模式TrustZone安全世界安全認證;指紋處理;支付系統隔離
虛擬機模式虛擬化支持(ARMv7-A)虛擬機管理程序;Docker容器環境切換
Cortex-A與Cortex-M主要區別:
  1. 處理器模式實現:

    • Cortex-A: 完整的7種模式+擴展模式,通過CPSR控制
    • Cortex-M: 簡化為線程模式和處理器模式兩種,通過異常入口管理
  2. 特權級別:

    • Cortex-A: 通過處理器模式區分特權
    • Cortex-M: 明確的特權/非特權狀態區分
  3. 異常處理:

    • Cortex-A: 使用向量表+模式切換
    • Cortex-M: 統一的異常機制,自動保存/恢復上下文
Cortex-A異常處理示例:
// Cortex-A中的異常向量表設置
// 通常在匯編啟動文件中定義
void vectors(void) __attribute__((section("vectors")));
void vectors(void) {asm("b reset_handler");      // 復位處理asm("b undefined_handler");  // 未定義指令asm("b svc_handler");        // 軟件中斷(SVC)asm("b prefetch_handler");   // 取指中止asm("b data_handler");       // 數據中止asm("b unused_handler");     // 未使用asm("b irq_handler");        // 中斷asm("b fiq_handler");        // 快速中斷
}// SVC示例 - Linux系統調用
int main() {int result;// 調用write系統調用(4號)asm("mov r0, #1");          // 文件描述符1(stdout)asm("ldr r1, =message");    // 消息緩沖區asm("mov r2, #13");         // 消息長度asm("mov r7, #4");          // write系統調用號asm("swi #0");              // 執行系統調用asm("mov %0, r0" : "=r" (result));return 0;
}

ARM寄存器集

通用寄存器

ARM架構提供16個32位通用寄存器(R0-R15),其中R13-R15有特殊用途:

寄存器別名描述使用約定
R0-通用寄存器第一個函數參數,函數返回值
R1-R3-通用寄存器函數參數
R4-R11-通用寄存器需在函數調用間保存
R12IP程序內部暫存寄存器過程調用中臨時使用
R13SP堆棧指針指向當前堆棧頂部
R14LR鏈接寄存器保存子程序返回地址
R15PC程序計數器指向當前執行指令

程序計數器(PC)

PC寄存器(R15)保存當前執行指令的地址。在ARM狀態下,PC指向當前指令地址+8;在Thumb狀態下,PC指向當前指令地址+4。

使用方法:

  • 讀取PC獲得當前指令附近的地址
  • 向PC寫入值實現跳轉
MOV R0, PC      @ 獲取當前PC值
MOV PC, LR      @ 從子程序返回

鏈接寄存器(LR)

LR寄存器(R14)用于存儲子程序返回地址。當執行BL(分支并鏈接)指令時,返回地址被自動保存到LR中。

使用方法:

  • 調用子程序前保存LR(如果子程序內還會調用其他函數)
  • 子程序返回時將LR的值復制到PC
PUSH {LR}       @ 保存返回地址
BL subroutine   @ 調用子程序
POP {PC}        @ 恢復返回地址并返回

堆棧指針(SP)

SP寄存器(R13)指向當前堆棧頂部。ARM通常采用滿遞減(Full Descending)堆棧,即SP指向最后一個已入棧的數據項。

使用方法:

  • PUSH操作前先減少SP,再存儲
  • POP操作先加載,再增加SP
PUSH {R0-R3}    @ 將R0-R3壓入堆棧
POP {R0-R3}     @ 從堆棧彈出到R0-R3

狀態寄存器(CPSR/SPSR)

當前程序狀態寄存器(CPSR)和保存的程序狀態寄存器(SPSR)包含處理器狀態信息。

CPSR字段:

  • 條件標志(N,Z,C,V):用于條件執行
  • 控制位:處理器模式、中斷禁用標志、指令集狀態等

條件標志:

  • N(負數):結果為負
  • Z(零):結果為零
  • C(進位):產生進位
  • V(溢出):有符號溢出
CMP R0, R1      @ 比較R0和R1,設置條件標志
ADDPL R0, R0, #1 @ 如果結果非負(N=0)則執行加法

協處理器寄存器

ARM架構支持協處理器擴展,包括CP15系統控制協處理器。CP15寄存器控制緩存、MMU、系統控制和配置。

訪問方法:

MRC p15, 0, R0, c1, c0, 0  @ 讀取CP15 c1寄存器到R0
MCR p15, 0, R0, c1, c0, 0  @ 寫入R0到CP15 c1寄存器

NEON和VFP寄存器

現代ARM架構包含NEON和VFP(向量浮點)擴展,提供額外的寄存器用于SIMD和浮點運算:

  • 32個64位寄存器(D0-D31)
  • 也可視為16個128位寄存器(Q0-Q15)
VMOV.F32 S0, #1.0        @ 加載浮點常量到S0
VADD.F32 S0, S0, S1      @ 浮點加法
VLDM R0, {D0-D3}         @ 加載多個64位寄存器

寄存器使用規范

ARM架構定義了AAPCS(ARM架構過程調用標準)規范:

  • R0-R3:參數傳遞和結果返回,調用者保存
  • R4-R11:局部變量,被調用者保存
  • R12(IP):內部過程調用暫存,調用者保存
  • R13(SP):堆棧指針,被調用者保存
  • R14(LR):鏈接寄存器,被調用者保存
  • R15(PC):程序計數器

參數傳遞機制

當函數參數超過4個時,ARM采用以下策略:

  • 前4個參數通過R0-R3寄存器傳遞
  • 額外的參數通過棧傳遞,從右到左入棧
  • 參數在棧上按照4字節對齊
  • 被調用者負責從棧上獲取額外參數

示例:調用有6個參數的函數func(a, b, c, d, e, f)

MOV R0, #1          @ 第一個參數 a
MOV R1, #2          @ 第二個參數 b
MOV R2, #3          @ 第三個參數 c
MOV R3, #4          @ 第四個參數 d
PUSH {R5, R6}       @ 將第五和第六個參數入棧 (f先入棧,e后入棧)
MOV R5, #6          @ 第六個參數 f (先入棧)
MOV R6, #5          @ 第五個參數 e (后入棧)
PUSH {R5, R6}
BL func             @ 調用函數
ADD SP, SP, #8      @ 調用完成后恢復棧(清理參數)

對于返回值:

  • 32位或更小的返回值保存在R0中
  • 64位返回值使用R0和R1
  • 更大的結構體通過引用返回,調用者提供內存地址作為隱式第一個參數

常見ARM指令與寄存器操作

數據處理指令:

MOV R0, R1          @ R0 = R1
ADD R0, R1, R2      @ R0 = R1 + R2
SUB R0, R1, #1      @ R0 = R1 - 1
AND R0, R1, #0xFF   @ R0 = R1 & 0xFF

內存訪問指令:

LDR R0, [R1]        @ 從R1指向的地址加載到R0
STR R0, [R1, #4]    @ 存儲R0到R1+4指向的地址
LDMIA R1!, {R0-R4}  @ 多寄存器加載,遞增后更新R1
STMDB R13!, {R0-R3} @ 多寄存器存儲,遞減前更新R13

分支指令:

B label             @ 無條件分支
BL function         @ 分支并鏈接(調用子程序)
BX LR               @ 分支并切換狀態(常用于返回)
CMP R0, #0          @ 比較R0與0
BEQ zero_label      @ 相等時分支

條件執行:

ADDEQ R0, R0, R1    @ 當Z=1時執行加法
MOVNE R0, #0        @ 當Z=0時執行賦值

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/75318.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/75318.shtml
英文地址,請注明出處:http://en.pswp.cn/web/75318.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Git 拉取時常見沖突及解決方法總結

Git 拉取時常見沖突及解決方法總結 一、常見錯誤場景1. 本地修改與遠程修改沖突解決方法 2. 未跟蹤文件與遠程文件沖突解決方法 3. 子模塊權限問題解決方法 二、總結 在日常開發中,使用 Git 進行團隊協作和代碼管理時,經常會遇到拉取代碼(git…

深度學習、圖像算法學習記錄

深度學習加速 綜述文檔: https://chenzomi12.github.io/02Hardware01Foundation/02ArchSlim.html winograd: https://zhuanlan.zhihu.com/p/260109670 ncnn 1.修改模型結構,優化模型內存訪問次數,加速。 VGG 和 InceptionNet : …

Java中的Exception和Error有什么區別?還有更多擴展

概念 在Java中,Exception和Error都是Throwable的子類,用于處理程序中的錯誤和異常情況。 然而,它們在用途和處理方式上有顯著的不同: Exception: 用于表示程序在正常運行過程中可能出現的錯誤,如文件未找…

文章記單詞 | 第26篇(六級)

一,單詞釋義 actor:名詞,演員mask:名詞,面具;口罩;遮蓋物;動詞,掩飾;戴面具;遮蓋construct:動詞,建造;構造&a…

LeetCode算法題(Go語言實現)_38

題目 給定一個二叉樹, 找到該樹中兩個指定節點的最近公共祖先。 一、代碼實現 type TreeNode struct {Val intLeft *TreeNodeRight *TreeNode }func lowestCommonAncestor(root, p, q *TreeNode) *TreeNode {if root nil || root p || root q {return root}left : lowes…

Java 基礎語法、Java注釋

Java 基礎語法 一個 Java 程序可以認為是一系列對象的集合,而這些對象通過調用彼此的方法來協同工作。下面簡要介紹下類、對象、方法和實例變量的概念。 對象:對象是類的一個實例,有狀態和行為。例如,一條狗是一個對象,它的狀態有:顏色、名字、品種;行為有:搖尾巴、叫…

用VScode來編寫前后端——構建基礎框架

前言 我寫這一個板塊的原因是我參加了我們學校的新生項目課,需要創立一個系統,我們小組選的標題的基于計算機視覺的商品識別系統,那么我們需要一個網站來展示我們的功能,故寫這些來記錄一下自己,大家如果有什么問題的話…

git clone阻塞問題

問題描述 git clone采用的ssh協議,在克隆倉庫的時候,會經常卡一下,亦或是直接卡死不動。 最開始以為是公司電腦配置的問題,想著自己實在解決不了找it幫忙。 查閱資料發現,最終發現是git版本的問題,這個是…

WEB攻防-Java安全JNDIRMILDAP五大不安全組件RCE執行不出網不回顯

目錄 1. RCE執行-5大類函數調用 1.1 Runtime方式 1.2 Groovy執行命令 1.3 腳本引擎代碼注入 1.4 ProcessImpl 1.5 ProcessBuilder 2. JNDI注入(RCE)-RMI&LDAP&高版本 2.1 RMI服務中的JNDI注入場景 2.2 LDAP服務中的JNDI注入場景 攻擊路徑示例&#…

【Hadoop入門】Hadoop生態之Sqoop簡介

1 什么是Sqoop? 在企業的數據架構中,關系型數據庫與Hadoop生態系統之間的數據流動是常見且關鍵的需求。Apache Sqoop(SQL-to-Hadoop)正是為解決這一問題而生的高效工具,它專門用于在結構化數據存儲(如RDBMS…

如何自動檢測使用的組件庫有更新

🤖 作者簡介:水煮白菜王,一位前端勸退師 👻 👀 文章專欄: 前端專欄 ,記錄一下平時在博客寫作中,總結出的一些開發技巧和知識歸納總結?。 感謝支持💕💕&#…

Go語言編寫一個進銷存Web軟件的demo

Go語言編寫一個進銷存Web軟件的demo 用戶現在要求用。之前他們已經討論了用Django實現的方案,現在突然切換到Go,可能有幾個原因。首先,用戶可能對Go語言感興趣,或者他們公司的技術棧轉向了Go。其次,用戶可能希望比較不…

【前綴和】矩陣區域和(medium)

矩陣區域和(medium) 題?描述:解法:代碼Java 算法代碼:C 算法代碼: 題?描述: 題?鏈接:1314. 矩陣區域和 給你?個 m x n 的矩陣 mat 和?個整數 k ,請你返回?個矩陣 …

Java學習手冊:Java發展歷史與版本特性

Java作為全球最流行的編程語言之一,其發展歷程不僅見證了技術的演進,也反映了軟件開發模式的變革。從1995年的首次發布到如今的持續更新,Java始終保持著強大的生命力和廣泛的影響力。本文將簡要回顧Java的發展歷程,并重點介紹其關…

winserver2022備份

安裝備份,然后等待安裝完成即可 然后可以在這里看到安裝好的win server2022備份 一直下一步然后到這里 不要用本地文件夾備份 備份到遠程服務器,遠程服務器路徑 然后確定備份即可 如何恢復呢? 點擊右側的恢復就可以了 打開任務計劃程序 這…

Unity 設置彈窗Tips位置

根據鼠標位于屏幕的區域&#xff0c;設置彈窗錨點以及位置 public static void TipsPos(Transform tf) {//獲取ui相機var uiCamera GetUICamera();var popup tf.GetComponent<RectTransform>();//獲取鼠標位置Vector2 mousePos Input.mousePosition;float screenWidt…

【C++基礎-關鍵字】:extern

深入理解 C++ 關鍵字 extern 在 C++ 編程中,extern 關鍵字扮演著重要角色,主要用于聲明全局變量或函數,使其在多個源文件間共享。本文將詳細探討 extern 的用法及其在實際開發中的應用。 1. 什么是 extern? extern 關鍵字用于聲明一個變量或函數的引用,表示該變量或函數…

我為女兒開發了一個游戲網站

大家好&#xff0c;我是星河。 自從協助妻子為女兒開發了算數射擊游戲后&#xff0c;星河就一直有個想法&#xff1a;為女兒打造一個專屬的學習游戲網站。之前的射擊游戲雖然有趣&#xff0c;但缺乏難度分級&#xff0c;無法根據女兒的學習進度靈活調整。而且&#xff0c;僅僅…

基于 Python 卷積神經網絡的新聞文本分類系統,附源碼

大家好&#xff0c;我是徐師兄&#xff0c;一個有著7年大廠經驗的程序員&#xff0c;也是一名熱衷于分享干貨的技術愛好者。平時我在 CSDN、掘金、華為云、阿里云和 InfoQ 等平臺分享我的心得體會。今天我來跟大家聊聊一個用 Python 和 Django 打造的人臉識別考勤系統&#xff…

ngx_cycle_modules

Ubuntu 下 nginx-1.24.0 源碼分析 - ngx_cycle_modules-CSDN博客 定義在 src/core/ngx_module.c ngx_int_t ngx_cycle_modules(ngx_cycle_t *cycle) {/** create a list of modules to be used for this cycle,* copy static modules to it*/cycle->modules ngx_pcalloc(…