日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

【嵌入式开发】 ARM 关闭 MMU ( 存储体系 | I/D-Cache | MMU | CP15 寄存器 | C1 控制寄存器 | C7 寄存器 | 关闭 MMU )

發(fā)布時(shí)間:2025/6/17 57 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【嵌入式开发】 ARM 关闭 MMU ( 存储体系 | I/D-Cache | MMU | CP15 寄存器 | C1 控制寄存器 | C7 寄存器 | 关闭 MMU ) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

  • 一. MMU 概念
    • 1. ARM 存儲(chǔ)
      • (1) ARM 的存儲(chǔ)體系
      • (2) Cache 由來(lái)
      • (3) Cache 定義
    • 2. MMU
      • (1) 虛擬地址 與 物理地址
      • (2) MMU 作用 及 關(guān)閉原因
  • 二. 關(guān)閉 MMU 和 Cache
    • 1. 關(guān)閉 MMU 和 Cache 的方法簡(jiǎn)介
      • (1) 關(guān)閉方法
      • (2) C1 控制寄存器 ( 打開(kāi)關(guān)閉 Cache )
      • (3) C7 Cache 操作寄存器 ( 使 Cache 失效 )
    • 2. 關(guān)閉 MMU 和 Cache 代碼編寫(xiě)
  • 三. 關(guān)閉 MMU 和 Cache 完整可編譯執(zhí)行代碼
    • 1. 匯編代碼
    • 2. 鏈接器腳本
    • 3. Makefile 編譯腳本
    • 4. 編譯輸出可執(zhí)行文件


本博客的參考文章及相關(guān)資料下載 :

  • 1.本博客代碼及參考手冊(cè)下載 : https://download.csdn.net/download/han1202012/10455643




一. MMU 概念




1. ARM 存儲(chǔ)


(1) ARM 的存儲(chǔ)體系


ARM 存儲(chǔ) 體系 簡(jiǎn)介 : ARM 處理器分為三個(gè)等級(jí), 處理器寄存器 -> TCM 存儲(chǔ)器 -> 輔助存儲(chǔ)器, 由上到下, 處理速度依次變慢, 但是存儲(chǔ)空間依次增加 ;

  • 1.處理器內(nèi)部寄存器 : 處理器內(nèi)部的 通用寄存器 和 狀態(tài)字寄存器 等, 這些寄存器 訪問(wèn)速度很快, 但是數(shù)量很少 ;
  • 2.TCM 緊耦合存儲(chǔ)器 : Cache, 內(nèi)存 等存儲(chǔ)器;
  • 3.輔助存儲(chǔ)器 : 開(kāi)發(fā)板上的 NandFlash 達(dá)到 1G 大小的數(shù)量級(jí)別, SD 卡 等存儲(chǔ) 設(shè)備; 該類型存儲(chǔ)器 訪問(wèn)速度最慢, 但是數(shù)量最大;



(2) Cache 由來(lái)


Cache 的由來(lái) : Cache 用于解決 處理器 與 存儲(chǔ)器 之間 數(shù)據(jù)傳輸效率低下的問(wèn)題;

  • 1.沒(méi)有 Cache 的 情況 : 處理器直接訪問(wèn)主存儲(chǔ)器, 兩者之間的 處理速度差別巨大, 處理器的訪問(wèn)效率會(huì)被大大的拉低 ;
  • 2.有 Cache 的 情況 : Cache 位于 處理器 與 主存儲(chǔ)器 之間, Cache 中存放主存儲(chǔ)器的一些拷貝, 當(dāng)處理器需要讀取指定內(nèi)容時(shí), 先到 Cache 中去查看, 如果沒(méi)有, 就 直接從主存儲(chǔ)器中讀取, 同時(shí)將數(shù)據(jù)也讀取到 Cache 中, 當(dāng)處理器下一次在讀取該數(shù)據(jù)的時(shí)候, 就可以直接從 Cache 中獲取該數(shù)據(jù);


(3) Cache 定義


Cache 定義 :

  • 1.定義 : Cache 是 小容量 高速度 的 存儲(chǔ)器, 其速度 低于 處理器 高于 主存儲(chǔ)器;
  • 2.對(duì)外透明 : Cache 的功能對(duì)外是透明的, 在 Cache 中, 保存哪些數(shù)據(jù), 覆蓋哪些數(shù)據(jù)都是操作系統(tǒng)決定的;
  • 3.Cache 功能劃分 : 分為兩類, ① I-Cache 指令 Cache, 用于存放指令; ② D-Cache 數(shù)據(jù) Cache, 用于存放數(shù)據(jù) ;
  • 4.圖示 : 下圖是 S3C6410X.pdf 芯片手冊(cè) 1.2 章節(jié) 中的 I-Cache 和 D-Cache 的描述, 下圖紅框部分, I/D-Cache 都是 16KB 大小;





2. MMU


(1) 虛擬地址 與 物理地址


虛擬機(jī)地址 與 物理地址 :

  • 1.虛擬地址概念 : 程序中使用的地址 是 虛擬地址 ;
  • 2.物理地址概念 : 存儲(chǔ)器物理存儲(chǔ)單元的實(shí)際物理地址 ;
  • 3.虛擬地址的優(yōu)勢(shì) : ① 應(yīng)用程序可以使用更大的存儲(chǔ)空間, ② 解決不同程序之間的地址沖突問(wèn)題; 如果沒(méi)有虛擬地址, 程序中直接使用物理地址, 那么程序必須使用指定的物理地址, 會(huì)產(chǎn)生沖突; 同時(shí)程序中使用的存儲(chǔ)空間也被限制 了; 因此程序中直接使用實(shí)際的物理地址 是不可行的 ;
  • 4.MMU 作用 : MMU 可以 實(shí)現(xiàn) 物理地址 到 虛擬地址 之間的轉(zhuǎn)換 ;


(2) MMU 作用 及 關(guān)閉原因


MMU 作用 : 實(shí)現(xiàn) 物理地址 到 虛擬地址 的轉(zhuǎn)換 ;

  • 1.MMU 與 Cache 的 位置 : ① ARM 11 之前, 處理器 -> Cache -> MMU -> 存儲(chǔ)器, ② ARM 11 及 ARM 11 之后, 處理器 -> MMU -> Cache -> 存儲(chǔ)器, 訪問(wèn) Cache 必須通過(guò) MMU 將虛擬地址映射成物理地址后訪問(wèn);
  • 2.關(guān)閉 MMU 原因 : 使用 MMU 和 Cache 必須經(jīng)過(guò)一系列的配置, 之后才能正確的使用, 在 ARM 初始化 時(shí), 還沒(méi)有配置 MMU 和 Cache, 如果不關(guān)閉會(huì)出現(xiàn)錯(cuò)誤;






二. 關(guān)閉 MMU 和 Cache


參考手冊(cè) : ARM核 手冊(cè) Arm1176jzfs.pdf ( 基于 6410 開(kāi)發(fā)板 ARM 11 )

  • 1.手冊(cè)對(duì)應(yīng)章節(jié) : 3.2.7 章節(jié) c1, Control Register;
  • 2.Arm1176jzfs.pdf手冊(cè)下載地址 :https://download.csdn.net/download/han1202012/10412045


1. 關(guān)閉 MMU 和 Cache 的方法簡(jiǎn)介


(1) 關(guān)閉方法


關(guān)閉 MMU 和 Cache 簡(jiǎn)介 :

  • 1.關(guān)閉 Cache 和 MMU 步驟 : ① 設(shè)置 ICache 和 DCache 失效; ② 關(guān)閉 ICache 和 DCache 以及 MMU ;
  • 2.操作方法 : MMU 和 Cache 關(guān)閉操作都是通過(guò) CP15 協(xié)處理器 控制的, ① C1 控制寄存器 控制 Cache 和 MMU 開(kāi)啟 / 關(guān)閉 , ② C7 寄存器 控制 Cache 的的 失效 操作 ;


(2) C1 控制寄存器 ( 打開(kāi)關(guān)閉 Cache )


C1 控制寄存器簡(jiǎn)介 :

  • 1.文檔位置 : Arm1176jzfs.pdf 第 3.2.7 章節(jié) c1, Control Register ;
  • 2.I-Cache ( Instruction Cache ) 控制位 : 第 12 位 控制 I-Cache 的開(kāi)啟 / 關(guān)閉, 設(shè)置成 0 即 I-Cache 失效, 設(shè)置成 1 即 I-Cache 生效;
  • 3.D-Cache ( Data Cache ) 控制位 : 第 2 位 控制 D-Cache 的開(kāi)啟 / 關(guān)閉, 設(shè)置成 0 即 I-Cache 失效, 設(shè)置成 1 即 I-Cache 生效;
  • 4.MMU 控制位 : 第 0 位 控制 MMU 生效 / 失效, 設(shè)置成 0 即 MMU 失效, 設(shè)置成 1 即 MMU 生效;


(3) C7 Cache 操作寄存器 ( 使 Cache 失效 )


C7 寄存器 簡(jiǎn)介 :

  • 1.文檔位置 : Arm1176jzfs.pdf 第 3.2.22 章節(jié) c7, Cache operations ;
  • 2.使 Cache 失效 的指令 : MCR p15, 0, <Rd>, c7, c7, 0, 這是 文檔 中表格 3-71 Cache 操作 中給出的;


2. 關(guān)閉 MMU 和 Cache 代碼編寫(xiě)



關(guān)閉 MMU 和 Cache 代碼編寫(xiě) :

  • 1.設(shè)置標(biāo)號(hào) : 為本段代碼設(shè)置一個(gè)標(biāo)號(hào), 讓程序可以跳轉(zhuǎn)到該處執(zhí)行以下代碼, disable_mmu : ;
  • 2.設(shè)置 I-Cache 和 D-Cache 失效 : 使 兩個(gè) Cache 都失效, 文檔中 Arm1176jzfs.pdf 第 3.2.22 章節(jié) 給出的代碼格式為 MCR p15, 0, <Rd>, c7, c7, 0, 其中 Rd 通用寄存器 設(shè)置為 R0, 最終代碼為 MCR p15, 0, R0, c7, c7, 0 ;
  • 3.關(guān)閉 I-Cache 和 D-Cache 及 MMU :
    • ① 修改方式 : C1 控制寄存器中的 [0] 位 控制 MMU 開(kāi)啟/關(guān)閉, [2] 位控制 D-Cache 開(kāi)啟/關(guān)閉, [12] 位控制 I-Cache 開(kāi)啟/關(guān)閉; 上述位 設(shè)置為 0 關(guān)閉, 設(shè)置為 1 開(kāi)啟;
    • ② C1 寄存器讀寫(xiě)方式 : CP15 寄存器不能直接讀取, 需要使用 MRC 來(lái)將協(xié)處理器中的內(nèi)容讀取到通用寄存器中, 語(yǔ)法格式為 MRC{cond} P15,<Opcode_1>,<Rd>,<CRn>,<CRm>,<Opcode_2> , 使用 MCR 將 Rd 寄存器中的值傳送到 CP15 協(xié)處理器中, 語(yǔ)法格式為 MCR{cond} P15,<Opcode_1>,<Rd>,<CRn>,<CRm>,<Opcode_2> ;
    • ③ 位計(jì)算 : 關(guān)閉 I/D-Cache 和 MMU 需要將 C1 寄存器的 [0](MMU), [2](D-Cache), [12] (I-Cache) 三位 設(shè)置為0; 其中 I-Cache 可以關(guān)閉, 也可以開(kāi)啟, 不是必須的; 但是 D-Cache 和 MMU 必須關(guān)閉, Bootloader 主要作用是將 Linux 內(nèi)核下載到內(nèi)存中, 如果下載的過(guò)程中 D-Cache 沒(méi)有配置, 可能就將數(shù)據(jù)下載到了 Cache 中, 這樣就會(huì)出現(xiàn)問(wèn)題, 影響內(nèi)核運(yùn)行; 因此這里我們只需要將 第 [0] 位 和 第 [1] 位 設(shè)置成 0, 將 MMU 和 D-Cache 關(guān)閉, I-Cache 不作設(shè)置;
    • ④ 讀取 C1 寄存器的值 : 使用 MRC p15, 0, R0, c1, c0, 0 將 c1 寄存器中的值 讀取到 R0 通用寄存器中;
    • ⑤ 將指定位設(shè)置為 0 : 使用 bic 位清除指令, 將 R0 寄存器中的 第 0, 1, 2 三位 設(shè)置成0, 這里 第 1 位選擇性設(shè)置, 為了方便計(jì)算 順便將 第 1 位 也設(shè)置成 0, 代碼為 bic r0, r0, #0x7 ;
    • ⑥ 將 R0 寄存器中的值寫(xiě)回到 C1 寄存器中 : 使用 MRC p15, 0, r0, c1, c0, 0 指令, 將 R0 寄存器中的值 寫(xiě)回到 C1 寄存器中;
  • 4.設(shè)置程序跳轉(zhuǎn)到返回點(diǎn)繼續(xù)執(zhí)行 : 使用 BL 指令跳轉(zhuǎn)到 disable_mmu 標(biāo)號(hào)處執(zhí)行, 同時(shí)將返回地址存儲(chǔ)到了 LR 寄存器中, 返回時(shí)跳轉(zhuǎn)到 LR 寄存器中的地址執(zhí)行即可, 使用 mov pc, lr 指令, 執(zhí)行 lr 中地址指向的位置的代碼;
  • 5.代碼示例 :
disable_mmu : mcr p15,0,r0,c7,c7,0 @ 設(shè)置 I-Cache 和 D-Cache 失效mrc p15,0,r0,c1,c0,0 @ 將 c1 寄存器中的值 讀取到 R0 通用寄存器中bic r0, r0, #0x00000007 @ 使用 bic 位清除指令, 將 R0 寄存器中的 第 0, 1, 2 三位 設(shè)置成0, 代表 關(guān)閉 MMU 和 D-Cachemcr p15,0,r0,c1,c0,0 @ 將 R0 寄存器中的值寫(xiě)回到 C1 寄存器中mov pc, lr @ 返回到 返回點(diǎn)處 繼續(xù)執(zhí)行后面的代碼






三. 關(guān)閉 MMU 和 Cache 完整可編譯執(zhí)行代碼




1. 匯編代碼



匯編代碼示例 : Bootloader 流程 : ① 初始化異常向量表 , ② 設(shè)置 svc 模式 , ③ 關(guān)閉看門(mén)狗, ④ 關(guān)閉中斷, ⑤ 關(guān)閉 MMU ;

@**************************** @File:start.S @ @BootLoader 初始化代碼 @**************************** .text @ 宏 指明代碼段 .global _start @ 偽指令聲明全局開(kāi)始符號(hào) _start: @ 程序入口標(biāo)志 b reset @ reset 復(fù)位異常 ldr pc, _undefined_instruction @ 未定義異常, 將 _undefined_instruction 值裝載到 pc 指針中 ldr pc, _software_interrupt @ 軟中斷異常 ldr pc, _prefetch_abort @ 預(yù)取指令異常 ldr pc, _data_abort @ 數(shù)據(jù)讀取異常 ldr pc, _not_used @ 占用 0x00000014 地址 ldr pc, _irq @ 普通中斷異常 ldr pc, _fiq @ 軟中斷異常 _undefined_instruction: .word undefined_instruction @ _undefined_instruction 標(biāo)號(hào)存放了一個(gè)值, 該值是 32 位地址 undefined_instruction, undefined_instruction 是一個(gè)地址 _software_interrupt: .word software_interrupt @ 軟中斷異常 _prefetch_abort: .word prefetch_abort @ 預(yù)取指令異常 處理 _data_abort: .word data_abort @ 數(shù)據(jù)讀取異常 _not_used: .word not_used @ 空位處理 _irq: .word irq @ 普通中斷處理 _fiq: .word fiq @ 快速中斷處理 undefined_instruction: @ undefined_instruction 地址存放要執(zhí)行的內(nèi)容 nop software_interrupt: @ software_interrupt 地址存放要執(zhí)行的內(nèi)容 nop prefetch_abort: @ prefetch_abort 地址存放要執(zhí)行的內(nèi)容 nop data_abort: @ data_abort 地址存放要執(zhí)行的內(nèi)容 nop not_used: @ not_used 地址存放要執(zhí)行的內(nèi)容 nop irq: @ irq 地址存放要執(zhí)行的內(nèi)容 nop fiq: @ fiq 地址存放要執(zhí)行的內(nèi)容 nop reset: @ reset 地址存放要執(zhí)行的內(nèi)容 bl set_svc @ 跳轉(zhuǎn)到 set_svc 標(biāo)號(hào)處執(zhí)行bl disable_watchdog @ 跳轉(zhuǎn)到 disable_watchdog 標(biāo)號(hào)執(zhí)行, 關(guān)閉看門(mén)狗bl disable_interrupt @ 跳轉(zhuǎn)到 disable_interrupt 標(biāo)號(hào)執(zhí)行, 關(guān)閉中斷bl disable_mmu @ 跳轉(zhuǎn)到 disable_mmu 標(biāo)號(hào)執(zhí)行, 關(guān)閉 MMU set_svc:mrs r0, cpsr @ 將 CPSR 寄存器中的值 導(dǎo)出到 R0 寄存器中bic r0, r0, #0x1f @ 將 R0 寄存器中的值 與 #0x1f 立即數(shù) 進(jìn)行與操作, 并將結(jié)果保存到 R0 寄存器中, 實(shí)際是將寄存器的 0 ~ 4 位 置 0orr r0, r0, #0xd3 @ 將 R0 寄存器中的值 與 #0xd3 立即數(shù) 進(jìn)行或操作, 并將結(jié)果保存到 R0 寄存器中, 實(shí)際是設(shè)置 0 ~ 4 位 寄存器值 的處理器工作模式代碼msr cpsr, r0 @ 將 R0 寄存器中的值 保存到 CPSR 寄存器中mov pc, lr @ 返回到 返回點(diǎn)處 繼續(xù)執(zhí)行后面的代碼#define pWTCON 0x7e004000 @ 定義看門(mén)狗控制寄存器 地址 ( 6410開(kāi)發(fā)板 ) disable_watchdog: ldr r0, =pWTCON @ 先將控制寄存器地址保存到通用寄存器中mov r1, #0x0 @ 準(zhǔn)備一個(gè) 0 值, 看門(mén)狗控制寄存器都設(shè)置為0 , 即看門(mén)狗也關(guān)閉了str r1, [r0] @ 將 0 值 設(shè)置到 看門(mén)狗控制寄存器中 mov pc, lr @ 返回到 返回點(diǎn)處 繼續(xù)執(zhí)行后面的代碼disable_interrupt:mvn r1,#0x0 @ 將 0x0 按位取反, 獲取 全 1 的數(shù)據(jù), 設(shè)置到 R1 寄存器中ldr r0,=0x71200014 @ 設(shè)置第一個(gè)中斷屏蔽寄存器, 先將 寄存器 地址裝載到 通用寄存器 R0 中 str r1,[r0] @ 再將 全 1 的值設(shè)置到 寄存器中, 該寄存器的內(nèi)存地址已經(jīng)裝載到了 R0 通用寄存器中l(wèi)dr r0,=0x71300014 @ 設(shè)置第二個(gè)中斷屏蔽寄存器, 先將 寄存器 地址裝載到 通用寄存器 R0 中 str r1,[r0] @ 再將 全 1 的值設(shè)置到 寄存器中, 該寄存器的內(nèi)存地址已經(jīng)裝載到了 R0 通用寄存器中mov pc, lr @ 返回到 返回點(diǎn)處 繼續(xù)執(zhí)行后面的代碼disable_mmu : mcr p15,0,r0,c7,c7,0 @ 設(shè)置 I-Cache 和 D-Cache 失效mrc p15,0,r0,c1,c0,0 @ 將 c1 寄存器中的值 讀取到 R0 通用寄存器中bic r0, r0, #0x00000007 @ 使用 bic 位清除指令, 將 R0 寄存器中的 第 0, 1, 2 三位 設(shè)置成0, 代表 關(guān)閉 MMU 和 D-Cachemcr p15,0,r0,c1,c0,0 @ 將 R0 寄存器中的值寫(xiě)回到 C1 寄存器中mov pc, lr @ 返回到 返回點(diǎn)處 繼續(xù)執(zhí)行后面的代碼




2. 鏈接器腳本


gboot.lds 鏈接器腳本 代碼解析 :

  • 1.指明輸出格式 ( 處理器架構(gòu) ) : 使用 OUTPUT_ARCH(架構(gòu)名稱) 指明輸出格式, 即處理器的架構(gòu), 這里是 arm 架構(gòu)的, OUTPUT_ARCH(arm) ;
  • 2.指明輸出程序的入口 : 設(shè)置編譯輸出的程序入口位置, 語(yǔ)法為 ENTRY(入口位置), 在上面的 Start.S 中設(shè)置的程序入口是 _start, 代碼為 ENTRY(_start) ;
  • 3.設(shè)置代碼段 : 使用 .text : 設(shè)置代碼段;
  • 4.設(shè)置數(shù)據(jù)段 : 使用 .data : 設(shè)置數(shù)據(jù)段;
  • 5.設(shè)置 BSS 段 : 使用 .bss : 設(shè)置 BSS 段;
    • ( 1 ) 記錄 BSS 段的起始地址 : bss_start = .; ;
    • ( 2 ) 記錄 BSS 段的結(jié)束地址 : bss_end = .; ;
  • 6.對(duì)齊 : 每個(gè)段都需要設(shè)置內(nèi)存的對(duì)齊格式, 使用 . = ALIGN(4); 設(shè)置四字節(jié)對(duì)齊即可;
  • 7.代碼示例 :
OUTPUT_ARCH(arm) /*指明處理器結(jié)構(gòu)*/ ENTRY(_start) /*指明程序入口 在 _start 標(biāo)號(hào)處*/ SECTIONS { . = 0x50008000; /*整個(gè)程序鏈接的起始位置, 根據(jù)開(kāi)發(fā)板確定, 不同開(kāi)發(fā)板地址不一致*/ . = ALIGN(4); /*對(duì)齊處理, 每段開(kāi)始之前進(jìn)行 4 字節(jié)對(duì)齊*/ .text : /*代碼段*/ { start.o (.text) /*start.S 轉(zhuǎn)化來(lái)的代碼段*/ *(.text) /*其它代碼段*/ } . = ALIGN(4); /*對(duì)齊處理, 每段開(kāi)始之前進(jìn)行 4 字節(jié)對(duì)齊*/ .data : /*數(shù)據(jù)段*/ { *(.data) } . = ALIGN(4); /*對(duì)齊處理, 每段開(kāi)始之前進(jìn)行 4 字節(jié)對(duì)齊*/ bss_start = .; /*記錄 bss 段起始位置*/ .bss : /*bss 段*/ { *(.bss) } bss_end = .; /*記錄 bss 段結(jié)束位置*/ }




3. Makefile 編譯腳本


makefile 文件編寫(xiě) :

  • 1.通用規(guī)則 ( 匯編文件編譯規(guī)則 ) : 匯編文件 編譯 成同名的 .o 文件, 文件名稱相同, 后綴不同, %.o : %.S, 產(chǎn)生過(guò)程是 arm-linux-gcc -g -c $^ , 其中 ^ 標(biāo)識(shí)是所有的依賴文件, 在該規(guī)則下 start.S 會(huì)被變異成 start.o ;
  • 2.通用規(guī)則 ( C 文件編譯規(guī)則 ) : C 代碼編譯成同名的 .o 文件, %.o : %.c , 產(chǎn)生過(guò)程是 arm-linux-gcc -g -c $^ ;
  • 3.設(shè)置最終目標(biāo) : 使用 all: 設(shè)置最終編譯目標(biāo);
    • ( 1 ) 依賴文件 : 產(chǎn)生最終目標(biāo)需要依賴 start.o 文件, 使用 all: start.o 表示最終目標(biāo)需要依賴該文件;
    • ( 2 ) 鏈接過(guò)程 : arm-linux-ld -Tgboot.lds -o gboot.elf $^, 需要使用鏈接器腳本進(jìn)行連接, ①鏈接工具是 arm-linux-ld 工具, ②使用 -Tgboot.lds 設(shè)置鏈接器腳本 是剛寫(xiě)的 gboot.lds 鏈接器腳本, ③輸出文件是 gboot.elf 這是個(gè)中間文件, ④ 依賴文件是 $^ 代表所有的依賴;
    • ( 3 ) 轉(zhuǎn)換成可執(zhí)行二進(jìn)制文件 : arm-linux-objcopy -O binary gboot.elf gboot.bin, 使用 -O binary 設(shè)置輸出二進(jìn)制文件, 依賴文件是 gboot.elf, 輸出的可執(zhí)行二進(jìn)制文件 即 結(jié)果是 gboot.bin ;
  • 4.makefile 文件內(nèi)容 :
all: start.o #依賴于 start.o arm-linux-ld -Tgboot.lds -o gboot.elf $^ #使用鏈接器腳本, 將 start.o 轉(zhuǎn)為 gboot.elf arm-linux-objcopy -O binary gboot.elf gboot.bin #將 gboot.elf 轉(zhuǎn)化為可以直接在板子上執(zhí)行的 gboot.bin 文件 %.o : %.S #通用規(guī)則, 如 start.o 是由 start.S 編譯來(lái)的, -c 是只編譯不鏈接 arm-linux-gcc -g -c $^ %.o : %.c #通用規(guī)則, 如 start.o 是由 start.c 編譯來(lái)的, -c 是只編譯不鏈接 arm-linux-gcc -g -c $^ .PHONY: clean clean: #清除編譯信息 rm *.o *.elf *.bin




4. 編譯輸出可執(zhí)行文件


編譯過(guò)程 :

  • 1.文件準(zhǔn)備 : 將 匯編代碼 ( start.S ) 鏈接器腳本 ( gboot.lds ) makefile 文件 拷貝到編譯目錄 ;
  • 2.執(zhí)行編譯命令 : make ;
  • 3.編譯結(jié)果 : 可以看到 生成了 編譯目標(biāo)文件 start.o, 鏈接文件 gboot.elf, 可執(zhí)行的二進(jìn)制文件 gboot.bin ;

本博客的參考文章及相關(guān)資料下載 :

  • 1.本博客代碼及參考手冊(cè)下載 : https://download.csdn.net/download/han1202012/10455643

總結(jié)

以上是生活随笔為你收集整理的【嵌入式开发】 ARM 关闭 MMU ( 存储体系 | I/D-Cache | MMU | CP15 寄存器 | C1 控制寄存器 | C7 寄存器 | 关闭 MMU )的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。