2021SC@SDUSC
一、uboot的介紹
1.1、計算機系統的主要部件
(1)計算機系統就是以CPU為核心來運行的系統。典型的計算機系統有:PC機(臺式機+筆記本)、嵌入式設備(手機、平板電腦、游戲機)、單片機(家用電器像電飯鍋、空調)
(2)計算機系統的組成部件非常多,不同的計算機系統組成部件也不同。但是所有的計算機系統運行時需要的主要核心部件都是3個東西:
CPU?+?外部存儲器(Flash/硬盤)?+?內部存儲器(DDR SDRAM/SDRAM/SRAM)
1.2、PC機的啟動過程
(1)部署:典型的PC機的BIOS程序部署在PC機主板上(隨主板出廠時已經預制了),操作系統部署在硬盤上,內存在掉電時無作用,CPU在掉電時不工作。
(2)啟動過程:PC上電后先執行BIOS程序(實際上PC的BIOS就是NorFlash),BIOS程序負責初始化DDR內存,負責初始化硬盤,然后從硬盤上將OS鏡像讀取到DDR中,然后跳轉到DDR中去執行OS直到啟動(OS啟動后BIOS就無用了)
1.3、典型嵌入式linux系統啟動過程
(1)典型嵌入式系統的部署:uboot程序部署在Flash(能作為啟動設備的Flash)上、OS部署在FLash(嵌入式系統中用Flash代替了硬盤)上、內存在掉電時無作用,CPU在掉電時不工作。
(2)啟動過程:嵌入式系統上電后先執行uboot、然后uboot負責初始化DDR,初始化Flash,然后將OS從Flash中讀取到DDR中,然后啟動OS(OS啟動后uboot就無用了)
總結:嵌入式系統和PC機的啟動過程幾乎沒有兩樣,只是BIOS成了uboot,硬盤成了Flash。
1.4、android系統啟動過程
(1)Android系統的啟動和Linux系統(前面講的典型的嵌入式系統啟動)幾乎一樣。幾乎一樣意思就是前面完全一樣,只是在內核啟動后加載根文件系統后不同了。
(2)可以認為啟動分為2個階段:第一個階段是uboot到OS啟動;第二個階段是OS啟動后到rootfs加載到命令行執行;現在我們主要研究第一個階段,android的啟動和linux的差別在第二階段。
1.5、總結:uboot到底是干嘛的
(1)uboot主要作用是用來啟動操作系統內核。
(2)uboot還要負責部署整個計算機系統。
(3)uboot中還有操作Flash等板子上硬盤的驅動。
?(4)uboot還得提供一個命令行界面供人來操作。
二、安裝uboot
一、對 SD 卡進行格式化和創立分區
1 將 SD 卡通過讀卡器插入電腦,并連接 Linux 系統
2 打開命令行(隨便任何位置都可以)
運行 sudo fdisk -l ,查看 SD 卡的設備名,一般為 /dev/sdX ( 下圖中,紅框中的就
為 SD 卡的設備號,就為 /dev/sdb)
運行 sudo fdisk /dev/sdX (如上圖中設備號為 /dev/sdb ,則需運行 /dev/sdb ),
界面就會進入到下圖,開始給 SD 卡進行分區
輸入 o 并回車,這將會刪除所有分區
輸入 p 并回車,這將會列出所有分區,此時應該沒有任何分區
輸入 n 并回車,創建新分區,引導分區
輸入 p 并回車,新分區為主分區
輸入 1 并回車,分區序號是 1
按鍵盤回車,默認初始扇區
輸入 +256M 并回車,設置終止扇區
輸入 t 并回車,再輸入 c 并回車,設置該分區文件系統格式為 Fat32
輸入 n 并回車,創建新分區,根分區
輸入 p 并回車,新分區為主分區
輸入 2 并回車,分區序號是 2
按鍵盤回車,默認初始扇區
按鍵盤回車,默認終止扇區
輸入 w 并回車,寫入設置
?
寫完分區后,要進行格式化。推薦 256M 空間作為 boot 分區,分區文件系統 Fat32 ,
再把剩余的空間創建一個分區,分區文件系統為 Ext4 ,作為 root, 然后運行一下命令格式化
保存
sudo mkfs.vfat /dev/sdX1
sudo mkfs.ext4 /dev/sdX2
目前為止, SD 卡的格式化和分區便設置好了
二、交叉編譯 u-boot.bin,并移植到 SD 卡的 boot 分區。
1 、首先通過以下命令安裝工具包 git 、 net-tools 、 vim ,
Sudo apt install git net-tools vim
( 之后可通過命令 sudo apt install XXX ,來安裝工具包 )
2 、需要安裝 arm 的 64 位交叉編譯環境。
https://snapshots.linaro.org/gnu-toolchain/
從上面的網站中進去。下載自己想用的版本,但注意需要下載的文件命名格式為:
gcc-linaro- 版本號 - 時間 -x86_64_aarch64-linux-gnu.tar.xz.
下圖下載的為 gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz 。
將下載的 .xz 壓縮文件放到 Linux 中,在同一目錄下運行以下命令:
# 創建一個文件夾
sudo mkdir -p /opt/linaro
# 解壓到指定的文件夾路徑
sudo tar -xvf gcc-linaro-XXX-XXXX.XX-x86_64_aarch64-linux-gnu.tar -C /opt/linaro
(sudo tar -xvf gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar -C
/opt/linaro)
三 、下載 u-boot 源碼并開始編譯:
git clone https://github.com/u-boot/u-boot.git
(有可能會失敗,失敗的原因在與無法連接或是連接中斷,檢查網絡多重復幾
次)
切換到 u-boot 目錄,然后開始編譯。
運行 cd u-boot 進入到 u-boot 目錄
在編譯之前,首先需要安裝編譯必備的程序
sudo apt install u-boot-tools bison bc make flex libssl-dev ncurses-*
安裝完成后,執行下面兩行命令來設置環境
export ARCH=arm64
export CROSS_COMPILE=/opt/linaro/gcc-linaro-XXXX-XXXX-x86_64_aarch64-linux-gnu
/bin/aarch64-linux-gnu- (其中 XXXX 的部分是自己下的文件對應的版號和時間)
( 如果之后你想重新編譯 u-boot ,先運行 sudo make distclean ,清理掉之前編
譯的文件,在運行上面的兩行命令,并且注意當你每次想要編譯 u-boot 的時候,都
要運行這兩行命令。 )
接著運行以下命令,來配置 config
make rpi_arm64_defconfig
(rpi_arm64_defconfig 位于 u-boot/configs 目錄下,可在目錄搜尋 rpi ,查找出
試用樹莓派的所有 config ,我們配制 64 位的 u-boot ,所以用到 rpi_arm64_defconfig)
接著運行以下命令開始編譯
make -j4 ( 直接 make -j 就可編譯,后面的 4 是用 4 線程來進行編譯,加
快編譯速度 )
編譯完成后的 uboot.bin 文件就是可以直接在樹莓派 4b 上執行的程序。
?
到此, u-boot.bin 編譯完成。要想放到樹莓派上運行,需要官方提供的固件 (firmware)
四 、下載 firmware
https://github.com/raspberrypi/firmware
直接下載 firmware-master
我們所需的 firmware 在 boot 文件夾中,將其中的 bcm2711-rpi-4-b.dtb 、
fixup4.dat 、 start4.elf 復制到 SD 卡的 boot 分區中 ( 之前分區時大小為 256M ,格式
為 fat32 的那個 ) ,再將編譯好的 u-boot.bin 一同復制進去。自己創建一個 config.txt,
其中寫入內容 enable_uart=1? ? arm_64bit=1? ? ?kernel=u-boot.bin
到此, u-boot 編譯并移植成功。