QEMU学习之路(8)— ARM32通过u-boot 启动Linux

QEMU学习之路(8)--- ARM32通过u-boot 启动Linux

一、前言

参考文章:
Linux内核学习------内核的编译和启动
Linux 内核的编译和模拟执行
Linux内核运行------根文件系统
Linux 内核学习------使用 uboot 加载内核

二、构建Linux内核

1、获取Linux源码

bash 复制代码
git clone https://mirrors.tuna.tsinghua.edu.cn/git/linux.git -b v5.4 linux-5.4

2、配置内核

bash 复制代码
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- vexpress_defconfig

3、编译内核

bash 复制代码
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j $(nproc)

编译出的 kernel image 位于 arch/arm/boot/zImage

三、构建busybox

1、获取busybox 源码

bash 复制代码
wget https://busybox.net/downloads/busybox-1.32.0.tar.bz2

解压,进入源码目录

bash 复制代码
tar xvf busybox-1.32.0.tar.bz2
cd busybox-1.32.0

2、配置静态编译

使用如下命令进入配置界面

bash 复制代码
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig

使用以下选项,选择静态方式编译busybox,目的是将程序的所有依赖库直接打包进二进制文件,避免了Linux系统运行时依赖动态库。

bash 复制代码
Settings  --->
    [*] Build static binary (no shared libs) 

3、编译busybox

bash 复制代码
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j $(nproc)

4、安装

使用如下命令会将busybox默认安装到_install目录下

bash 复制代码
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- install

四、构建根文件目录

创建一个sdcard.img镜像,初始化为ext4格式

bash 复制代码
dd if=/dev/zero of=sdcard.img bs=1M count=16
mkfs.ext4 sdcard.img

把镜像挂载在rootfs目录下

bash 复制代码
mkdir rootfs
sudo mount -t ext4 sdcard.img rootfs/ -o loop

将busybox文件复制到rootfs目录下

bash 复制代码
sudo cp -r busybox-1.32.0/_install/* rootfs/

进入rootfs目录,新建如下文件夹

bash 复制代码
cd rootfs
sudo mkdir etc proc sys dev var boot

设置启动有关的配置脚本,将busybox 目录下启动的脚本直接拷贝过来

bash 复制代码
sudo cp -rf ../busybox-1.32.0/examples/bootfloppy/etc/* ./etc/

修改etc/fstab文件内容如下所示

bash 复制代码
proc    /proc   proc    defaults    0   0
sysfs   /sys    sysfs   defaults    0   0
tmpfs   /var    tmpfs   defaults    0   0

修改etc/init.d/rcS文件内容如下所示

bash 复制代码
#! /bin/sh

/bin/mount -a
/sbin/mdev -s

fstab 文件中的内容指定系统启动时需要挂载的文件系统以及挂载的选项,

rcS 文件是启动脚本,其中的 /bin/mount -a 表示挂载 fstab 中指定的文件系统,/sbin/mdev -s 则负责在Linux系统启动时自动检测和管理设备

回到镜像目录,将Imagedtb文件拷贝到rootfs文件夹下

bash 复制代码
cd ../
sudo cp linux-5.4/arch/arm/boot/zImage rootfs/boot/
sudo cp linux-5.4/arch/arm/boot/dts/vexpress-v2p-ca9.dtb rootfs/boot/

取消镜像挂载

bash 复制代码
sudo umount rootfs

五、构建U-Boot

1、获取uboot源码

bash 复制代码
git clone https://gitee.com/mirrors/u-boot.git -b v2020.10 u-boot_2020.10 

2、配置编译选项

bash 复制代码
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- vexpress_ca9x4_defconfig

3、编译uboot

bash 复制代码
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j $(nproc)

六、启动测试

使用如下命令启动

bash 复制代码
qemu-system-arm -M vexpress-a9 -m 512M -kernel u-boot_2020.10/u-boot -sd ./sdcard.img -nographic -no-reboot

启动界面如下

在u-boot命令行输入如下命令,将Image和dtb加载到内存中

bash 复制代码
load mmc 0:0 0x66000000 boot/zImage
load mmc 0:0 0x66500000 boot/vexpress-v2p-ca9.dtb

设置启动参数如下

bash 复制代码
setenv bootargs "root=/dev/mmcblk0 rw console=ttyAMA0,115200 init=/linuxrc"

使用如下命令启动

bash 复制代码
bootz 0x66000000 - 0x66500000

启动界面如下所示

相关推荐
a1117769 小时前
2FA 验证码生成器(github登录验证 app)
笔记·学习
我的xiaodoujiao9 小时前
API 接口自动化测试详细图文教程学习系列32--Allure测试报告2
python·学习·测试工具·pytest
DFT计算杂谈9 小时前
无 Root 权限在 Tesla K80 零门槛部署 DeepSeek 大模型
linux·服务器·网络·数据库·机器学习
阿里云大数据AI技术10 小时前
阿里云 ES AI 引擎版:面向 Agent 场景,为亿级租户、千亿规模向量设计的搜索引擎
人工智能·elasticsearch·agent
Zhang~Ling10 小时前
从 fopen 到 struct file:从零开始拆解 Linux 文件 I/O
linux·运维·服务器
DeeplyMind11 小时前
Linux 深入 per-VMA lock:Linux 缺页路径如何摆脱 mmap_lock
linux·per-vma lock
爱写代码的森11 小时前
蒙三方库 | harmony-utils之FileUtil文件重命名与属性查询详解
linux·运维·服务器·华为·harmonyos·鸿蒙·huawei
阿里云大数据AI技术11 小时前
FalconSeek 技术解析:阿里云 Elasticsearch 云原生内核如何让查询性能飙升600%
人工智能·elasticsearch
你想知道什么?11 小时前
线性回归-学习笔记
笔记·学习·线性回归
鱼毓屿御11 小时前
从「只会聊」到「边想边做」的跃迁
前端·学习·react.js