u-boot源碼彙編段簡要分析

来源:http://www.cnblogs.com/CrazyCatJack/archive/2016/11/19/6069139.html
-Advertisement-
Play Games

Hi,大家好!我是CrazyCatJack,你們可以叫我CCJ或者瘋貓。今天我給大家帶來的是u-boot的源代碼彙編段分析,以後還會給大家講解後續的C代碼,請持續關註哦^_^ 先簡單說一下u-boot,在嵌入式開發中,u-boot起著至關重要的作用:讀出嵌入式系統內核並啟動內核。因此非常有必要對u- ...


  Hi,大家好!我是CrazyCatJack,你們可以叫我CCJ或者瘋貓。今天我給大家帶來的是u-boot的源代碼彙編段分析,以後還會給大家講解後續的C代碼,請持續關註哦^_^

  先簡單說一下u-boot,在嵌入式開發中,u-boot起著至關重要的作用:讀出嵌入式系統內核並啟動內核。因此非常有必要對u-boot進行理解,瞭解其是如何啟動內核的,這樣我們才能隨心所欲地初始化系統,無論基於什麼架構,什麼開發板,都能夠輕鬆的去啟動內核。這一點難道不是最有吸引力的嗎?

  如果大家有看到我的前一篇博客,就會對u-boot的啟動有一定程度的瞭解了。執行u-boot,首先是從啟動文件start.S開始的。它位於你所用CPU的文件下。比如我的路徑就是:“uboot-1.1.6/cpu/arm920t/start.S”。這基於你具體使用的CPU架構。打開它:

 

  首先看第一條語句,跳轉到reset語句執行。那我們來看reset。

 

  根據註釋,我們知道是要先讓CPU進入SVC32模式,也就是管理模式。具體的彙編代碼不再分析,需要大家自己去學習。若是你已經掌握了一定的彙編,則完全可以閱讀本篇博客,不然還是建議先學習一下彙編。u-boot代碼量還是很大的,再接著往下來看:

 

  根據註釋,我們要關閉看門狗,否則此時CPU會不斷地重啟重啟。。。很明顯,在定義了具體的SOC型號後,define寄存器地址。包括看門狗控制寄存器、中斷屏蔽寄存器、還有時鐘分頻。關閉看門狗,關閉所有的中斷。

 

  這裡如果你是從NOR Flash啟動的,這裡的r0就是0。如果你是從下載器或者調試器直接將代碼下載到SDRAM的,r0就為你自己設置的SDRAM代碼段的啟動地址(詳情看我的上一篇博客)。這裡會比較一下這兩個地址是否相同,就可以知道你是從哪裡啟動的了,是從NOR Flash還是直接從SDRAM。如果你從SDRAM啟動,則說明你已經初始化了SDRAM。如果你是從FLASH啟動,則這裡跳轉到 cpu_init_crit函數執行。

 

  這裡是關caches,關MMU,然後跳轉到lowlevel_init函數執行開發板相關的配置。

 

  這一部分程式博主開始很不理解,因為這裡涉及到了一個鏈接地址的概念。博主分不清此刻程式到底是在FLASH還是在RAM上。但是後來在論壇提問,大神給予瞭解答,博主終於懂了。這裡的SMRDATA是即將在SDRAM存儲的13個寄存器的鏈接地址,也就是說此刻這13個寄存器的值並未真正存儲到SDRAM,而是在NOR FLASH中。但是我們用這個SDRAM上的寄存器鏈接地址減去SDRAM代碼段開始地址(_TEXT_BASE),就得出了相對地址。又因為NOR FLASH的起始地址是0,所以起始地址+相對地址就是這13個寄存器在NOR FLASH上真正存儲的開始地址。這段代碼就是因為上述原因而進行的地址轉換。目的是得到13個寄存器在NOR FLASH上存儲的開始地址。

 

  

  我們接著分析,下一步根據註釋是設置堆棧,將代碼段地址給r0,這裡我們設置的是0x33F80000.然後設置MALLOC段:分配空間,r0減去此段大小。再設置CFG_GBL_DATA段,同理r0減去此段大小,分配空間。再設置IRQ段、FIQ段。最後r0減去12,留出3個位元組的空間。下一步是跳轉到clock_init設置時鐘。

  relocate這段代碼是要將u-boot從FLASH複製到RAM。_start是當前代碼的開始地址,_TEXT_BASE是代碼段的鏈接地址,如果二者相等則證明是從RAM啟動,無需複製代碼。轉去執行清BSS段代碼。_armboot_start是在當前文件即start.S中定義的第一條指令的運行地址,_bss_start是在board/開發板型號/u-boot.lds中定義的代碼段結束地址。結束地址減去開始地址等於代碼段長度,賦值給r2。然後就是如果你是從FLASH啟動則需進行代碼賦值,這裡是用C函數實現。

 

   這裡我們設置的是USB48MHZ,總時鐘400MHZ.根據代碼,再接下來是清BSS段。

 

  所謂的BSS段就是未初始化的靜態變數和全局變數,或者初始化為0的靜態變數和全局變數。將他們存入只會浪費空間。所以用到他們的時候再去初始化。這裡的清BSS段就是這樣的作用。

  清完BSS段就是要複製代碼到RAM。這裡韋東山老師是自己用C語言實現的從FLASH到RAM程式的複製。因為版權原因,我們不便貼出。其實也是很容易的記憶體塊複製。

 

  最後是進入到了_start_armboot。這是一個C函數,從這裡開始就是用C來實現讀出內核,啟動內核了。硬體相關的彙編程式講解結束!

 

 

 

版權聲明:

本博客未經允許,禁止轉載。

我尊重DENX Software Engineering為開源代碼做出的貢獻,他們做出u-boot,並將其開源供全世界的人們下載、學習和使用。

博主是跟隨韋東山老師學習的嵌入式Linux開發,其中的CopyCode2Ram函數為韋東山老師編寫。本文源於對學習成果的總結。

 

 

 

CCJ

2016-11-19   11:14:00

 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 用Eclipse做一個後臺項目,但是資料庫不想放在本地電腦,於是買了一個騰訊雲伺服器(學生有優惠,挺便宜的),裝上MySQL資料庫,但是測試連接的時候,發現總是連接不是上,但是本地資料庫可以連接,於是上網搜索發現,mysql 資料庫預設的連接只能在本機連接,遠程連接必須授權。 遠程連接許可權配置: 進 ...
  • 1.HDFS shell 1.0查看幫助 hadoop fs -help <cmd> 1.1上傳 hadoop fs -put <linux上文件> <hdfs上的路徑> 1.2查看文件內容 hadoop fs -cat <hdfs上的路徑> 1.3查看文件列表 hadoop fs -ls / 1. ...
  • [1]字元函數 [2]數值運算符 [3]比較運算符 [4]日期時間 [5]信息函數 [6]聚合函數 [7]加密函數 [8]自定義函數 ...
  • [ctrl+q] 打開查詢視窗 [ctrl+/] 註釋sql語句 [ctrl+shift +/] 解除註釋 [ctrl+r] 運行查詢視窗的sql語句 [ctrl+shift+r] 只運行選中的sql語句 [F6] 打開一個mysql命令行視窗 [ctrl+l] 刪除一行 [ctrl+n] 打開一個 ...
  • 一、前言 現在越來越多的公司用git進行版本控制,不過git是預設是開源的,如果私有的話是需要付費的,如果不想付費自己可以搭建一個git伺服器用來版本控制。 二、伺服器端操作 1、安裝git 2、創建一個git用戶 3、創建登錄證書 在git用戶目錄下創建.ssh文件夾併在其下創建文件authori ...
  • 1. ASCII碼 1> ASCII碼不包括我們輸入法中的"特殊字元"和"數學字元"等,他們都屬於擴展ASCII 字元 2. GBK編碼 GBK實際上是ASCII的中文擴展編碼,其規則是: 1> 如果第一個位元組的大於127(0x7F, 0111 1111,即最高位為0),則表示從這個位元組開始的2個字... ...
  • 現在大家常用的桌面操作系統有:Windows、Mac OS、ubuntu,其中Mac OS 和 ubuntu上都會自帶python。這裡我們只介紹下Windows(我用的Win10)環境下的python2.x 和 python3.x 的安裝,以及python2.x 與 python3.x 共存時的配 ...
  • seL4之hello 2旅途 2016/11/19 13:15:38 回顧上周 seL4運行環境搭建. 完成 的運行. 補充上周 1.微內核與巨集內核有什麼不同? 微內核——用戶態提供OS服務,一般採用server client架構。代表:L4系列微內核 巨集內核——內核態提供OS服務,通過syscal ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...