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
编译并移植成功。