RK3566从零构建Linux系统
linux系统的组成
linux系统可以分成3个部分,分别是:uboot,kernel,rootfs。三个部分各自独立,但是互相有关联,可以用一个图来描述
三者之间的关系可以简单的描述:
-
Uboot阶段:启动部分外设(网络,sd卡,emmc等),去存储介质的特定地址读取kernel和dtb到内存,传递bootarg,然后调转到kernel,启动kernel,uboot就结束了
-
启动kernel阶段: 这个时候启动在内核中指定的外设,初始化应用,当内核启动无误后,从指定的地址挂在rootfs
-
rootfs阶段: 基本到这个阶段,就是进入了我们日常见到的系统,根据各种Linux发行版也都是rootfs的构建差异
三者的关系可以参考瑞芯微给出的手册来看
三个部分和硬件强相关的是uboot,基本要使用厂商提供的,但是厂商的uboot也是基于uboot源码修改,所以也可以对其增加功能和修改
其次是kernel,只要支持主线的linux(看设备树),在配置好平台选项和设备树后,就可以开始编译了
rootfs和硬件关系最小,基本前两个步骤启动后,rootfs挂在完成就结束了
开始构建系统
首先从官方仓库拉取uboot和linux代码,linux也可以从主线拉取,一个道理,不再赘述,rk官方gtihub仓库链接
我这里是拉取5.10的内核版本,图片为拉取好的结果
编译uboot
进入uboot目录,修改make.sh内容,主要是配置交叉编译工具链和架构
根据cpu架构,修改对应的工具链,上方有个rkbin的工具需要使用,所以我们回到上级目录再去拉取这个文件,也在官方的github仓库,这个是拉取好的结果
配置使用的工具链,我是用的是gcc-linaro-7.4.1-2019.02-x86_64_aarch64-linux-gnu,交叉编译工具链的版本不能太低
先去修改uboot/make.sh的工具链地址
修改好的结果
在uboot目录下打开终端,使用**./make.sh rk3566**(可以替换成你的芯片)
编译完成,成功的话会生成uboot.img和spl文件,图片如下
但是有img还不行,根据官方的手册,这个还不行,还需要打包成itb文件
先在环境中设置ARCH和CROSS_COMPILE
export ARCH=arm64
export CROSS_COMPILE=/home/qzl/gcc-linaro-7.4.1-2019.02-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-
根据手册,使用make u-boot.itb来打包
编译完成,生成u-boot.itb文件
到此为止,和uboot相关的内容全部完成,官方参考链接如下:rk官方的uboot资料
编译kernel
进入kernel目录,打开终端配置环境,和上面一样
export ARCH=arm64
export CROSS_COMPILE=/home/qzl/gcc-linaro-7.4.1-2019.02-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-
按照官方的手册,先设置默认编译配置
make rockchip_linux_defconfig
然后使用准备编译,指令如下
make 设备树名.img -j16
这里由于板子使用的泰山派的,所以要先把泰山派相关的设备树放到我们的目录,开始编译
这个是完成编译的图片
这里我使用的使用sd卡启动,这个时候我们还需要制作一下kernel相关的文件夹
这个是官方指导步骤,简单的说,就是创建一个文件夹,将kernel的可执行文件和设备树放入,再创建一个extlinux.config
注意修改内核版本和设备树名字
到此为止可以去设置sd卡了
烧写入SD卡
插入sd卡,连接入虚拟机
使用Gparted工具来设置分区,先看看rockchip的存储介质地址划分
这里的一个地址大小是512字节,要注意
uboot是在0x4000-0x8000,长度总共8MB
kernel是在0x8000-0x40000的地址区间,长度是100MB,也就是内核的启动文件加设备树不能大于100M,这里的kernel区域需要分区格式(ext2和ex4都行)
roofs在0x40000以后,都是rootfs的内容
知道这些就可以对sd卡分区了
这个是我划分好的sd卡分区,前16M是给uboot相关的,100M给kernel,后面全给rootfs
先将u-boot.itb写入0x4000
sudo dd if=u-boot.itb of=/dev/sdb seek=16384
写完后,使用
sync
确保写入
后面写入kernel分区的内容,主要是将之前建立的boot下的内容拷贝进分区就行了
1.设置挂载点
mkdir mnt
sudo su
mount /dev/sdb1 mnt
2.将boot内容拷贝
cp -r kernel/boot/* mnt/
3.取消挂载
umount mnt
后面还是使用sync确保写入
拔出sd卡,插入板子,上电,可以看到内核启动的日志,但是最后会卡住,因为我们还没有文件系统
配置文件系统
我们这里使用buildroot来配置,buildroot可以理解成高级的busybox,也可以被指成ubunt和debain,都是可以的
进入buildroot的目录,开始配置先进menuconfig
make menuconfig
进入Target options,配置cpu架构
进入Toolchain配置内核版本
配置文件系统
后面就是编译buildroot,生成的路径如下
buildroot-2024.02.2/output/images
将其压缩放入rootfs分区解压,然后启动板子
内核版本
[外链图片转存中…(img-rXa7gpAb-1716262503296)]
配置文件系统
[外链图片转存中…(img-aG9x73Wx-1716262503297)]
后面就是编译buildroot,生成的路径如下
buildroot-2024.02.2/output/images
将其压缩放入rootfs分区解压,然后启动板子