从零构建Linux系统

RK3566从零构建Linux系统

linux系统的组成

linux系统可以分成3个部分,分别是:uboot,kernel,rootfs。三个部分各自独立,但是互相有关联,可以用一个图来描述

三者之间的关系可以简单的描述:

  • Uboot阶段:启动部分外设(网络,sd卡,emmc等),去存储介质的特定地址读取kerneldtb到内存,传递bootarg,然后调转到kernel,启动kerneluboot就结束了

  • 启动kernel阶段: 这个时候启动在内核中指定的外设,初始化应用,当内核启动无误后,从指定的地址挂在rootfs

  • rootfs阶段: 基本到这个阶段,就是进入了我们日常见到的系统,根据各种Linux发行版也都是rootfs的构建差异

三者的关系可以参考瑞芯微给出的手册来看

image-20240519154731572

三个部分和硬件强相关的是uboot,基本要使用厂商提供的,但是厂商的uboot也是基于uboot源码修改,所以也可以对其增加功能和修改

其次是kernel,只要支持主线的linux(看设备树),在配置好平台选项和设备树后,就可以开始编译了

rootfs和硬件关系最小,基本前两个步骤启动后,rootfs挂在完成就结束了

开始构建系统

首先从官方仓库拉取uboot和linux代码,linux也可以从主线拉取,一个道理,不再赘述,rk官方gtihub仓库链接

我这里是拉取5.10的内核版本,图片为拉取好的结果

image-20240519155505348

编译uboot

进入uboot目录,修改make.sh内容,主要是配置交叉编译工具链和架构

image-20240519155807982

image-20240519155914561

根据cpu架构,修改对应的工具链,上方有个rkbin的工具需要使用,所以我们回到上级目录再去拉取这个文件,也在官方的github仓库,这个是拉取好的结果

image-20240519160252649

配置使用的工具链,我是用的是gcc-linaro-7.4.1-2019.02-x86_64_aarch64-linux-gnu,交叉编译工具链的版本不能太低

先去修改uboot/make.sh的工具链地址

修改好的结果

image-20240519160739144

在uboot目录下打开终端,使用**./make.sh rk3566**(可以替换成你的芯片)

image-20240519160921120

编译完成,成功的话会生成uboot.imgspl文件,图片如下

image-20240519161041431

但是有img还不行,根据官方的手册,这个还不行,还需要打包成itb文件

image-20240519161433657

先在环境中设置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来打包

image-20240519161818779

编译完成,生成u-boot.itb文件

image-20240519162011482

到此为止,和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

这里由于板子使用的泰山派的,所以要先把泰山派相关的设备树放到我们的目录,开始编译

这个是完成编译的图片

image-20240519164541743

这里我使用的使用sd卡启动,这个时候我们还需要制作一下kernel相关的文件夹

image-20240519164802724

这个是官方指导步骤,简单的说,就是创建一个文件夹,将kernel的可执行文件和设备树放入,再创建一个extlinux.config

注意修改内核版本和设备树名字

image-20240519165406597

到此为止可以去设置sd卡了

烧写入SD卡

插入sd卡,连接入虚拟机

使用Gparted工具来设置分区,先看看rockchip的存储介质地址划分

File:Rockchip bootflow20181122.jpg

这里的一个地址大小是512字节,要注意

uboot是在0x4000-0x8000,长度总共8MB

kernel是在0x8000-0x40000的地址区间,长度是100MB,也就是内核的启动文件加设备树不能大于100M,这里的kernel区域需要分区格式(ext2和ex4都行)

roofs在0x40000以后,都是rootfs的内容

知道这些就可以对sd卡分区了

image-20240519170610077

这个是我划分好的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卡,插入板子,上电,可以看到内核启动的日志,但是最后会卡住,因为我们还没有文件系统

image-20240519172850287

配置文件系统

我们这里使用buildroot来配置,buildroot可以理解成高级的busybox,也可以被指成ubunt和debain,都是可以的

进入buildroot的目录,开始配置先进menuconfig

make menuconfig

进入Target options,配置cpu架构

image-20240519173635779

进入Toolchain配置内核版本

image-20240519173731058

配置文件系统

image-20240519174136200

后面就是编译buildroot,生成的路径如下

buildroot-2024.02.2/output/images

将其压缩放入rootfs分区解压,然后启动板子

内核版本

[外链图片转存中…(img-rXa7gpAb-1716262503296)]

配置文件系统

[外链图片转存中…(img-aG9x73Wx-1716262503297)]

后面就是编译buildroot,生成的路径如下

buildroot-2024.02.2/output/images

将其压缩放入rootfs分区解压,然后启动板子

image-20240519201116533

  • 45
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值