Qemu 详解与 ARM 虚拟机搭建指南

news2025/3/18 12:40:34
1. Qemu 是什么?

Qemu(Quick Emulator)是一款开源的机器模拟器虚拟化工具,支持多种硬件架构(如 x86、ARM、PowerPC 等)。它的核心功能包括:

  • 动态指令翻译:将不同架构的指令实时翻译为本机指令(如将 ARM 指令翻译为 x86 指令)。

  • 全系统模拟:模拟完整的计算机硬件环境(CPU、内存、外设等),允许运行未经修改的操作系统。

  • 虚拟化加速:与 KVM(Kernel-based Virtual Machine)结合时,能直接利用硬件虚拟化技术(如 Intel VT-x、AMD-V),提供接近物理机的性能。


2. Qemu 的两种模式
  1. 用户模式(User Mode)

    • 功能:运行跨架构的单个程序(如 ARM 程序在 x86 主机上执行)。

    • 原理:动态翻译目标程序的指令集,无需模拟整个操作系统。

    • 示例:在 x86 主机上直接运行 ARM 架构的 hello_world 程序:

      qemu-arm ./hello_world
  2. 系统模式(System Mode)

    • 功能:模拟完整的计算机系统(如 CPU、内存、硬盘、网络等)。

    • 应用:运行完整的操作系统(如 Ubuntu ARM 版),适合开发、测试和调试。

    • 性能优化:结合 KVM 时,可启用硬件虚拟化加速。


3. 为什么需要 ARM 模拟系统?
  • 跨平台开发:在 x86 主机上开发和测试 ARM 软件(如嵌入式系统、IoT 设备程序)。

  • 成本与便捷性:无需购买物理 ARM 设备,即可调试和验证系统。

  • 兼容性测试:验证软件在不同架构下的行为。


4. Qemu 能做什么?适合哪些场景?
  • 跨架构程序运行:直接运行不同指令集的程序。

  • 操作系统开发:模拟完整的硬件环境,调试内核或驱动程序。

  • 虚拟化:创建轻量级虚拟机(需 KVM 支持)。

  • 教育与研究:学习计算机体系结构或操作系统原理。


5. 在 Ubuntu 16.04 搭建 ARM 虚拟机的步骤

以下以模拟 ARM vexpress-a9 开发板为例:

1. 安装 Qemu 及依赖
sudo apt update
sudo apt install qemu-system-arm gcc-arm-linux-gnueabihf
2. 准备 ARM 系统镜像
  • 下载内核和根文件系统

    wget https://files.kernel.org/pub/linux/utils/boot/qemu/vexpress/zImage
    wget https://files.kernel.org/pub/linux/utils/boot/qemu/vexpress/vexpress-v2p-ca9.dtb
    wget https://downloads.openwrt.org/releases/19.07.1/targets/armvirt/32/openwrt-armvirt-32-rootfs-ext4.img.gz
    gunzip openwrt-armvirt-32-rootfs-ext4.img.gz
3. 启动 ARM 虚拟机
qemu-system-arm \
  -M vexpress-a9 \
  -m 512M \
  -kernel zImage \
  -dtb vexpress-v2p-ca9.dtb \
  -append "root=/dev/mmcblk0 console=ttyAMA0" \
  -drive file=openwrt-armvirt-32-rootfs-ext4.img,format=raw,if=sd \
  -nographic
  • 参数说明

    • -M vexpress-a9: 模拟 ARM vexpress-a9 开发板。

    • -m 512M: 分配 512MB 内存。

    • -kernel-dtb: 指定内核和设备树文件。

    • -drive: 加载根文件系统镜像。

    • -nographic: 禁用图形界面,直接使用终端。

4. 登录虚拟机

启动后输入用户名 root(无密码),进入 ARM 虚拟系统。


6. 编写并运行 HelloWorld 程序
1. 交叉编译 ARM 程序

在主机上编写 hello.c

#include <stdio.h>
int main() {
  printf("Hello, ARM World!\n");
  return 0;
}

编译为 ARM 可执行文件:

arm-linux-gnueabihf-gcc -static hello.c -o hello
2. 将程序传输到虚拟机
  • 方法 1:通过虚拟 SD 卡

    1. hello 复制到根文件系统镜像:

      sudo mount openwrt-armvirt-32-rootfs-ext4.img /mnt
      sudo cp hello /mnt/root/
      sudo umount /mnt
    2. 在虚拟机中运行:

      ./hello
  • 方法 2:通过网络传输

    1. 在虚拟机中启动 SSH 服务。

    2. 使用 scp 从主机传输文件:

      scp hello root@虚拟机IP:/root/

总结

通过 Qemu 的系统模式,开发者可以在 x86 主机上低成本地模拟完整的 ARM 环境,极大方便了嵌入式开发和跨平台测试。结合交叉编译工具链,能够快速验证程序在目标架构上的行为。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2317224.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JVM并发编程AQSsync锁ReentrantLock线程池ThreadLocal

并发编程2 synchronized锁实现**AQS****ReentrantLock实现****JUC 常用类**池的概念 ThreadLocalThreadLocal原理内存泄露强引用:软引用弱引用虚引用ThreadLocal内存泄露 synchronized锁实现 synchronized是一个关键字,实现同步,还需要我们提供一个同步锁对象,记录锁状态,记录…

什么是数学建模?数学建模是将实际问题转化为数学问题

数学建模是将实际问题转化为数学问题&#xff0c;并通过数学工具进行分析、求解和验证的过程。 一、数学建模的基本流程 问题分析 • 明确目标&#xff1a;确定需要解决的核心问题。 • 简化现实&#xff1a;识别关键变量、忽略次要因素。 • 定义输入和输出&#xff1a;明确模…

唤起“队列”的回忆

又来博客记录自己的学习心得了&#xff0c;嘿嘿嘿(^&#xff5e;^) 目录 队列的概念和结构&#xff1a; 队列的创建和初始化&#xff1a; 队列入栈&#xff1a; 队列出栈&#xff1a; 队列的销毁&#xff1a; 取队头和队尾数据&#xff1a; 结语&#xff1a; 队列的概念…

Linux(8.4)NFS

文章目录 一、概念二、详解NFS1&#xff09;软件名2&#xff09;服务名3&#xff09;配置文件4&#xff09;端口号5&#xff09;相关命令 三、部署NFS一、NFS服务端1&#xff09;**配置源&#xff08;本地或者网络源&#xff09;**2&#xff09;2、安装NFS**3&#xff09;启动服…

【位运算】速算密钥:位运算探秘

文章目录 前言例题一、判定字符是否唯一二、丢失的数字三、两整数之和四、只出现⼀次的数字 II五、消失的两个数字 结语 前言 什么是位运算算法呢&#xff1f; 位运算算法是以位运算为核心操作&#xff0c;设计用来高效解决特定问题的一系列计算步骤集合。它巧妙利用位运算直接…

STM32G070CBT6读写FLASH中的数据

向FLASH中写入数据函数 /*函数说明&#xff1a;向FLASH中写数据形参&#xff1a;addr-要写入数据的起始地址 data-准备写入数据 len-数据大小返回值&#xff1a;1-成功&#xff0c;0-失败 */ uint8_t FlashWriteData(uint64_t addr,uint8_t data[],size_t len) {uint32_t Fir…

AD绘图基本操作

一、基本操作 注意&#xff1a;快捷键都要在英文模式下才能生效 1、移动 按住鼠标右键移动 2、切换桌面栅格距离 G 3、英寸和毫米 尺寸切换 Q 4、元件在3D模式下的移动 3D视角鼠标左键只起到选择元器件并移动之的功能&#xff0c; 单纯鼠标右键只能平移桌面 shift鼠…

dfs(十二)21. 合并两个有序链表 递归解决

21. 合并两个有序链表 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1&#xff1a; 输入&#xff1a;l1 [1,2,4], l2 [1,3,4] 输出&#xff1a;[1,1,2,3,4,4]示例 2&#xff1a; 输入&#xff1a;l1 [], l2 [] …

51单片机指令系统入门

目录 基本概念讲解 一、机器指令​ 二、汇编指令​ &#xff08;一&#xff09;汇编指令的一般格式 &#xff08;二&#xff09;按字节数分类的指令 三、高级指令 总结​ 基本概念讲解 指令是计算机&#xff08;或单片机&#xff09;中 CPU 能够识别并执行的基本操作命令…

安全无事故连续天数计算,python 时间工具的高效利用

安全天数计算&#xff0c;数据系统时间直取&#xff0c;安全标准高效便捷好用。 笔记模板由python脚本于2025-03-17 23:50:52创建&#xff0c;本篇笔记适合对python时间工具有研究欲的coder翻阅。 【学习的细节是欢悦的历程】 博客的核心价值&#xff1a;在于输出思考与经验&am…

如何玩DeepSeek!15分钟快速创建GIS动态数据可视化仪表盘

DeepSeek最近火遍全球&#xff0c;大家用的都用的不亦乐乎。国外呢&#xff1f;当然也是&#xff0c;最近一上YouTube、X等都是deepseek的推送。 今天介绍一下&#xff0c;我在YouTube上看到的GIS行业与DeepSeek结合的一个案例&#xff1a; 快速轻松构建交互式地图仪表盘&…

课上测试:MIRACL共享库使用测试

MIRACL(MultiprecisionIntegerandRationalArithmeticC/cLibrary)是著名的密码算法库&#xff0c;设法去官网下载安装MIRACL&#xff0c;提交安装过程截图或过程文本&#xff08;3分&#xff09;. 去github官网下载.zip文件 使用如下命令进行解压 unzip -j -aa -L MIRACL-mast…

网络编程知识预备阶段

1. OSI七层模型 OSI&#xff08;Open System Interconnect&#xff09;七层模型是一种将计算机网络通信协议划分为七个不同层次的标准化框架。每一层都负责不同的功能&#xff0c;从物理连接到应用程序的处理。这种模型有助于不同的系统之间进行通信时&#xff0c;更好地理解和…

STM32微控制器_03_GPIO原理与应用

核心内容 STM32 GPIO基本原理&#xff08;熟悉&#xff09;GPIO输出功能HAL库编程实现的应用&#xff08;重点&#xff09;GPIO输入功能HAL库编程实现的应用&#xff08;重点&#xff09; 一.STM32 GPIO基本原理 1.GPIO简介 STM32的GPIO相当于STM32的四肢&#xff0c;一个S…

零拷贝分析

kafka 零拷贝 请求 - 网口 - socket - 用户态 - 内核缓存区 - 内核态&#xff08;磁盘信息&#xff09; 磁盘 - 内核缓存区 - 用户缓存区 - 网络缓存区 零拷贝&#xff08;Zero-Copy&#xff09; 是一种高效的数据传输技术&#xff0c;旨在减少数据在内存中的拷贝次数&#x…

从Instagram到画廊:社交平台如何改变艺术家的展示方式

从Instagram到画廊&#xff1a;社交平台如何改变艺术家的展示方式 在数字时代&#xff0c;艺术家的展示方式正在经历一场革命。社交平台&#xff0c;尤其是Instagram&#xff0c;已经成为艺术家展示作品、与观众互动和建立品牌的重要渠道。本文将探讨社交平台如何改变艺术家的…

✎ 一次有趣的经历

&#x1f4c6;2025年3月17日 | 周一 | ☀️晴 &#x1f4cd;今天路过学院楼7&#xff0c;见到了满园盛开的花&#x1f33a;&#xff0c;心情瞬间明朗&#xff01; &#x1f4cc;希望接下来的日子也能像这些花一样&#xff0c;充满活力&#x1f525;&#xff01; &#x1…

快!快!快!NDPP时延测试数据公布!

在全方位认识NDPP第3期《NDPP在金融场景的应用》中&#xff0c;我们重点介绍了NDPP的典型应用场景行情解码硬件加速和策略计算加速&#xff0c;并帮助某百亿私募用户基于NDPP实现期货业务加速的案例。 近期&#xff0c;中科驭数凭借低时延产品荣获信创“大比武”行业融合赛道三…

激光雷达“开卷”2.0,头部Tier1入局

高阶智驾的普及&#xff0c;正在催生激光雷达市场的巨大潜在增长空间。 本周&#xff0c;汽车激光雷达主力供应商之一的禾赛科技发布财报&#xff0c;去年第四季度激光雷达总交付量为222,054台&#xff0c;同比增长153.1%&#xff0c;超过2023年全年。2024全年激光雷达总交付量…

力扣No.376.摆动序列

题目&#xff1a; 链接&#xff1a; https://leetcode.cn/problems/wiggle-subsequence/description/ 代码&#xff1a; class Solution {public int wiggleMaxLength(int[] nums) {int nnums.length;//状态表示:int[] fnew int[n];int[] gnew int[n];//初始化:for(int i0;i…