基于Licheepi 4a开发板构建自己的Linux操作系统

目录

3.6 执行烧录

3.7 启动测试

3.7.1 主机与开发板的连接

3.7.2 上电启动:U-Boot-SPL

3.7.3 U-Boot启动引导

3.7.4 U-Boot 环境

3.7.5 SBI与Kernel启动

3.7.6 挂载initramfs临时根文件系统

3.7.7 挂载真正的根文件系统

3.7.8 登录

3.7.9 整体启动流程总结

1 文档介绍

2 系统镜像的构建

2.1 构建环境搭建

2.2 内核相关镜像构建

2.2.1 kernel镜像

2.2.2 DTB镜像

2.2.3 内核模块

2.2.4 intramfs镜像构建

2.3 OpenSBI固件构建

2.4 U-Boot固件构建

2.5 rootfs根文件系统构建

2.5.1 简单构建方法:从现有可运行环境复制

2.5.2 从软件包开始构建

2.6 Boot分区镜像构建

2.7 待烧录镜像备齐

3 烧录与启动

3.1 开发板以及重要接口说明

3.2 串口连接说明

3.3 启动模式设置

3.4 烧录工具的驱动安装

3.5 与烧录主机连接


 

1 文档介绍

本文档的主要内容为基于Licheepi 4a开发板,描述一种从“零”开始构建自己的操作系统并烧录到开发板上使用的流程与方法。
什么是Licheepi 4a开发板?
LicheePi 4A 是基于 Lichee Module 4A 核心板的 高性能 RISC-V Linux 开发板,以 TH1520 为主控核心(4xC910@1.85G, RV64GCV,4TOPS@int8 NPU, 50GFLOP GPU)。LicheePi 4A 可以用作典型的 RISC-V 验证平台,其强大的性能可以较快速地实现本地编译,而无需使用 QEMU 进行编译。(更多详情请参考官网资料:https://wiki.sipeed.com/hardware/zh/lichee/th1520/lpi4a/1_intro.html

2 系统镜像的构建

2.1 构建环境搭建

为了让自己构建的操作系统可以在开发板上运行,自构建操作系统的表现形式应该为一组可烧录到开发板的镜像文件。根据本文档所选择的硬件环境以及烧录工具,烧录镜像集主要包括以下三类:

  1. U-Boot镜像:包括了U-Boot引导加载程序,烧录到对应的存储分区;
  2. Boot镜像:主要包含了Linux内核镜像、设备树文件、临时根文件系统;
  3. rootfs镜像:主要包含了用户空间根文件系统内容;
  4. 构建环境搭建
    我所用的构建整个OS镜像所在的环境为x86架构下的Ubuntu24.04的虚拟机环境。在进行真正的构建流程前,需要先在此构建环境下安装一些必要的软件来支持构建工作,大部分软件通过如下命令就可安装:
apt updateapt install parted zstd make bison bc flex kpartx \ xz-utils qemu-user-static libssl-dev \ gcc-riscv64-linux-gnu dnf rpm

2.2 内核相关镜像构建

本章节的主要内容为从内核源码编译构建出内核相关文件与镜像的操作说明,因内核负责管理硬件资源并提供对底层硬件的抽象,所以它是对CPU架构最敏感的软件之一,内核特定架构的适配是整个操作系统适配的最重要事项。

从内核源码输出的相关文件主要有:

  1. 内核镜像(Kernel Image)
  2. DTB文件(Device Tree Blob)
  3. 内核模块(module)

2.2.1 kernel镜像

Linux内核是操作系统的核心部分,它负责管理硬件资源并提供对底层硬件的抽象层,使得应用程序可以无需关心具体的硬件细节就能运行。

内核镜像(Kernel Image)指的是编译后的Linux内核输出文件,通常是一个可以直接加载到计算机内存并执行的二进制文件。

基于RISC-V开发板的内核镜像的构建流程如下:

  1. 内核配置文件
    在当前的开发板系统上,内核配置文件保存在/proc/config.gz中。把它解压提取出来,即可用作编译内核时的编译配置文件。
  2. 内核源码
    此开发板芯片的生产商(THEAD)提供了主机的基于此c910芯片的OS系统(revyos)并把相关库开源,其中就包括了内核源码库(https:// http://github.com/revyos/th1520-linux-kernel/)。选择其中的”6.6.73”分支作为内核源码。
  3. 内核编译

把上文中所述的配置文件放入到内核源码目录,并重命名为”.config”(更规范的做法应该是把此配置文件放入arch/riscv/configs目录下,并重命名为一个唯一性名称,然后通过make命令选择该配置文件)。然后执行make编译命令,示范命令如下:

make ARCH=riscv CROSS_COMPILE=riscv64-linux-gnu- -j$(nproc)

make编译时会出现配置手动设置提示,一路回车即可。最后编译出的镜像在arch/riscv/boot/Image。

2.2.2 DTB镜像

  1. DTB文件(Device Tree Blob):在嵌入式系统中,尤其是那些支持多种硬件配置的系统中,设备树(Device Tree)是一种描述硬件的数据结构。DTB文件是编译后的设备树,它告诉内核有关连接到系统的硬件的信息,而不需要为每种硬件配置单独编译内核。这样做的好处是可以简化内核的编译过程,并且可以在不重新编译内核的情况下更新硬件信息。


DTB构建流程
但按照上述的步骤编译了内核时,同时也会生成所有默认启用的dtb文件,其位于arch/riscv/boot/dts/目录下:


整个dts目录可以直接拷贝到Boot镜像下,对此之后讲到Boot分区镜像时会再详述。
现阶段,可以发现dts目录下包含了多个芯片厂商的目录,因为我们使用的开发板为Licheepi 4a,它是基于C910芯片,来自THEAD公司,所以我们真正需要的dtb文件在thead目录下:


其中的” th1520-lichee-pi-4a-16g.dtb”就是真正适配我们开发板的dtb文件。

2.2.3 内核模块

内核模块:是可以在运行时动态加载到内核中的代码片段,用于扩展内核的功能。它们通常用于驱动程序或文件系统等场景,允许在不重启系统的情况下添加或移除某些功能。


依旧是在内核源码目录下,运行以下编译命令来生成内核模块:

make ARCH=riscv CROSS_COMPILE=riscv64-linux-gnu- modules_install INSTALL_MOD_PATH=kmod

编译完成后,内核模块位置在kmod/lib/modules/*下。

2.2.4 intramfs镜像构建

initramfs(initial RAM file system)是Linux启动过程中的一个临时根文件系统,它存在于RAM中,主要用于在实际的根文件系统可用之前加载必要的驱动程序和工具,以完成内核启动后续所需的步骤。


在当前开发板系统环境下构建initrd,在根目录下执行以下命令:

find . | cpio -H newc -o | gzip > ./initrd-6.6.73.img

2.3 OpenSBI固件构建

OpenSBI(开源 Supervisor Binary Interface)是一个为RISC-V架构设计的开源固件,旨在提供一个标准化的接口,以便在硬件平台和操作系统之间进行交互。具体来说,OpenSBI实现了RISC-V SBI(Supervisor Binary Interface)规范,该规范定义了运行在机器模式(Machine Mode)下的固件与运行在监督者模式(Supervisor Mode)下的操作系统内核之间的交互接口。
使用的源码库为:http://github.com/revyos/opensbi的”th1520-v1.6”branch
编译命令:

make PLATFORM=generic FW_PIC=y CROSS_COMPILE=riscv64-buildroot-linux-gnu- -j4

编译完成后,镜像在build/platform/generic/firmware/fw_dynamic.bin。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值