这是我的鸿蒙系统研究系列文章的第六篇,有兴趣还可以看看前面的文章:
另外,还有关于鸿蒙系统的看法:
U-Boot 的全称是 Universal Boot Loader,其作用就是引导系统。对于我们熟悉的 PC,上电后,通过 BIOS 引导操作系统 (Windows、Linux等)。对于嵌入式系统一般将这个引导程序称作 BootLoader,U-Boot 就是目前使用得最广泛的 BootLoader。
在前面的文章中,QEMU 直接引导鸿蒙系统的 Linux 内核,这种方式缺少灵活性,关键是在实际产品中,嵌入式系统是不会直接上电引导 Linux 内核的(整个软件系统一般位于 Flash,需要能够读写 Flash)。所以本文探讨使用 U-Boot 来引导内核。
开始之前,也做一个准备工作,安装 mkImage 工具:
$ sudo apt install u-boot-tools
U-Boot 既然是用来引导内核,那肯定与具体硬件相关,所以需要从源码编译,并且还需要针对具体产品做一些修改。
下载 U-Boot 源码,并编译
U-Boot 源码选择哪个版本关系并不大,这里选择 OpenHarmony 标准系统参考实现相同的版本:u-boot-2020.01。直接去官网下载,不要直接使用 device/hisilicon/third_party/uboot/u-boot-2020.01 这个代码,因为这个版本有华为针对 Hi3516DV300 等产品进行的修改。
$ wget https://codeload.github.com/u-boot/u-boot/zip/refs/tags/v2020.01
解压源码,然后进入 U-Boot 源码目录,编译 u-boot
$ export ARCH=arm
$ export CROSS_COMPILE=arm-linux-gnueabi-
$ export LOADADDR=0x80008000
$ make vexpress_ca9x4_defconfig
$ make all
编译后得到一个 u-boot 文件,这个在后面 QEMU 加载时用到。
制作 SD 卡镜像
在鸿蒙系统研究之四:根文件系统这篇文章中,我曾写到,要将根文件系统和system镜像分开,但仔细研究鸿蒙的文件系统后发现不行,因为根文件系统中的很多文件都是指向system的符号链接,特别是 init 这个超级进程。kernel 加载之后,首先要执行 init 进程,但此时还没有机会挂载 system 镜像,导致 init 是一个空链接。
此外,鸿蒙系统启用了SeLinux,这个也是超级折磨人的一个安全特性,稍不注意就会有程序无法执行的问题。因此这里解包 system.img ,得到根文件系统,另外为了简单起见,将 vendor 镜像里面的内容也复制过来。
Vexpress A9 最多只有 128 M 的 flash,没法容纳整个鸿蒙标准系统。好在 Vexpress A9 支持 SD 卡挂载,所以这里制作一个 SD 卡镜像,通过 QEMU 模拟器挂载。
下面的内容主要查阅网上的资料,为此写了一个脚本,将整个过程自动化完成。
#!/bin/bash
# 0.设置目录变量
OHOS_SRC_ROOT=$(cd "../../.." && pwd)
# 1. 解包系统镜像,得到鸿蒙系统文件
cd ${OHOS_SRC_ROOT}/out/ohos-arm-release/packages/phone/images
# Android sparse image 和 ext4 文件系统之间转换
simg2img system.img system.ext4
# 挂载 system 镜像
mkdir system-img
sudo mount system.ext4 system-img
simg2img vendor.img vendor.ext4
# 挂载 vendor 镜像
mkdir vendor-img
sudo mount vendor.ext4 vendor-img
# 2. 制作 SD 卡镜像(1GB)
dd if=/dev/zero of=uboot.disk bs=1M count=1024
# 创建 4 个分区
sgdisk -n 0:0:+16M -c 0:kernel uboot.disk
sgdisk -n 0:0:+512M -c 0:rootfs uboot.disk
sgdisk -n 0:0:+64M -c 0:vendor uboot.disk
sgdisk -n 0:0:0 -c 0:userdata uboot.disk
# 3. 寻找一个空闲的loop设备,挂载 SD 卡镜像
loop=$(sudo losetup -f)
echo "found idle loop device: ${loop}"
sleep 1
sudo losetup ${loop} uboot.disk
sleep 3
sudo partprobe ${loop}
sleep 3
# 格式化分区
sudo mkfs.ext4 ${loop}p1
sudo mkfs.ext4 ${loop}p2
s
鸿蒙系统实战:从U-Boot引导内核到SD卡镜像制作

本文介绍了如何从U-Boot源码编译引导Linux内核,包括使用QEMU挂载SD卡镜像、处理根文件系统和SELinux问题,以及固化启动命令。详细步骤涉及文件系统操作和嵌入式系统引导流程。
最低0.47元/天 解锁文章
1655

被折叠的 条评论
为什么被折叠?



