当前位置:首页 > 技术文章 > 正文内容

使用Qemu模拟Arm处理器,运行Linux系统

douba31个月前 (07-28)技术文章8

Qemu是一个强大的虚拟化系统,可以在Linux和Windows宿主机上运行,可以模拟各种硬件处理器,比如x86、x64、Arm、Arm64、Risc-v等等,本身代码开源。一个嵌入式系统,需要先设计硬件开发板,然后软件开发人员在开发板上调试程序,开发周期会很长。有了Qemu,硬件板子开发制作阶段,软件开发人员可以在基于Qemu的模拟机上调试程序,有利于缩短开发周期。

一 Qemu模拟器安装


要模拟一个Arm处理器,需要先有一个安装一个qemu-system-arm。在乌班图系统里,可以通过下面的命令安装:
sudo apt install qemu-system-arm
但是这个版本可能不是最新的,有时需要自己编译产生。首先下载源代码,然后解压。
wget
https://download.qemu.org/qemu-8.1.4.tar.xz

tar -xvf qemu-8.1.4.tar.xz
接着运行配置脚本,产生符合宿主机(Host)的Makefile和.config.

./configure --target-list=arm-softmmu --enable-sdl --enable-kvm --enable-linux-aio \
--prefix=/us r/local/qemu-vexpress --disable-werror

然后编译安装
make -j$(nproc)
sudo make install


将安装目录加入执行路径

echo 'export PATH=/usr/local/qemu-vexpress/bin:$PATH' >> ~/.bashrc
source ~/.bashrc

咱们验证一下是否成功
qemu-system-arm --version
安装成功会输出正确的版本号。
QEMU emulator version 8.1.4
Copyright (c) 2003-2023 Fabrice Bellard and the QEMU Project developers

二 制作嵌入式Linux内核和根文件系统镜像

获取源码

git clone --recursive https://gitee.com/han263012/linux-sty.git

获取代码后的目录结构如下:
.

├── all.sh

├── busybox

│ ├── build.sh

│ ├── busybox-1.35.0

│ ├── busybox-1.35.0.tar.bz2

│ ├── Config.in

│ └── prep-busyboxsrc.sh

├── clonesubmodule.sh

├── LICENSE

├── linux-kernel

│ ├── arch

│ ├── block

│ ├── certs

│ ├── COPYING

│ ├── CREDITS

│ ├── crypto

│ ├── Documentation

│ ├── drivers

│ ├── fs

│ ├── include

│ ├── init

│ ├── ipc

│ ├── Kbuild

│ ├── Kconfig

│ ├── kernel

│ ├── lib

│ ├── LICENSES

│ ├── MAINTAINERS

│ ├── Makefile

│ ├── mm

│ ├── net

│ ├── README

│ ├── samples

│ ├── scripts

│ ├── security

│ ├── sound

│ ├── tools

│ ├── usr

│ └── virt

├── linux-work

│ ├── aqemu

│ ├── build.sh

│ ├── cpkernelsrc.sh

│ └── rootfs

└── README.md
all.sh 是一个脚本文件,运行它,会准备代码、编译内核、创建虚拟sd卡,调用run-nolcd.sh运行虚拟机

三 运行Arm虚拟机

qemu-system-arm -nographic -sd sde.raw -M vexpress-a9 -m 512M -kernel zImage -dtb vexpress-v2p-ca9.dtb -smp 4 -append "root=/dev/mmcblk0p1 rw rootwait earlyprintk console=ttyAMA0"

这是运行Arm虚拟机的命令及参数,-sd sde.raw 表示使用sd卡镜像文件sde.raw, 它包含一个分区映射到/dev/mmcblk0 ,包含已经制作好的根文件系统。"root=/dev/mmcblk0p1 rw rootwait earlyprintk console=ttyAMA0"是传给内核的参数,-M vexpress-a9是指定开发板,-kernel zImage指定内核镜像,-dtb vexpress-v2p-ca9.dtb指定设备树文件。

Arm虚拟机运行输出的日志:
Booting Linux on physical CPU 0x0
Linux version 5.10.0 (h@ub2004) (arm-linux-gnueabihf-gcc (Linaro GCC 7.5-2019.12) 7.5.0, GNU ld (Linaro_Binutils-2019.12) 2.28.2.20170706) #1 SMP Mon Jul 21 16:26:04 CST 2025
ext4 filesystem being mounted at /root supports timestamps until 2038 (0x7fffffff)
VFS: Mounted root (ext4 filesystem) on device 179:1.
Freeing unused kernel memory: 1024K
Run /sbin/init as init process
random: crng init done
Please press Enter to activate this console.

四 在虚拟机上加载用户程序和驱动程序

根目录有一个hello程序,在镜像制作时已经加入,现在可以运行,它会输出内核的版本。

/ # ./hello
内核版本号: 5.10.0

我们再加载一个驱动,有一个hellodriver.ko的可加载驱动,使用insmod加载。

/ # cd /lib/modules/
/lib/modules # insmod hellodriver.ko
HanJ drivers/hellodriver/hellodriver.c hellodriver_init
/lib/modules # rmmod hellodriver
HanJ drivers/hellodriver/hellodriver.c hellodriver_exit

本文介绍了Qemu的安装和模拟Arm处理器的过程,并且给出了内核代码的下载方式。示范了在这个虚拟机上运行用户空间程序以及加载驱动的方式。学习嵌入式编程、Linux编程的同学可以参考。

相关文章

推荐漂亮的Linux远程SSH连接工具FinalShell

常用的Linux远程连接工具有Xshell 、SecureCRT,今天推荐的FinalShell不但界面漂亮,而且可以通过拖拽从服务器上下载文件到本地磁盘,也可以通过拖拽上传文件到远程服务器。使用起来...

在linux上怎么查看cpu信息(linux中如何查看cpu)

在 Linux 上,可以使用多种命令查看 CPU 信息。以下是最常用的几个命令:使用 lscpu 命令: 打开终端并输入以下命令:lscpu此命令将显示有关 CPU 的详细信息,包括核心数, 文章末尾...

如何检查 Linux 系统是 32 位还是 64 位?这9个命令查的又快又准!

在 Linux 系统中,位数(bit)通常指的是 CPU 架构的位宽,即 CPU 一次能够处理的数据量。32 位系统和 64 位系统在内存寻址能力、计算性能和软件支持上存在显著差异:「32 位系统」:...

Linux环境中FTP服务的安装与配置(linux服务器安装ftp命令)

简介:FTP ( 文件传输协议 ) 是 互联网常用的网络协议之一 , 它为系统提供了通过网络与远程服务器进行文件传输的简单方法,多个Web站点可以共享一个IP地址。Linux下ftp服务可以通过搭建v...

Linux系统保存文件命令的详细介绍

在windows中要想保存文件只要使用Ctrl+s即可,但是在Linux系统中呢?也是用快捷键吗?当然不是,下面开源字节为大家详细讲解一下Linux系统保存文件的命令。1.进入文件 vim 文件名(v...

Linux是什么?(linux是什么软件)

在今天的时代,计算机系统已经成为了我们生活中不可或缺的一部分。而Linux则是目前世界上最为流行和免费的操作系统之一,它以其自由和开放源代码的特点,吸引了全球大量的程序员和开发者前来使用和修改。那么,...