目录
- 前言
- 一、硬件配置及SDK包
- 1.硬件核心芯片
- 2.瑞芯微原厂SDK包
- 二、环境镜像文件的获取
- 1.镜像文件的组成及启动流程
- 2.获取环境所需的镜像文件
- 2.1 uboot.img
- 2.2 boot.img
- 2.3 rootfs.img
- 2.4 整体编译
- 三、镜像文件烧录
前言
自用自用自用,晚上睡觉前复盘用。当然,也欢迎大家参考指正。积极认错,坚决不该(bushi)。
uboot 版本 — 2017.09
kernel 版本 — linux 5.10.110
一、硬件配置及SDK包
1.硬件核心芯片
芯片:RK3588S,是瑞芯微(Rockchip) 推出的一款高性能系统级芯片(SoC),专为高端嵌入式应用设计。
芯片系列:cortex-A
系列 | 应用 | 特点 |
---|---|---|
Cortex-A | 高性能计算和多媒体应用,主要用于智能手机、平板电脑、智能电视和高性能嵌入式设备。 | 复杂指令集计算(CISC),高性能,拥有多媒体和计算能力 |
Cortex-M | 低功耗、实时响应和嵌入式控制,广泛用于微控制器、传感器、家电和汽车电子等领域。 | 精简指令集计算(RISC),快速响应和低延迟,低功耗 |
Cortex-R | 实时性能要求极高的嵌入式系统,如汽车控制系统、工业控制和高可靠性应用。 | 精简指令集计算(RISC),高可靠性和容错,优化了实时任务的响应时间和处理能力 |
CPU 架构:四个 ARM Cortex-A76 核心和四个 ARM Cortex-A55 核心。Cortex-A76 核心提供了强大的计算能力,适合处理复杂的应用程序,而 Cortex-A55 核心则用于处理日常任务,优化功耗和效率。
该芯片性能很强悍,主打处理音视频+AI。
2.瑞芯微原厂SDK包
SDK 的全称是 "Software Development Kit"就是软件开发工具包,用于帮助开发者在瑞芯微的处理器平台上开发应用。它包括驱动程序、库文件、示例代码、开发文档和工具,旨在简化开发过程,使开发者能够更容易地实现设备功能、进行系统集成和优化应用性能。这个包是实现硬件功能和软件交互的关键工具。
SDK 包的目录结构(部分):
文件名 | 作用 |
---|---|
app | 参考应用程序或预编译应用,帮助理解 SDK 的实际使用 |
device | 各个设备配置,存放瑞芯微的对应设备的各种配置文件 |
kernel | 整个系统的内核。也是 Linux 开源内核,内核版本为 5.10 版本 |
prebuilts | 存放瑞芯微集成在 SDK 上的交叉编译器 |
tools | 一些辅助工具和脚本,帮助开发和调试过程 |
buildroot | 用于生成嵌入式 Linux 系统的工具 |
docs | 原厂提供的各种各样的开发协助文档,里边存储各种所需的开发板文件 |
external | 瑞芯微原厂支持一些外扩的包 |
envsetup.sh | 配置脚本 ---- 就是别人提前写好的脚本,编译之前需要做适配时,就可以执行这个脚本,他里面存放了很多不同开发板的配置选项 |
二、环境镜像文件的获取
Linux操作系统的基本构成可以包括 U-Boot、Kernel 和 Rootfs。
U-Boot:这是一个引导加载程序(Bootloader),负责在系统启动时初始化硬件并加载内核。
Kernel:内核是操作系统的核心,负责硬件管理、进程调度、内存管理等基本功能。
Rootfs:根文件系统(Root Filesystem),包含操作系统运行所需的用户空间工具、库、配置文件等。
所以,如果我们想让嵌入式系统跑Linux,只需将这个三个的镜像文件烧录进去即可。
1.镜像文件的组成及启动流程
由上图所示:
- update.img镜像文件是由uboot.img、boot.img和rootfs.img三个镜像文件集合而成,里面存放的就是驱动编程所需的开发环境。
- Linux系统在板子上开始上电运行时,硬件里的厂商写的固有代码BL0会首先运行,之后就是uboot引导程序开始运行,uboot引导程序类似于bios,会唤醒系统**kernel核心(boot)开始运行,核心运行后,会带动根文件系统(rootfs)**运行。
这里简单介绍一下BL0:
IROM (Internal ROM):芯片内部固化存储代码的存储器
BL0:固化在芯片iROM中的启动代码。 作用:初始化PPL和时钟,设置看门狗,关闭中断和看门狗,初始化堆和栈;判断硬件的启动方式,去不同的启动方式的启动设备里面加载BL1。
2.获取环境所需的镜像文件
2.1 uboot.img
uboot.img使用uboot编译生成的镜像文件。U-Boot(Universal Boot Loader)译为“通用引导加载程序”,是一个广泛使用的开源引导程序,主要用于嵌入式系统的启动过程。
uboot.img的获取主要依赖于瑞芯微官方SDK包中的u-boot文件夹。我们需要使用该文件夹去编译生成适配当前芯片的uboot。
首先,我们要选配置文件(开发板是哪个就选哪个)。配置文件一般都在存放在 uboot/configs中,其中,所有的配置文件均是以 配置名_defconfig 结尾。
配置命令操作:
make + 配置文件 即可快速的配置 uboot
由于我使用的开发板是rk3588,所以我的配置命令操作就为:
make rk3588_defconfig
配置完成后,指定架构和编译器进行编译即可。
命令:make -> x86 架构和 gcc 编译器
我的如下:
make ARCH=arm64 CROSS_COMPILE=/home/zht/RK3588S/prebuilts/gcc/linux-x86/aarch64/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-
如果编译的时候找不到这个交叉编译工具,就把该编译器的路径导入到etc/profile初始化脚本文件中。
注意:更改初始化脚本文件后,需要重新启动虚拟机才能生效。
这里也可以使用官方写好脚本去编译,但没有上述方法通用。
./make.sh rk3588 ----- rk3588_defconfig
最后,生成文件一般都在u-boot文件夹中。每个厂商移植的 uboot 生成的文件名字都不一样,具体看厂商的帮助文档。
大部分的 uboot 最终生成文件一般是 u-boot.bin、u-boot.img、uboot.img这三种。
2.2 boot.img
boot.img是有kernel编译生成的镜像文件,Linux内核(kernel)是操作系统的核心部分,几乎管理着操作系统的所有的功能。
内核的五大功能:
功能 | 作用 |
---|---|
进程管理 | 控制进程的创建、调度、终止以及进程间的通信,确保多任务处理的高效和稳定。 |
内存管理 | 负责分配和回收系统内存,包括虚拟内存管理、分页和分段,以优化内存使用和系统性能。 |
文件系统管理 | 提供文件和目录的管理,包括读写操作、权限控制和文件系统的抽象,支持多种文件系统格式。 |
设备驱动管理 | 控制和管理硬件设备,提供通用接口让应用程序与硬件交互,支持不同类型的设备驱动。 |
网络管理 | 实现网络协议栈,处理网络通信,包括数据包的发送和接收,支持各种网络协议和设备。 |
瑞芯微官方 SDK包里内核文件的介绍(部分):
arch : 存放的是一些和架构有关的文件夹,例如x86,arm,arm64等。
arch/arm64/boot/dts :设备树 --用于描述硬件设备的结构和配置,使得内核可以在启动时正确识别和初始化硬件。
xxx.dts :用于定义设备树的结构和配置相当于C 语言的.c 文件。
xxx.dtsi :设备树的头文件 相当于 C 语言的.h 文件
xxx.dtb:设备树编译生成的二进制文件 相当于 C 语言的 xxx.o 文件
Kconfig:Kconfig 文件用于配置Linux内核和模块的构建选项。它定义了内核选项的菜单结构、可配置项、默认值和依赖关系,支持用户通过 make menuconfig、make xconfig 等工具自定义内核配置。
因为内核的文件是居多的几万个文件,一个个操作十分麻烦,而通过Kconfig就可以轻松的管理这几万个文件了。
内核是通过图形化界面的方式去管理的,图形化界面工具里的所有的选项都是来自于每一个目录下的每一个 Kconfig。
ipc:进程调度相关代码
mm:内存管理
Documentation:帮助文档
net:网络协议
lib:库
scripts:编译相关脚本工具
tools:编译相关工具
drivers:设备驱动
drivers/char — 他里边主要是存放咱们编写的字符设备驱动的代码
fs:管理文件系统的内容
COPYING:版本模块的一些介绍
CREDITS:光荣板信息(也就是哪些对内核做过贡献)
MAINTAINERS:记录了内核的每一个部分有哪些人员在维护
内核镜像的获取
想要获取内核的镜像文件,需要按照当前需求对内核进行配置和裁剪。配置和裁剪内核是为了优化内核镜像的大小和性能。通过选择合适的选项和剔除不必要的功能,可以减少内核的体积、提高启动速度,并减少内存占用,使得内核更适合特定硬件和应用场景。这样可以提升系统的整体效率和响应能力。
这里内核提供了一个图像化裁剪配置工具 menuconfig。它提供了一个基于文本的界面,允许用户通过选择和取消选择选项来配置内核功能。
只需在内核中输入make menuconfig即可启动。
menuconfig工具选项讲解:
[ ]:他是一个二值选项,按空格或输入y出现 * 号就代表选择上了。
<>:他是一个三值选项,和[ ]相比多了一个M选项,代表动态编译这个功能。
动态编译 | 生成镜像时,会单独生成一个可执行文件,需要手动添加到内核中,多用于测试。 |
---|---|
静态编译 | 生成镜像后会直接集成到内核镜像中。 |
清空配置信息:
make distclean 清空编译内容 还原内核配置的最原始状态
make distclean ARCH=arm
内核配置文件路径:
SDK/kernel/arch/arm64/configs/rockchip_linux_defconfig
选型配置命令格式:
make 配置文件 ARCH=arm64
例程:make rockchip_linux_defconfig ARCH=arm64
内核编译命令:
make ARCH=arm64
CROSS_COMPILE=/home/lyx/RK3588S/prebuilts/gcc/linuxx86/aarch64/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linuxgnu/bin/aarch64-none-linux-gnu-
所有版本的内核都可以通过 make menuconfig ARCH=arm64即可进入内核配置界面
内核最原始的生成的镜像是:
32bit 的芯片: arch/arm/boot/zImage(uImage)
64bit 的芯片: arch/arm64/boot/zImage(uImage)
最原始的内核生成的设备树文件:
32bit 的芯片: arch/arm/boot/dts/xxxxxx.dtb
64bit 的芯片: arch/arm64/boot/dts/rockchip/xxxxxx.dtb
瑞芯微修改过内核使用脚本将内核镜像 + 设备树二进制文件合成了一个文件 boot.img在内核的最开始的目录。
2.3 rootfs.img
上图是Linux下的根文件系统(Root Filesystem)整体文件结构,下图是部分文件的作用。
文件名 | 作用 |
---|---|
/ | 根目录是文件系统的顶层,所有其他目录都从这个目录派生。它是文件系统的起点。 |
/bin | 存放系统启动和运行所需的基本命令和程序,也就是一些二进制可执行文件,如 ls, cp, mv, rm 等。 |
/boot | 存放启动加载器(bootloader)和内核文件,如 vmlinuz(压缩内核镜像)和 initrd(初始 RAM 磁盘)。 |
/dev | 包含了系统识别的所有设备,设备文件是与硬件设备(如磁盘、打印机、串口等)进行交互的接口。Linux 下一切皆文件 — 你操作任何东西其实都是在操作文件,硬件同时也被抽象为了一个文件,他是一个特殊的文件,设备节点文件 |
/etc | 存放系统配置文件和启动脚本,如 passwd(用户信息)、fstab(文件系统表)和 network 配置文件。 |
/home | 每个用户的家目录都位于 /home 目录下,如 /home/user1。主要存放普通用户的个人文件和配置。 |
/lib | 存放共享库(libraries),这些库是供系统工具和应用程序使用的动态链接库。 |
/media | 用于挂载可移动媒体(如 CD-ROM、USB 驱动器)。系统自动挂载设备到这个目录下。 |
/mnt | 提供一个临时的挂载点,通常用于手动挂载文件系统。 |
/opt | 用于安装第三方应用程序和软件包。如QT、交叉编译器。 |
/root | 是超级用户(root)的家目录,和 /home 中的用户目录类似,但它是系统管理员使用的目录。 |
/sbin | 存放系统管理员使用的系统二进制文件和工具,这些工具通常用于系统管理和维护,如 fsck, reboot, ifconfig。 |
想要制作根文件我们需要使用开源工具Buildroot,使用Buildroot可以极大加速我们构建linux根文件系统的速度。PS:制作根文件系统的三大神器:busybox、buildroot、yocto。
Buildroot 除了能够制作根文件系统,还能制作kernel和uboot,不过其制作根文件系统制作的最好,其他都是后来附加的功能。
Buildroot的获取—官网下载:https://buildroot.org/
编译文件之前需要安装的必要库
sudo apt-get install gitk git-gui u-boot-tools device-tree-compiler gccaarch64-linux-gnu mtools parted libudev-dev libusb-1.0-0-dev autoconf
autotools-dev libsigsegv2 m4 intltool libdrm-dev curl sed make binutils buildessential gcc g++ bash patch gzip gawk bzip2 perl tar cpio python unzip rsync
file bc wget libncurses5 libglib2.0-dev libgtk2.0-dev libglade2-dev cvs git
mercurial rsync openssh-client subversion asciidoc w3m dblatex graphviz
libc6:i386 libssl-dev expect fakeroot cmake flex bison liblz4-tool libtool keychain
expect-dev
Buildroot启动
buildroot 和 uboot、Linux kernel 一样也支持图形化配置,输入如下命令即可打开图形化配置界:
make menuconfig
剩下就是按需配置生成了。生成完后,该文件会在/output/images下生成一个压缩包,需要用官方给的指令制作生成
2.4 整体编译
除了上述讲的三个单独编译,我们也可以使用瑞芯微官方给的工具进行整体编译,直接生成update.img。
先配置环境:
./envsetup.sh
启动编译器:
./build.sh lunch
整体编译命令:
./build.sh
PS:其实这里也可以单独编译uboot,kernel和rootfs,不过该方法不通用,仅适用于官方提供工具的情况下。
./build.sh uboot — uboot.img
./build.sh kernel — boot.img / zboot.img
./build.sh rootfs — rootfs.img
三、镜像文件烧录
文件烧录需要借助第三方工具,此处使用的是瑞芯微官方提供烧写工具,使用烧录工具前记得先安装一下驱动。
烧录工具界面介绍:
1.ADB烧录模式
一般设备正常时,插线上电后的默认模式就是该模式。在此模式下,我们可以通过终端命令和硬件设备进行交互。
2.LOADER模式
想进入该模式,只需在ADB烧录模式下,点击切换即可。
此模式下,我们可以单独的去烧写 uboot、kernel、rootfs这三个的镜像文件。
但是在烧录之前我们需要导入烧录到的硬件地址,烧录位置的地址文件在rockdev目录下。
如何导入?
将鼠标放到烧录工具面板上,鼠标右键,点击导入配置即可。
3.MASKROM 模式
想进入该模式,我们需要在LOADER模式下,先点击高级功能,再点击进入Maskrom即可。
进入到该模式,我们点击升级固件
此处我们就可以导入update镜像文件进行整体烧录了。
烧录时,不小心将设备烧成砖了怎么办?
设备上电后,同时按着 reset 和 boot 按键,然后先松开 reset 再松开 boot。此时我们就可以直接进入到Maskrom模式,重新进行镜像烧录。