Qemu 详解与 ARM 虚拟机搭建指南
1. Qemu 是什么?
Qemu(Quick Emulator)是一款开源的机器模拟器和虚拟化工具,支持多种硬件架构(如 x86、ARM、PowerPC 等)。它的核心功能包括:
动态指令翻译:将不同架构的指令实时翻译为本机指令(如将 ARM 指令翻译为 x86 指令)。
全系统模拟:模拟完整的计算机硬件环境(CPU、内存、外设等),允许运行未经修改的操作系统。
虚拟化加速:与 KVM(Kernel-based Virtual Machine)结合时,能直接利用硬件虚拟化技术(如 Intel VT-x、AMD-V),提供接近物理机的性能。
2. Qemu 的两种模式
用户模式(User Mode):
功能:运行跨架构的单个程序(如 ARM 程序在 x86 主机上执行)。
原理:动态翻译目标程序的指令集,无需模拟整个操作系统。
示例:在 x86 主机上直接运行 ARM 架构的
hello_world程序:qemu-arm ./hello_world系统模式(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 卡:
-
将
hello复制到根文件系统镜像:sudo mount openwrt-armvirt-32-rootfs-ext4.img /mnt sudo cp hello /mnt/root/ sudo umount /mnt
-
在虚拟机中运行:
./hello
-
-
方法 2:通过网络传输:
-
在虚拟机中启动 SSH 服务。
-
使用
scp从主机传输文件:scp hello root@虚拟机IP:/root/
-
总结
通过 Qemu 的系统模式,开发者可以在 x86 主机上低成本地模拟完整的 ARM 环境,极大方便了嵌入式开发和跨平台测试。结合交叉编译工具链,能够快速验证程序在目标架构上的行为。
相关文章:
Qemu 详解与 ARM 虚拟机搭建指南
1. Qemu 是什么? Qemu(Quick Emulator)是一款开源的机器模拟器和虚拟化工具,支持多种硬件架构(如 x86、ARM、PowerPC 等)。它的核心功能包括: 动态指令翻译:将不同架构的指令实时翻…...
JVM并发编程AQSsync锁ReentrantLock线程池ThreadLocal
并发编程2 synchronized锁实现**AQS****ReentrantLock实现****JUC 常用类**池的概念 ThreadLocalThreadLocal原理内存泄露强引用:软引用弱引用虚引用ThreadLocal内存泄露 synchronized锁实现 synchronized是一个关键字,实现同步,还需要我们提供一个同步锁对象,记录锁状态,记录…...
CMake学习笔记(三):静态库,动态库的生成和使用
一:动态库 接下来我们简单的讲解下动态库的建立和使用:在后面的项目的开发过程中,我们使用第三方库或者我们跑这个项目的时候我们总会看到一些.so的文件,这些就是所谓的动态库,里面的内容就是编译后的源文件,是程序运行时被加载和…...
《Classifier-Free Diffusion Guidance》的核心观点与方法
介绍《Classifier-Free Diffusion Guidance》的核心观点与方法 在扩散模型(Diffusion Models)的研究中,如何在生成样本的质量与多样性之间找到平衡一直是核心挑战之一。传统的生成模型(如GANs或Glow)通过截断…...
什么是数学建模?数学建模是将实际问题转化为数学问题
数学建模是将实际问题转化为数学问题,并通过数学工具进行分析、求解和验证的过程。 一、数学建模的基本流程 问题分析 • 明确目标:确定需要解决的核心问题。 • 简化现实:识别关键变量、忽略次要因素。 • 定义输入和输出:明确模…...
唤起“队列”的回忆
又来博客记录自己的学习心得了,嘿嘿嘿(^~^) 目录 队列的概念和结构: 队列的创建和初始化: 队列入栈: 队列出栈: 队列的销毁: 取队头和队尾数据: 结语: 队列的概念…...
Linux(8.4)NFS
文章目录 一、概念二、详解NFS1)软件名2)服务名3)配置文件4)端口号5)相关命令 三、部署NFS一、NFS服务端1)**配置源(本地或者网络源)**2)2、安装NFS**3)启动服…...
【位运算】速算密钥:位运算探秘
文章目录 前言例题一、判定字符是否唯一二、丢失的数字三、两整数之和四、只出现⼀次的数字 II五、消失的两个数字 结语 前言 什么是位运算算法呢? 位运算算法是以位运算为核心操作,设计用来高效解决特定问题的一系列计算步骤集合。它巧妙利用位运算直接…...
STM32G070CBT6读写FLASH中的数据
向FLASH中写入数据函数 /*函数说明:向FLASH中写数据形参:addr-要写入数据的起始地址 data-准备写入数据 len-数据大小返回值:1-成功,0-失败 */ uint8_t FlashWriteData(uint64_t addr,uint8_t data[],size_t len) {uint32_t Fir…...
算法刷题记录——LeetCode篇(4) [第301~400题](持续更新)
(优先整理热门100及面试150,不定期持续更新,欢迎关注) 322. 零钱兑换 给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。 计算并返回可以凑成总金额所需的最少的硬币个数。如果没有任何…...
目标检测任务,如何区分两个相近似的目标
首先,要了解清楚检测的场景下,肉眼能否区分出目标的差异性。 如果可以区分,那观察数据周围背景的差异是否较大,可以先通过添加样本来提升模型的检测精度。添加样本时一定要注意,样本标注的准确性,样本的丰…...
中国在 AI 上超越美国,需要另辟蹊径
在过去的几年里,以大型语言模型(LLM)为核心的人工智能浪潮席卷全球。美国凭借其雄厚的科研基础、顶尖的技术公司以及掌握着关键硬件资源,牢牢占据了这一领域的领先地位。与此同时,中国在AI领域的进步虽然迅速ÿ…...
【实习经历Two:参与开源项目,学习并应用Git】
前端参与开源项目中使用过的git 1.参与开源项目(必备技能——git) 参与开源项目首先需要进入自己想参加的项目页面 点击右边的Fork即可复制到自己的仓库 像个人开发时常用的add、commit和push等命令就不过多介绍了,在这里主要是想记录一下自己作为从未…...
AD绘图基本操作
一、基本操作 注意:快捷键都要在英文模式下才能生效 1、移动 按住鼠标右键移动 2、切换桌面栅格距离 G 3、英寸和毫米 尺寸切换 Q 4、元件在3D模式下的移动 3D视角鼠标左键只起到选择元器件并移动之的功能, 单纯鼠标右键只能平移桌面 shift鼠…...
6k ± 1 规则
6k 1 规则 是基于对质数分布规律的观察和数学证明得出的。它指出,除了 2 和 3 之外,所有质数都可以表示为 6k 1 的形式,其中 k 是正整数。以下是详细的证明过程: 1. 质数的基本性质 质数是指大于 1 的自然数,且只能…...
AcWing 5960:输出前k大的数 ← 小根堆
【题目来源】 https://www.acwing.com/problem/content/5963/ 【题目描述】 给定一个长度为 n 的数组 a1,a2,…,an,统计前 k 大的数并且把这 k 个数从大到小输出。 【输入格式】 第一行包含整数 n。 第二行包含 n 个整数 a1,a2,…,an。 第三行包含整数 k。…...
V2X验证
1. 标准和规范验证 欧洲对 DSRC 和 V2X 系统有一系列的标准和规范,主要由 ETSI (European Telecommunications Standards Institute) 和 IEEE 等组织制定。验证通常包括以下标准和规范: ETSI EN 302 571:这是DSRC在欧洲的主要标准,规定了DSRC系统的技术要求和操作条件。ET…...
创建表空间和表
创建表 1.业务背景 在城市的住宅小区和商业区域中,需要对业主的用水情况及费用缴纳进行有效管理。业主类型涵盖普通居民、商业用户等不同类别(业主类型表),每种类型对应不同的水价标准(价格表)。区域表记…...
dfs(十二)21. 合并两个有序链表 递归解决
21. 合并两个有序链表 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1: 输入:l1 [1,2,4], l2 [1,3,4] 输出:[1,1,2,3,4,4]示例 2: 输入:l1 [], l2 [] …...
51单片机指令系统入门
目录 基本概念讲解 一、机器指令 二、汇编指令 (一)汇编指令的一般格式 (二)按字节数分类的指令 三、高级指令 总结 基本概念讲解 指令是计算机(或单片机)中 CPU 能够识别并执行的基本操作命令…...
安全无事故连续天数计算,python 时间工具的高效利用
安全天数计算,数据系统时间直取,安全标准高效便捷好用。 笔记模板由python脚本于2025-03-17 23:50:52创建,本篇笔记适合对python时间工具有研究欲的coder翻阅。 【学习的细节是欢悦的历程】 博客的核心价值:在于输出思考与经验&am…...
如何玩DeepSeek!15分钟快速创建GIS动态数据可视化仪表盘
DeepSeek最近火遍全球,大家用的都用的不亦乐乎。国外呢?当然也是,最近一上YouTube、X等都是deepseek的推送。 今天介绍一下,我在YouTube上看到的GIS行业与DeepSeek结合的一个案例: 快速轻松构建交互式地图仪表盘&…...
课上测试:MIRACL共享库使用测试
MIRACL(MultiprecisionIntegerandRationalArithmeticC/cLibrary)是著名的密码算法库,设法去官网下载安装MIRACL,提交安装过程截图或过程文本(3分). 去github官网下载.zip文件 使用如下命令进行解压 unzip -j -aa -L MIRACL-mast…...
网络编程知识预备阶段
1. OSI七层模型 OSI(Open System Interconnect)七层模型是一种将计算机网络通信协议划分为七个不同层次的标准化框架。每一层都负责不同的功能,从物理连接到应用程序的处理。这种模型有助于不同的系统之间进行通信时,更好地理解和…...
Echo服务详解与实现
各类资料学习下载合集 https://pan.quark.cn/s/8c91ccb5a474 在网络编程中,Echo服务是一个非常基础且重要的服务,它的功能是接收客户端发送的数据,并将相同的数据返回给客户端。本文将详细介绍如何使用Python实现一个简单的Echo服务,并提供完整的代码实例及运行结…...
STM32微控制器_03_GPIO原理与应用
核心内容 STM32 GPIO基本原理(熟悉)GPIO输出功能HAL库编程实现的应用(重点)GPIO输入功能HAL库编程实现的应用(重点) 一.STM32 GPIO基本原理 1.GPIO简介 STM32的GPIO相当于STM32的四肢,一个S…...
零拷贝分析
kafka 零拷贝 请求 - 网口 - socket - 用户态 - 内核缓存区 - 内核态(磁盘信息) 磁盘 - 内核缓存区 - 用户缓存区 - 网络缓存区 零拷贝(Zero-Copy) 是一种高效的数据传输技术,旨在减少数据在内存中的拷贝次数&#x…...
爬虫逆向:详细讲述Android底层原理及机制
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Android系统架构1.1 Linux内核层1.2 硬件抽象层(HAL)1.3 系统运行库层1.4 应用框架层1.5 应用层二、Android启动过程三、进程与线程管理四、内存管理机制五、Binder机制六、安全机制七、电源管理机制八、Android …...
电容器基础观念
Take-away: 电容器容值,和「导体的几何形状」,「周围的介电材料」相关。电力线起于正电荷,终止于负电荷。金属互相越靠近,电容越大。Maxwell电容矩阵有负号,SPICE电容矩阵没有负号。Maxwell电容矩阵、SPICE电容矩阵可…...
Python 视频爬取教程
文章目录 前言基本原理环境准备Python安装选择Python开发环境安装必要库 示例 1:爬取简单直链视频示例 2:爬取基于 HTML5 的视频(以某简单视频网站为例) 前言 以下是一个较为完整的 Python 视频爬取教程,包含基本原理…...
