uboot啟動流程分析

Uboot的啟動流程分為兩個階段,第一階段主要是匯編語言編寫,第二階段是C語言編寫,每個階段所做的工作不同,這篇文章分析的是uboot 2010版,以tiny4412的uboot為例。

啟動過程涉及的主要文件:

arch/arm/cpu/armv7/start.S
board/samsung/myboard/lowlevel_init.S
arch/arm/lib/crt0.S
arch/arm/lib/board.c
arch/samsung/myboard/myboard.c

第一階段 uboot的入口的地址是arch/arm/cpu/armv7/start.S, 這可以從相同路徑下的連接腳本u-boot.lds 中知道。 arch/arm/cpu/armv7 /start.S 平臺相關,CPU工作模式設為SVC模式,關MMU,關icahce(CPU相關) board/samsung/fs4412/lowlevel_init.S 開發板相關:關看門狗,內存初始化,時鐘初始化,串口初始化(board相關,初始化最基本的硬件環境)
第二階段 arch/arm/lib/crt0.S _main 函數所在處,初始化SP,為C語言準備,代碼重定位,清BSS,設置R0 R1 R2 R8相應寄存器 arch/arm/lib/board.c board_init_f 函數 ,填充GD結構體,初始化外設, main_loop()函數超循環

第一個階段:

在這個階段主脈絡就是:部分硬件初始化—》加載完整的uboot到RAM—》跳轉到第二階段入口開始執行。
整個過程涉及兩個重要的文件:start.S和lowlevel_init.S。Start.S涉及到特定硬件設備的讀寫寄存器操作以及特定體系結構的匯編語言;lowlevel_init.S,涉及的操作和文件名吻合,完成底層的初始化
圖一
執行上面的_start: b reset 后跳轉到下面這段代碼繼續運行:
圖二

繼續往下分析:
圖三
程序跳轉到這個函數里,我們進去看看:
圖四

上面的lowlevel_init在board/samsung/myboard/lowlevel_init.S
圖五
之后回到start.S執行
圖六
上面的代碼完成了gt結構體部分成員賦值
程序往下執行到relocate_code:
圖七
圖八
經過上面的操作,uboot已經把字節從SD卡拷貝到SDRAM中,并且為之后的執行準備好了各種參數,最終跳轉到第二部分的入口board_init_r
圖九
從上面可以總結出:
1.Bootloader第一階段的功能:

  1. 硬件設備初始化。
  2. 為加載Bootloader的第二階段代碼準備RAM空間。
  3. 設置CPU的速度、時鐘頻率及終端控制寄存器
  4. 初始化內存控制器
  5. 復制Bootloader的第二階段代碼到RAM空間中。
  6. 設置好棧。
  7. 跳轉到第二階段代碼的C入口點。
    在第一階段進行的硬件初始化一般包括:關閉WATCHDOG、關中斷、設置CPU的速度和時鐘頻率、RAM初始化等。這些并不都是必需的,比如S3C2410/S3C2440的開發板所使用的U-Boot中,就將CPU的速度和時鐘頻率的設置放在第二階段。
    甚至,將第二階段的代碼復制到RAM空間中也不是必需的,對于NOR FLASH等存儲設備,完全可以在上面直接執行代碼,只不過相比在RAM中執行效率大為降低。

第二階段分析:

  1. 初始化本階段要使用的硬件設備。
  2. 檢測系統內存映射(memory map)。
  3. 將內核映像和根文件系統映像從FLASH上讀到RAM空間中。
  4. 為內核設置啟動參數。
  5. 調用內核。
    C語言代碼部分 arch/arm/lib/board.c中的board_init_f是C語言開始的函數也是整個啟動代碼中C語言的主函數,同時還是整個u-boot的主函數,該函數只要完成如下操作:
    1)調用一系列的初始化函數。
    2)初始化Flash設備。
    3)初始化系統內存分配函數。
    4)如果目標系統擁有NAND設備,則初始化NAND設備。
    5)如果目標系統有顯示設備,則初始化該類設備。
    6)初始化相關網絡設備,填寫IP、MAC地址等。
    7)進去命令循環(即整個boot的工作循環),接受用戶從串口輸入的命令,然后進行
    U-Boot的啟動順序流程圖:
    圖十

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

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

相關文章

(一)uboot的移植與制作

目錄(一)環境(二)流程分析(三)具體步驟在裸機啟動流程里涉及到BL1,BL2為系統的加載啟動項,全稱為BootLoader。 Boot Loader 是在操作系統內核運行之前運行的一段小程序。通過這段小程…

jquery ajax(實現單獨提交某個form)

function submitTaskScore(formid) {//formid表示的是表單的id$.ajax({type:"post",url:"companyAndDistributeAction!scoreTask",//后臺處理程序data:$(formid).serialize(),success:function(){document.getElementById("hjzggContent").inner…

(二)linux內核鏡像制作

(一)目的 在進行嵌入式開發的時候,我們往往會先在電腦上安裝交叉編譯器,然后編譯目標板上的代碼,最后把代碼下載到電路板中,嵌入式系統組成包括:BootLoaderkernelfilesystemapplication&#x…

js+css實現骰子的隨機轉動

網上找的例子&#xff0c;然后增添了新的東西&#xff0c;在這里展示一下...... 效果圖預覽&#xff1a; <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html x…

linux安裝交叉編譯環境

&#xff08;一&#xff09;交叉編譯器的簡介 &#xff08;1&#xff09;本地編譯 在了解交叉編譯之前我們首先介紹一下另一個概念&#xff1a;本地編譯 之前所做的C開發屬于本地編譯&#xff0c;即在當前PC下&#xff08;x86的CPU下&#xff09;&#xff0c;直接編譯出可以運…

jsp實現郵件的發送

如果程序出現 454 Authentication failed, please open smtp flag first! 錯誤&#xff0c;那么一般是郵箱沒有開通POP3/SMTP服務&#xff0c;登錄郵箱&#xff0c;在設置中開啟該服務即可 &#xff01; 另外需要的jar包如下: imap.jar, mail.jar, smtp.jar, 可以自己在網上下…

linux的mount和umount指令使用

mount即掛在操作&#xff0c;磁盤或分區創建好文件系統后需要掛載到一個目錄&#xff08;一般mount在/mnt下&#xff09;才能使 用&#xff0c;和winsdows不同的是在linux下需要手動掛載。 用法&#xff1a;mount [-t文件系統] [選項] 設備目錄注意&#xff1a;[ ]為可選項…

斐波那契的四種求法

首先看一下斐波那契的矩陣表示&#xff1a; 數列的遞推公式為&#xff1a;f(1)1&#xff0c;f(2)2&#xff0c;f(n)f(n-1)f(n-2)(n>3) 用矩陣表示為&#xff1a; 進一步&#xff0c;可以得出直接推導公式&#xff1a; #include<iostream> #include<cstring> #i…

利用STM32制作紅外測溫儀之軟件設計(MLX90614)

目錄&#xff08;一&#xff09;工程目錄如圖&#xff1a;&#xff08;二&#xff09;main函數實現&#xff1a;&#xff08;三&#xff09;MLX90614測溫代碼實現前面介紹了使用 STM32制作紅外測溫儀硬件設計,今天來說一下軟件的實現&#xff0c;具體的程序&#xff0c;完整的k…

Windows下使用Dev-C++開發基于pthread.h的多線程程序

一、下載Windows版本的pthread 目前最新版本是&#xff1a;pthreads-w32-2-9-1-release.zip。 二、解壓pthread到指定目錄 我選擇的目錄是&#xff1a;E:\DEV-CPP\Pthread完成后&#xff0c;該目錄會多出三個文件夾&#xff1a;Pre-built.2&#xff0c;pthreads.2&#xff0c;Q…

(三)linux之根文件系統的制作

&#xff08;一&#xff09;準備工作 Ubuntu 16.04系統linux-3.5內核:linux-3.5-20190929交叉編譯工具arm-linux-gcc-4.5.1-v6-vfp-20120301.rarbusybox源碼包&#xff1a;busybox-1.21.1.rar &#xff08;二&#xff09;工具介紹 &#xff08;1&#xff09;交叉編譯器 這個…

c/c++多線程模擬系統資源分配(并通過銀行家算法避免死鎖產生)

銀行家算法數據結構 &#xff08;1&#xff09;可利用資源向量Available 是個含有m個元素的數組&#xff0c;其中的每一個元素代表一類可利用的資源數目。如果Available[j]K&#xff0c;則表示系統中現有Rj類資源K個。 &#xff08;2&#xff09;最大需求矩陣Max 這是一個nm的…

(四)Linux內核模塊化編程

目錄&#xff08;一&#xff09;模塊化編程簡介&#xff08;二&#xff09;安裝卸載模塊命令.&#xff08;三&#xff09;將自定義功能添加到內核三種方法&#xff08;1&#xff09;修改Kconfig和Makefile&#xff08;2&#xff09;直接修改功能對應目錄下的Makefile文件&#…

基于X86平臺的PC機通過網絡發送一個int(32位)整數的字節順序

1.字節順序  字節順序是指占內存多于一個字節類型的數據在內存中的存放順序&#xff0c;通常有小端、大端兩種字節順序。小端字節序指低字節數據存放在內存低地址處&#xff0c;高字節數據存放在內存高地址處&#xff1b;大端字節序是高字節數據存放在低地址處&#xff0c;低字…

Linux內核空間和用戶空間

在Linux系統中存在進程的概念&#xff1a; 進程的分類&#xff1a; 用戶進程&#xff1a;運行在用戶空間的進程被稱為用戶進程 內核進程:運行在內核空間的進程被稱為內核進程 進程的空間&#xff1a; 系統會為每一個進程分0-4G的虛擬尋址空間&#xff0c;在4G的空間中 0-3G&…

codeforces Round #320 (Div. 2) C. A Problem about Polyline(數學) D. Or Game(暴力,數學)

解題思路&#xff1a;就是求數 n 對應的二進制數中有多少個 1 #include <iostream> #include<cstdio> using namespace std; int main(){int n;cin>>n;int ans 0; // while(n){//這也是一種好的方法 // n n&(n-1); // ans; // }while(n…

(五)Linux之設備驅動模型

目錄&#xff08;一&#xff09;Linux內核驅動簡介&#xff08;二&#xff09;雜項設備驅動模型&#xff08;1&#xff09;相關接口&#xff08;2&#xff09;雜項設備注冊過程&#xff08;三&#xff09;早期經典字符設備驅動模型&#xff08;1&#xff09;相關接口&#xff0…

操作系統頁面置換算法(opt,lru,fifo,clock)實現

選擇調出頁面的算法就稱為頁面置換算法。好的頁面置換算法應有較低的頁面更換頻率&#xff0c;也就是說&#xff0c;應將以后不會再訪問或者以后較長時間內不會再訪問的頁面先調出。 常見的置換算法有以下四種&#xff08;以下來自操作系統課本&#xff09;。 1. 最佳置換算法(…

(六)Linux之設備驅動模型(續)

前面我們學習了雜項設備驅動模型、早期經典字符設備驅動模型,這一小節來講解Linux中的標準字符設備驅動。 目錄&#xff08;一&#xff09;為什么引入標準字符設備驅動模型&#xff08;二&#xff09;相關接口&#xff08;三&#xff09;注冊流程&#xff08;四&#xff09;程序…

N個數依次入棧,出棧順序有多少種?

對于每一個數來說&#xff0c;必須進棧一次、出棧一次。我們把進棧設為狀態‘1’&#xff0c;出棧設為狀態‘0’。n個數的所有狀態對應n個1和n個0組成的2n位二進制數。由于等待入棧的操作數按照1‥n的順序排列、入棧的操作數b大于等于出棧的操作數a(a≤b)&#xff0c;因此輸出序…