目录
目录
1 概述
本文介绍如何使用qemu搭建一个嵌入式开发环境,从uboot依次启动kernel和文件系统,使用Vexpress系列开发板的Express A9x4板子。
本实验宿主机是Ubuntu22.04虚拟机。
2 环境准备
2.1 vexpress系列开发板介绍
全称versatile express family,是 ARM公司自己推出的开发板,主要用于SOC厂商设计,验证和测试自己的SOC芯片,采用主板+子板设计,主板提供各种外围接口,子板提供CPU运算。本文使用的Vexpress A9X4芯片手册在arm官网可以搜到:
https://developer.arm.com/documentation/dui0448/i/?lang=en
2.2 安装工具
2.2.1 安装交叉工具链
Vexpress A9X4是armv7架构芯片,这里使用arm-linux-gnueabi-,使用如下命令安装:
sudo apt install -y gcc-arm-linux-gnueabi
sudo apt install -y g++-arm-linux-gnueabi
2.2.2 安装qemu
使用命令安装:
# For full system emulation
sudo apt install qemu-system
#For emulating Linux binaries
sudo apt install qemu-user-static
使用源码安装
#https://www.qemu.org/
#https://wiki.qemu.org/Hosts/Linux
git clone https://gitlab.com/qemu-project/qemu.git
git checkout remotes/origin/stable-8.2 -b stable-8.2
sudo apt-get install git libglib2.0-dev libfdt-dev libpixman-1-dev zlib1g-dev ninja-build
sudo apt-get install git-email
sudo apt-get install libaio-dev libbluetooth-dev libcapstone-dev libbrlapi-dev libbz2-dev
sudo apt-get install libcap-ng-dev libcurl4-gnutls-dev libgtk-3-dev
sudo apt-get install libibverbs-dev libjpeg8-dev libncurses5-dev libnuma-dev
sudo apt-get install librbd-dev librdmacm-dev
sudo apt-get install libsasl2-dev libsdl2-dev libseccomp-dev libsnappy-dev libssh-dev
sudo apt-get install libvde-dev libvdeplug-dev libvte-2.91-dev libxen-dev liblzo2-dev
sudo apt-get install valgrind xfslibs-dev
sudo apt-get install libnfs-dev libiscsi-dev
./configure --target-list=arm-softmmu --audio-drv-list=
make
sudo make install
验证:
qemu-system-arm --version
2.2.3 安装其他工具
sudo apt-get install kpartx parted #制作文件系统使用
sudo apt install -y u-boot-tools #uboot编译依赖相关工具
其他的编译期间出错缺少依赖,按照提示安装即可。
3 启动uboot
3.1 uboot下载与编译
3.1.1 下载
从官网下载uboot源码
https://ftp.denx.de/pub/u-boot/
或者使用git下载
git clone https://github.com/u-boot/u-boot.git
笔者的环境访问不了github,从官网下载了u-boot-2023.07.tar.bz2
3.1.2 编译
解压后的uboot文件夹为u-boot-2023.07,进入该目录编译
#!/bin/bash
export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabi-
make vexpress_ca9x4_defconfig # vexpress 配置
make -j8
编译后在顶层下得到u-boot可执行文件
3.2 使用qemu启动uboot
上述uboot编译后,即可通过如下命令启动u-boot到命令行
#-M 使用qemu仿真 vexpress-a9 machine,
#-m 指定qemu虚拟机内存 512M
#-nographic 不使用图形化界面(串口输出)
qemu-system-arm \
-M vexpress-a9 \
-m 512M \
-kernel /home/xxx/workspace/labs/u-boot-2023.07/u-boot \
-nographic \
4 启动kernel
4.1 下载和编译kernel
4.1.1 下载kernel
去Linux kernel官网下载
或者使用命令行下载:
git clone https://github.com/torvalds/linux.git
笔者直接从官网下载,版本为linux-5.15.158.tar.xz
4.1.2 编译kernel
使用如下命令来编译Linux内核
#!/bin/bash
export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabi-
#配置内核
make vexpress_defconfig
#编译内核,本实验使用的是uImage,镜像结果在arch/arm/boot下
make -j4 && make LOADADDR=0x60003000 uImage -j4
#编译内核模块
make modules -j4
#编译device tree,生成.dtb文件,这里是vexpress-v2p-ca9.dtb
make dtbs
4.2 启动Linux内核
由于uboot启动kernel,需要uboot修改些地方,这里先不使用uboot启动kernel,直接启动运行kernel,后面章节整体介绍uboot启动kernel。
使用如下命令来启动Linux kernel
#-M 使用qemu仿真 vexpress-a9 machine,
#-m 指定qemu虚拟机内存 512M
#-kernel 指定 qemu使用的kernel image
#-dtb 指定 qemu boot kernel 时使用的设备树
#-nographic 不使用图形化界面(串口输出)
#-append "xx" 指定kernel启动参数(串口输出参数)
qemu-system-arm \
-M vexpress-a9 \
-m 512M \
-kernel arch/arm/boot/zImage \
-dtb arch/arm/boot/dts/vexpress-v2p-ca9.dtb \
-nographic \
-append "console=ttyAMA0"
最后在挂载文件系统时停下来,文件系统此时还没加。