Qemu+Arm64 仿真

本文详细介绍了如何使用buildroot构建ARM64架构的Linux文件系统,包括配置模板、交叉编译器、登录信息、控制台和文件系统格式,以及如何编译内核并在QEMU环境中启动Linux系统。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、 编译文件系统

1.1 下载资源安装包

我们使用buildroot软件包来制作rootfs文件系统映像,下载buildroot软件包,并进入配置界面:

wget https://buildroot.org/downloads/buildroot-2021.08.tar.bz2
tar xvf buildroot-2021.02.4.tar.bz2
cd buildroot-2021.02.4
make menuconfig

1.2 配置模板ARM64目标平台

  • Target options->AArch64(little endian)
  • Target options-> Target Architecture Variant (cortex-A57)

示意图如下:
在这里插入图片描述

  • Target options->AArch64(little endian)
  • Target options-> Target Architecture Variant (cortex-A57)

这里可以根据自己的需要选择不同的CPU进行仿真调试

示意图如下:
在这里插入图片描述

1.3 配置交叉编译器

  • Toolchain->Toolchain type 选择“External toolchain”:

在这里插入图片描述

  • Toolchain->Toolchain选择"Arm AArch64 2020.11”:

在这里插入图片描述

1.4 配置登录用户名和密码

  • System configuration-> Enable root login with password, 并且设置root密码,这里设置为"adsf”:

在这里插入图片描述

1.5 配置Linux 控制台

  • System configuration-> Run a getty (login prompt) after boot->TTY port设置为"TTYAMA0"。

在这里插入图片描述

  • Target packages-> Debugging, profiling and benchmark可以选择自己感兴趣的工具,这里选择strace:

在这里插入图片描述

1.6 配置文件系统格式

  • Filesystem images选择cpio the root filesystem (for use as an initial RAM filesystem):

在这里插入图片描述

1.7 编译buildroot文件系统

cd $WORK_DIR/buildroot-2021.08
make

buildroot-2021.08/output/images目录下会生成两个系统映像:
在这里插入图片描述

”Your PATH contains spaces, TABs, and/or newline (\n) characters. This doesn‘t work. Fix you PATH“
如果编译时出现上述报错,sudo su 切换root用户即可

二、编译ARM64 Linux

安装交叉编译器

sudo apt install gcc-aarch64-linux-gnu

下载Linux内核,并生成默认的配置文件:

wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.14.6.tar.xz
tar xvf linux-5.14.6.tar.xz
cd linux-5.14.6.tar.xz
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- defconfig

在产生的linux-5.14.6/.config文件中修改以下三个选项:

CONFIG_CMDLINE="console=ttyAMA0"
CONFIG_INITRAMFS_SOURCE="/home/tom/hdd/linux-qemu/repos/buildroot-2021.08/output/images/rootfs.cpio"
CONFIG_DEBUG_INFO=y

CONFIG_INITRAMFS_SOURCE这里填写你自己的路径地址

编译kernel:

make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- -j4

在编译的过程中会出现需要用户配置选项的交互输入,则一路默认回车键,直到出现交互输入Built-in initramfs compression mode时,因为我们编译initramfs文件系统时,没有选择压缩模式,所以这里选择8:
在这里插入图片描述
继续回车,直到遇到Kernel command line type交互输入时,选择1:
在这里插入图片描述
其余一路回车直到配置结束,生成vmlinux,Image,Image.gz示意图如下:
在这里插入图片描述
Note: Linux原始镜像为vmlinux,后续可能是Image、Image.gz、uImage镜像, 处理过程是

  • 通过link-vmlinux.sh生成vmlinux和map文件。
  • 通过objcopy移除vmlinux中不必要段,输出binary格式Image。
  • 对Image进行压缩,输出不同格式的压缩文件,比如gzip对应的gz。
  • 对gz加上uboot头信息,生成uImage文件。
  • ARM64平台则仅支持Image.gz和Image

三、启动 Qemu Linux系统

qemu-system-aarch64 \
-machine virt \
-cpu cortex-a57 \
-machine type=virt \
-nographic -smp 1 \
-m 2048 \
-kernel ./arch/arm64/boot/Image \
--append "console=ttyAMA0"

示意图如下:在这里插入图片描述

参考链接:

  1. gdb调试Qemu ARM64仿真平台上的Linux Kernel
  2. QEMU+GDB调试Linux内核总结(全)
在IT领域中,QEMU(Quick Emulator)是一个开源的硬件虚拟化工具,支持多种架构的仿真,包括ARM64。对于开发者而言,QEMU提供了一种无需真实硬件即可测试和调试ARM64架构上运行的操作系统和应用程序的方法。 ### QEMU ARM64 Emulator Setup #### 安装QEMU 在大多数Linux发行版中,可以通过包管理器安装QEMU。例如,在Ubuntu或Debian系统中,可以使用以下命令安装QEMU及其相关工具: ```bash sudo apt update sudo apt install qemu-system-arm qemu-user-static ``` 这将安装用于ARM架构的QEMU系统模拟器以及静态用户模式模拟器[^1]。 #### 配置内核 为了在QEMU中启动一个ARM64虚拟机,需要一个适用于ARM64架构的Linux内核。可以通过编译源代码来获取适合的内核镜像。假设已经下载了Linux内核源码并进入其目录,执行以下命令以生成默认配置并编译内核: ```bash make -j4 ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- defconfig make -j4 ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- ``` 这些命令会生成针对ARM64架构的默认配置文件,并开始编译过程。编译完成后,会在`arch/arm64/boot/`目录下找到生成的内核镜像(通常是`Image`文件)。 ### QEMU ARM64 Emulator Usage #### 启动虚拟机 有了内核镜像之后,可以使用QEMU来启动一个基于该内核的虚拟机。基本的启动命令如下所示: ```bash qemu-system-aarch64 -M virt -cpu cortex-a53 -nographic -kernel path/to/your/kernel/Image ``` 这里: - `-M virt` 指定了使用的机器类型为“virt”,这是QEMU提供的一个通用虚拟平台。 - `-cpu cortex-a53` 设置了CPU模型为Cortex-A53,可以根据实际需求选择不同的CPU模型。 - `-nographic` 禁用了图形输出,使得QEMU以纯文本模式运行,这对于服务器环境特别有用。 - `-kernel path/to/your/kernel/Image` 指向之前编译好的内核镜像路径。 #### 添加根文件系统 为了让虚拟机能够正常工作,还需要为其提供一个根文件系统。可以通过添加`-initrd`选项来指定初始RAM磁盘映像,并通过`-append`选项传递内核参数。例如: ```bash qemu-system-aarch64 -M virt -cpu cortex-a53 -nographic \ -kernel path/to/your/kernel/Image \ -initrd path/to/your/initrd.img \ -append "root=/dev/ram rdinit=/sbin/init" ``` 在这个例子中,`-initrd`指定了初始RAM磁盘映像的位置,而`-append`则用来传递给内核的额外参数,其中`root=/dev/ram`指明了根设备,`rdinit=/sbin/init`则指定了初始化进程。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值