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 支持大量的網絡相關命令,比如 dhcp、ping、nfs 和 tftpboot等等。
我們最常用的就是 ping、nfs 和 tftp 這三個命令。使用 ping 命令來查看網絡的連接狀態,使用 nfs 和 tftp 命令來從 Ubuntu 主機中下載文件。
nfs(Network File System)網絡文件系統,通過 nfs 可以在計算機之間通過網絡來分享資源,
比如我們將 linux 鏡像和設備樹文件放到 Ubuntu 中,然后在 uboot 中使用 nfs 命令將 Ubuntu 中的 linux 鏡像和設備樹下載到開發板的 DRAM 中。這樣做的目的是為了方便調試 linux 鏡像和設備樹,也就是網絡調試,通過網絡調試是 Linux 開發中最常用的調試方法。原因是嵌入式 linux開發不像單片機開發,可以直接通過 JLINK 或 STLink 等仿真器將代碼直接燒寫到單片機內部的 flash 中,嵌入式 Linux 通常是燒寫到 EMMC、NAND Flash、SPI Flash 等外置 flash 中,但是嵌入式 Linux 開發也沒有 MDK,IAR 這樣的 IDE,更沒有燒寫算法,因此不可能通過點擊一個“download”按鈕就將固件燒寫到外部 flash 中。雖然半導體廠商一般都會提供一個燒寫固件的軟件,但是這個軟件使用起來比較復雜,這個燒寫軟件一般用于量產的。其遠沒有 MDK、IAR的一鍵下載方便,在 Linux 內核調試階段,如果用這個燒寫軟件的話將會非常浪費時間,而這個時候網絡調試的優勢就顯現出來了,可以通過網絡將編譯好的 linux 鏡像和設備樹文件下載到 DRAM 中,然后就可以直接運行。
具體參看正點原子手冊。
uboot 的本質工作是引導 Linux,所以 uboot 肯定有相關的 boot(引導)命令來啟動 Linux。常用的跟 boot 有關的命令有:bootz、bootm 和 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-essentialsudo apt-get install libncurses5-devmenuconfig 重點會用到兩個文件: .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”也是支持的。