嵌入式Linux之Uboot簡介和移植

uboot簡介?

uboot 的全稱是 Universal Boot Loader,uboot 是一個遵循 GPL 協議的開源軟件,uboot是一個裸機代碼,可以看作是一個裸機綜合例程。現在的 uboot 已經支持液晶屏、網絡、USB 等高級功能。

也就是說,可以在沒有系統的情況下做一些事情,而這不就是裸機干的活嘛。

UBOOT其實就包含了裸機的內容。

UBOOT應該是屬于板級的內容,就像在電腦上裝系統,不管是裝什么系統,都是一開始按某個鍵進入BIOS,然后決定從哪啟動,裝windows或者裝linux都用的是同一個BIOS。

在移植 Linux之前我們需要先移植一個 bootloader 代碼,這個 bootloader 代碼用于啟動 Linux 內核,bootloader有很多,常用的就是 U-Boot。移植好 U-Boot 以后再移植 Linux 內核,移植完 Linux 內核以后Linux 還不能正常啟動,還需要再移植一個根文件系統(rootfs),根文件系統里面包含了一些最常用的命令和文件。所以 U-Boot、Linux kernel 和 rootfs 這三者一起構成了一個完整的 Linux 系統,一個可以正常使用、功能完善的 Linux 系統。在本篇我們就來講解 U-Boot、Linux Kernel 和rootfs 的移植,與其說是“移植”,倒不如說是“適配”,因為大部分的移植工作都由NXP廠家完成了,我們這里所謂的“移植”主要是使其能夠在 I.MX6U-ALPHA 開發板上跑起來。

uboot啟動說明?

系統通過UBOOT來啟動,那么UBOOT自己怎么啟動呢?

具體內容參考正點原子《I.MX6U 嵌入式 Linux 驅動開發指南》

uboot 是 bootloader 的一種,可以用來引導Linux,但是 uboot 除了引導 Linux 以外還可以引導其它的系統,而且 uboot 還支持其它的架構和外設,比如 USB、網絡、SD 卡等。這些都是可以配置的,需要什么功能就使能什么功能。所以在編譯 uboot 之前,一定要根據自己的需求配置 uboot。mx6ull_14x14_ddr512_emmc_defconfig就是正點原子針對 I.MX6U-ALPHA 的 EMMC 核心板編寫的配置文件,這個配置文件在 uboot源碼的 configs 目錄中。在 uboot 中,通過“make xxx_defconfig”來配置 uboot,xxx_defconfig就是不同板子的配置文件,這些配置文件都在 uboot/configs 目錄中。

看來一般各個模塊都有自己的配置文件,也就是defconfig,既然用的是defconfig文件,那么.config文件啥時候用?暫時想不明白,那就待補充吧。

uboot 是可配置的,但是你要是自己從頭開始一個一個項目的配置,那就太麻煩了,因此一般半導體或者開發板廠商都會制作好一個配置文件。我們可以在這個做好的配置文件基礎上來添加自己想要的功能,這些半導體廠商或者開發板廠商制作好的配置文件統一命名為“xxx_defconfig”,xxx 表示開發板名字,這些 defconfig 文件都存放在 configs文件夾。

使用 “make xxx_defconfig”命令即可配置 uboot,比如:

make mx6ull_14x14_ddr512_emmc_defconfig

上述命令就是配置正點原子的 I.MX6ULL EMMC 核心板所使用的 uboot

在編譯 uboot 之前一定要使用 defconfig 來配置 uboot

倒計時結束之前按下回車鍵就會進入 Linux 命令行模式。如果在倒計時結束以后沒有按下回車鍵,那么 Linux 內核就會啟動,Linux 內核一旦啟動,uboot 就會壽終正寢。

uboot常用命令

uboot 是來干活的,我們現在已經進入 uboot 的命令行模式了,進入命令行模式以后就可以給 uboot 發號施令了。當然了,不能隨便發號施令,得看看 uboot 支持哪些命令,然后使用這些uboot 所支持的命令來做一些工作。

進入 uboot 的命令行模式以后輸入“help”或者“?”,然后按下回車即可查看當前 uboot 所支持的命令。有的可能設置得不一樣,根據實際情況而定。uboot 是可配置的,需要什么命令就使能什么命令,uboot 支持的命令還有很多,而且也可以在 uboot 中自定義命令。

uboot 是支持網絡的,我們在移植 uboot 的時候一般都要調通網絡功能,因為在移植 linux

kernel 的時候需要使用到 uboot 的網絡功能做調試。uboot 支持大量的網絡相關命令,比如 dhcppingnfs tftpboot等等。

我們最常用的就是 pingnfs tftp 這三個命令。使用 ping 命令來查看網絡的連接狀態,使用 nfs tftp 命令來從 Ubuntu 主機中下載文件。

nfs(Network File System)網絡文件系統,通過 nfs 可以在計算機之間通過網絡來分享資源,

比如我們將 linux 鏡像和設備樹文件放到 Ubuntu 中,然后在 uboot 中使用 nfs 命令將 Ubuntu 中的 linux 鏡像和設備樹下載到開發板的 DRAM 中。這樣做的目的是為了方便調試 linux 鏡像和設備樹,也就是網絡調試,通過網絡調試是 Linux 開發中最常用的調試方法。原因是嵌入式 linux開發不像單片機開發,可以直接通過 JLINK STLink 等仿真器將代碼直接燒寫到單片機內部的 flash 中,嵌入式 Linux 通常是燒寫到 EMMCNAND FlashSPI Flash 等外置 flash 中,但是嵌入式 Linux 開發也沒有 MDKIAR 這樣的 IDE,更沒有燒寫算法,因此不可能通過點擊一個“download”按鈕就將固件燒寫到外部 flash 中。雖然半導體廠商一般都會提供一個燒寫固件的軟件,但是這個軟件使用起來比較復雜,這個燒寫軟件一般用于量產的。其遠沒有 MDKIAR的一鍵下載方便,在 Linux 內核調試階段,如果用這個燒寫軟件的話將會非常浪費時間,而這個時候網絡調試的優勢就顯現出來了,可以通過網絡將編譯好的 linux 鏡像和設備樹文件下載到 DRAM 中,然后就可以直接運行。

具體參看正點原子手冊。

uboot 的本質工作是引導 Linux,所以 uboot 肯定有相關的 boot(引導)命令來啟動 Linux。常用的跟 boot 有關的命令有:bootzbootm boot

bootm bootz 功能類似,但是 bootm 用于啟動 uImage 鏡像文件。

boot 命令

boot 命令也是用來啟動 Linux 系統的,只是 boot 會讀取環境變量 bootcmd 來啟動 Linux 系統,bootcmd 是一個很重要的環境變量!其名字分為“boot”和“cmd”,也就是“引導”和“命令”,說明這個環境變量保存著引導命令,其實就是啟動的命令集合,具體的引導命令內容是可以修改的。比如我們要想使用 tftp 命令從網絡啟動 Linux 那么就可以設置 bootcmd 為“tftp 80800000 zImage; tftp 83000000 imx6ull-14x14-emmc-7-1024x600-c.dtb; bootz 80800000 - 83000000”,然后使用 saveenv 將 bootcmd 保存起來。然后直接輸入 boot 命令即可從網絡啟動Linux 系統。

uboot啟動流程

uboot 整個源碼非常大,我們只看跟我們關心的部分即可,重點是分析 uboot 啟動流程否則移植的時候都不知道該修改那些文件。

具體參看正點原子手冊。

我們在分析 uboot 源碼之前一定要先在 Ubuntu 中編譯一下 uboot 源碼,因為編譯過程會生成一些文件,而生成的這些恰恰是分析uboot 源碼不可或缺的文件。

在閱讀 uboot 源碼之前,肯定是要先看一下頂層 Makefile,分析 gcc 版本代碼的時候一定是先從頂層 Makefile 開始的,然后再是子 Makefile,這樣通過層層分析 Makefile 即可了解整個工程的組織結構。頂層 Makefile 也就是 uboot 根目錄下的 Makefile 文件。?

我們來詳細的分析一下 uboot 的啟動流程,理清 uboot 是如何啟動的。通過對 uboot 啟動流程的梳理,我們就可以掌握一些外設是在哪里被初始化的,這樣當我們需要修改這些外設驅動的時候就會心里有數。另外,通過分析 uboot 的啟動流程可以了解 Linux 內核是如何被啟動的。
從這里我們可以知道,有些外設是可以在bootloader里初始化的。
鏈接腳本 u-boot.lds 詳解
要分析 uboot 的啟動流程,首先要找到“入口”,找到第一行程序在哪里。程序的鏈接是由鏈接腳本來決定的,所以通過鏈接腳本可以找到程序的入口。如果沒有編譯過 uboot 的話鏈接
腳本為 arch/arm/cpu/u-boot.lds 。但是這個不是最終使用的鏈接腳本,最終的鏈接腳本是在這個鏈接腳本的基礎上生成的。編譯一下 uboot ,編譯完成以后就會在 uboot 根目錄下生成 u-boot.lds文件,如圖 32.1.1 所示:
只有編譯 u-boot 以后才會在根目錄下出現 u-boot.lds 文件!
打開 u-boot.lds ,部分內容如下:
3 行為代碼當前入口點: _start _start 在文件 arch/arm/lib/vectors.S 中有定義
……
……
具體查看正點原子的開發手冊。
看得腦殼子疼。。。。。。

uboot移植

不管是購買的開發板還是自己做的開發板,基本都是參考半導體廠商的 dmeo 板,而半導體廠商會在他們自己的開發板上移植好 uboot linux kernel rootfs 等,最終制作好 BSP包提供給用戶。我們可以在官方提供的 BSP 包的基礎上添加我們的板子,也就是俗稱的移植。
我們購買的開發板或者自己做的板子一般都不會原封不動的照抄半導體廠商的 demo板,都會根據實際的情況來做修改,既然有修改就必然涉及到 uboot 下驅動的移植。
一般 uboot 中需要解決串口、 NAND EMMC SD 卡、網絡和 LCD 驅動,因為 uboot的主要目的就是啟動 Linux 內核,所以不需要考慮太多的外設驅動。
在 uboot 中添加自己的板子信息,根據自己板子的實際情況來修改 uboot 中的驅動。

U-Boot圖形化配置

uboot Linux 內核可以通過輸入“ make menuconfig ”來打開圖形化配置界面, menuconfig是一套圖形化的配置工具,需要 ncurses 庫支持。 ncurses 庫提供了一系列的 API 函數供調用者生成基于文本的圖形界面,因此需要先在 Ubuntu 中安裝 ncurses 庫,命令如下:
sudo apt-get install build-essential
sudo apt-get install libncurses5-dev
menuconfig 重點會用到兩個文件: .config Kconfig .config 文件前面已經說了,這個文件保存著 uboot 的配置項,使用 menuconfig 配置完 uboot 以后肯定要更新 .config 文件。 Kconfig文件是圖形界面的描述文件,也就是描述界面應該有什么內容,很多目錄下都會有 Kconfig 文件。
在打開圖形化配置界面之前,要先使用“ make xxx_defconfig ”對 uboot 進行一次默認配置,只需要一次即可。如果使用“make clean ”清理了工程的話就那就需要重新使用“ make xxx_defconfig”再對 uboot 進行一次配置。

補充

zImage

zImage是ARM Linux常用的一種壓縮映像文件,uImage是U-boot專用的映像文件,它是在zImage之前加上一個長度為0x40的“頭”,說明這個映像文件的類型、加載位置、生成時間、大小等信息。換句話說,如果直接從uImage的0x40位置開始執行,zImage和uImage沒有任何區別。另外,Linux2.4內核不支持uImage,Linux2.6內核加入了很多對嵌入式系統的支持,但是uImage的生成也需要設置。

幾種linux內核文件的區別(vmlinux、zImage、bzImage、uImage、vmlinuz、initrd )_zimage是什么-CSDN博客

那什么是映像文件?

操作系統的鏡像文件和映像文件有什么區別?_虛擬機下的win10 和映像文件的win10哪個好-CSDN博客

什么是鏡像文件_鏡像文件是啥意思-CSDN博客

Linux下的常見映像文件格式

Linux內核鏡像文件格式與生成過程(轉) - lemaden - 博客園 (cnblogs.com)

核心轉儲文件

核心轉儲(core dump),在漢語中有時戲稱為吐核,是操作系統在進程收到某些信號而終止運行時,將此時進程地址空間的內容以及有關進程狀態的其他信息寫出的一個磁盤文件。這種信息往往用于調試。

核心轉儲_百度百科 (baidu.com)

設置編譯結果輸出目錄

uboot 可以將編譯出來的目標文件輸出到單獨的目錄中,在 make 的時候使用“ O ”來指定輸出目錄,比如“make O=out ”就是設置目標文件輸出到 out 目錄中。這么做是為了將源文件和編譯產生的文件分開,當然也可以不指定 O 參數,不指定的話源文件和編譯產生的文件都在同一個目錄內,具體根據實際情況而定。

其他?

uboot 中允許單獨編譯某個模塊,使用命令“ make M=dir ”即可,舊語法“ make SUBDIRS=dir”也是支持的。

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

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

相關文章

[我靠升級逆襲成為大師]韓漫日漫無刪減完整版,免費在線觀看漫畫

[我靠升級逆襲成為大師]韓漫日漫無刪減完整版,免費在線觀看漫畫 不能多說,怕審-核不過,自己看圖吧。 目前統計【統計日期:2024-07-03】: 完結的有:420部。 連載的有:308部,持續更…

生單鏈路流程復雜,涉及到上下游商品、庫存、營銷、風控、拆單、校驗、落庫等等十多個節點操作,需要保證數據的完整性和正確性

處理復雜的生單鏈路流程,確保數據的完整性和正確性,需要一個綜合的策略,包括但不限于以下幾個方面: 1. **流程設計**: - 明確每個節點的職責和輸入輸出,確保流程的邏輯清晰。 2. **數據校驗**&#xf…

python庫(1):Nuitka庫

1 Nuitka介紹 Nuitka是一個 Python 解釋器的替代品,支持CPython提供的代碼,可編譯 Python 代碼到 C 程序,并使用 libpython 來執行這些代碼,就像 CPython 一樣。 這讓你可以在沒有安裝 Python 的環境中運行 Python 程序&#xf…

AC7801時鐘配置流程

一 默認配置 在啟動文件中,已經對時鐘進行了初始化,默認按外部8M晶振,配置系統時鐘為48MHZ,APB為系統時鐘的2分頻,為24MHZ。在system_ac780x.c文件中,可以找到下面這個系統初始化函數,里面有Se…

前端修改audio背景色

1.查看瀏覽器設置Show user agent shadow DOM是否打開 2.打開可以查看audio Dom /** 去掉默認的背景顏色 */ audio::-webkit-media-controls-enclosure{background-color:unset; } 3.效果圖

Java官網網址及其重要資源

Java是一種廣泛應用于開發各種應用程序的編程語言,它具有跨平臺、面向對象和高性能等優勢。若你想學習Java或深入了解它的最新動態,Java官網是你的首要目的地。在本文中,我們將向你介紹Java官網的網址以及一些重要資源。 Java官網網址&#x…

TCP/IP 網絡協議族分層

TCP/IP協議族 TCP/IP不單是TCP和IP兩個協議,TCP/IP實際上是一組協議,它包括上百個各種功能的協議,如:遠程登錄、文件傳輸和電子郵件等,當然,也包括TCP、IP協議 它將軟件通信過程抽象化為四個抽象層&#…

基于SpringBoot校園外賣配送系統設計和實現(源碼+LW+調試文檔+講解等)

💗博主介紹:?全網粉絲10W,CSDN作者、博客專家、全棧領域優質創作者,博客之星、平臺優質作者、專注于Java、小程序技術領域和畢業項目實戰?💗 🌟文末獲取源碼數據庫🌟 感興趣的可以先收藏起來,…

c++:關鍵字異常處理機制

模板編程的幾個關鍵字 模(mu)板編程初體驗 (1)template和typename (2)模板實際上是一種抽象,C的高級編程特性就是不斷向抽象化發展 export (1)用來在cpp文件中定義一個模板類或模板函數,而它的聲明在對應的h文件中 (2)export專用于模板,類似…

揭秘電子世界的雙雄:模擬電路與數字電路的精彩對決!

數字電路與模擬電路,這兩者在電子工程領域可謂是兩大基石,各有千秋,各自發揮著不可或缺的作用。下面,我們就來詳細探討一下它們之間的主要區別。 1. 信號類型與處理 模擬電路:處理的是連續變化的信號,就像…

使用阿里云語音服務實現設備異常實時通知

隨著物聯網的普及,設備異常通知方式也變得多種多樣。從傳統的后臺異常列表,到短信通知,再到微信消息通知等。然而,當設備探測到火警等緊急異常時,需要實時通知到相關人員。本文將介紹如何借助阿里云的語音服務來實現這一功能。 1. 準備工作 1.1 資質申請 首先,登錄阿里…

Git中fetch與pull 的區別

一、fetch與pull的基本概念 在Git中,fetch和pull都是用于從遠程倉庫獲取數據的命令。但是,它們在處理方式和結果上有所不同。 1、fetch fetch命令用于從遠程倉庫下載最新的數據到本地倉庫,但它不會自動合并或修改當前的工作。fetch會將遠程…

2024年大廠離職當博主成為最擁擠自媒體賽道的現象分析

大廠離職博主在2024年成為最擁擠自媒體賽道的現象分析 1. 行業背景與就業環境變化 降本增效引發的被動離職:近年來,隨著各行業的降本增效措施不斷推進,即便是知名大廠也在縮減員工規模。騰訊、阿里巴巴等企業的財報顯示,從2021年…

一鍵恢復短信,4個方法,輕松找回iPhone數據!

在日常生活和工作中,短信往往承載著重要的信息和回憶。然而,意外刪除、系統故障或手機更換等情況都可能導致短信丟失,這讓很多iPhone用戶感到困擾。 好消息是,您并不需要擔心這些數據無法找回。如今,一鍵恢復短信的方…

autoware.universe源碼略讀(3.7)--perception:elevation_map_loader/euclidean_cluster

autoware.universe源碼略讀3.7--perception:elevation_map_loader/euclidean_cluster elevation_map_loadereuclidean_clustereuclidean_clustervoxel_grid_based_euclidean_cluster節點類launch文件 elevation_map_loader 在上一篇文章有提到compare_map_segmentat…

基于java+springboot+vue實現的家政服務平臺(文末源碼+Lw)299

摘 要 現代經濟快節奏發展以及不斷完善升級的信息化技術,讓傳統數據信息的管理升級為軟件存儲,歸納,集中處理數據信息的管理方式。本家政服務平臺就是在這樣的大環境下誕生,其可以幫助管理者在短時間內處理完畢龐大的數據信息&a…

Redis中hash類型的操作命令(命令的語法、返回值、時間復雜度、注意事項、操作演示)

文章目錄 字符串和哈希類型相比hset 命令hget 命令hexistshdelhkeyshvalshgetallhmgethlenhsetnxhincrbyhincrbyfloat 字符串和哈希類型相比 假設有以下一種場景:現在要在 Redis 中存儲一個用戶的基本信息(id1、namezhangsan、age17),下圖表示使用字符串…

2024護網整體工作預案示例

目錄 第1章 HW整體工作工作部署 1.1 工作組織架構 1.2 各部門工作職責 1.3 演練期間工作機制 1.3.1 工作匯報機制 1.3.2 應急響應機制 第2章 系統資產梳理整改 2.1 敏感信息梳理整改 2.2 互聯網資產發現 2.3 第三方供應商梳理 2.4 業務連接單位梳理 第3…

下載nginx搭建的文件服務器(爬蟲)

下載nginx搭建的文件服務器(爬蟲) windows版 需要下載python包:pip install requests import requests import re import os#開始訪問的url地址,必須以/結尾 index_url "https://www.aaa.com/aaaaa/" #下載到本地的地…

win10顯示毫秒-上午-下午及星期幾,24小時制

關于毫秒 winr regedit 計算機\HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced 新建ShowSecondsInSystemClock,編輯1顯示,不顯示就刪了它 然后重啟 資源管理器可能有多個全部重啟,就可以啦 根據自己喜好…