Linux下qemu的安装并搭建虚拟arm环境(带helloworld测试)【超详细】

qemu的安装并搭建虚拟arm环境

    • 1、准备工作
      • 1.1 安装交叉汇编工具
      • 1.2 编译内核kernel
      • 1.3 u-boot编译
      • 1.4 制作根文件系统-busybox
    • 2、启动qemu(arm)
    • 3、helloworld测试

1、准备工作

1.1 安装交叉汇编工具

交叉编译器的作用就不需要详细解释了,因为我们是在x86平台上进行编译,而运行的平台是ARM系统,这2个平台的指令集不一样,所以需要交叉编译得到ARM系统上可以执行的程序。

sudo apt-get install gcc-arm-linux-gnueabi gcc-arm-linux-gnueabihf

验证安装结果:

dpkg -l gcc-arm-linux-gnueabi

image-20240125091802651

1.2 编译内核kernel

下载内核kernel压缩包:

wget https://mirror.bjtu.edu.cn/kernel/linux/kernel/v5.x/linux-5.10.tar.xz

使用 vexpress-a9 这款开发板。vexpress-a9 是 Arm 公司自己设计的一款 4 核 Cortex-A9 开发板,U-Boot、Linux Kernel 和 QEMU 对这款开发板都做了完整的支持。

解压:

tar -xvf linux-5.10.tar.xz

在解压后的linux-5.10目录下,生成vexpress开发板子的config文件:

cd linux-5.10
make CROSS_COMPILE=arm-linux-gnueabihf- ARCH=arm vexpress_defconfig

编译32位kernel:

make CROSS_COMPILE=arm-linux-gnueabihf- ARCH=arm

生成的内核镱像位于arch/arm/boot/zImage

设备树 arch/arm/boot/dts/vexpress-v2p-ca9.dtb

1.3 u-boot编译

注意更改当前路径

wget https://ftp.denx.de/pub/u-boot/u-boot-2020.10.tar.bz2

解压:

tar -xvf u-boot-2020.10.tar.bz

解压完后,可以看到 configs 目录下有针对这款开发板的配置文件。ca9x4表示cortexA9架构,4核心,vexpress_ca9x4_defconfig

ls configs/ | grep vexpress

image-20240125103131031

编译:

make vexpress_ca9x4_defconfig
make CROSS_COMPILE=arm-linux-gnueabihf- all

编译时可能会出现提示:Your GCC is older than 6.0 and is not supported,解决方式如下:

更改uboot的源码:/arch/arm/config.mk

# Only test once
ifeq ($(CONFIG_$(SPL_)SYS_THUMB_BUILD),y)
#archprepare: checkthumb checkgcc6
archprepare: checkthumb checkthumb:@if test "$(call cc-name)" = "gcc" -a \"$(call cc-version)" -lt "0404"; then \echo -n '*** Your GCC does not produce working '; \echo 'binaries in THUMB mode.'; \echo '*** Your board is configured for THUMB mode.'; \false; \fi
#else
#archprepare: checkgcc6
endif#checkgcc6:
#   @if test "$(call cc-name)" = "gcc" -a \
#           "$(call cc-version)" -lt "0600"; then \
#       echo '*** Your GCC is older than 6.0 and is not supported'; \
#       false; \
#   fi

最终编译生成 elf 格式的可执行文件 u-boot 和纯二进制文件u-boot.bin,其中 QEMU 可以启动的为 elf 格式的可执行文件 u-boot :

image-20240125105329439

1.4 制作根文件系统-busybox

根文件系统放在哪里?

其实依赖于每个开发板支持的存储设备,可以放到Nor Flash上,也可以放到SD卡,甚至外部磁盘上。最关键的一点是你要清楚知道开发板有什么存储设备。本次使用SD卡做为存储空间,文件格式为ext3格式。

①下载、编译和安装busybox:(注意更改当前路径)

链接:busybox - BusyBox: The Swiss Army Knife of Embedded Linux

版本:busybox-1_30_0

image-20240125150027030

解压,并进入该目录下:

tar xjvf  busybox-1_30_0.tar.bz2
cd busybox-1_30_0

因为是配置arm环境,交叉编译到arm上运行, 需要修改Makefile:

vim Makefile

修改成这样:

image-20240125150350296

编译,安装:

make menuconfig			

执行上述指令会出现如下界面,点击Settings->,再设置静态编译:

image-20240125150620414

编译:

make -j6

编译完成后检查,成功:

ls -l busybox

image-20240125150740739

安装(在busybox-1_30_0/_install目录下安装):

make install

安装完成后会形成_install目录:

image-20240125150929422

②形成根目录结构:

在Ubuntu主机环境下,形成目录结构,里面存放的文件和目录与单板上运行所需要的目录结构完全一样,然后再打包成镜像(在开发板看来就是SD卡),这个临时的目录结构称为根目录。

首先创建rootfs目录(根目录),根文件系统内的文件全部放到这里:

mkdir -p rootfs/{dev,etc/init.d,lib}

把busybox中的文件复制到rootfs根目录下,主要是一些基本的命令:

sudo cp busybox-1_30_0/_install/* -r rootfs/

把交叉编译工具链中的库文件复制到rootfs根目录的lib文件夹下:

sudo cp -P /usr/arm-linux-gnueabi/lib/* rootfs/lib/

创建4个tty端终设备:

sudo mknod rootfs/dev/tty1 c 4 1
sudo mknod rootfs/dev/tty2 c 4 2
sudo mknod rootfs/dev/tty3 c 4 3
sudo mknod rootfs/dev/tty4 c 4 4

③制作根文件系统镜像:

根文件系统镜像就相当于一个硬盘,就是把上面rootfs根目录中的所有文件复制到这个硬盘中。

生成512M大小的镜像:

dd if=/dev/zero of=a9rootfs.ext3 bs=1M count=32

格式化成ext3文件系统:

mkfs.ext3 a9rootfs.ext3

挂载,将文件拷贝到镜像中:

sudo mkdir tmpfs
sudo mount -t ext3 a9rootfs.ext3 tmpfs/ -o loop
sudo cp -r rootfs/*  tmpfs/
sudo umount tmpfs

2、启动qemu(arm)

目录结构:

image-20240125151346463

启动qemu(arm环境):

qemu-system-arm -M vexpress-a9 -m 512M -kernel linux-5.10/arch/arm/boot/zImage -dtb linux-5.10/arch/arm/boot/dts/vexpress-v2p-ca9.dtb -nographic -append "root=/dev/mmcblk0  console=ttyAMA0" -sd a9rootfs.ext3

启动完成:

image-20240125151628814

退出qemu:Ctrl+A 松开后按 X 退出qemu。

关于qemu启动ARM虚拟机运行指令解析:

qemu-system-arm 											#qemu主要配置
-M vexpress-a9 												#模拟vexpress-a9单板
-m 512M 													#内存配置
-kernel linux-5.10/arch/arm/boot/zImage 					#内核路径
-dtb linux-5.10/arch/arm/boot/dts/vexpress-v2p-ca9.dtb 		#设备树路径
-nographic 													#不使用图形化界面,只使用串口
-append "root=/dev/mmcblk0  console=ttyAMA0" 				#内核启动参数(vexpress单板运行)
-sd a9rootfs.ext3											#SD卡印像

3、helloworld测试

在Ubuntu任意一个目录,编写HelloWorld可执行程序hello.c:

vim hello.c
#include <stdio.h> 
int main() 
{     printf("HelloWorld! \n");return 0; 
}

image-20240125152110008

交叉编译hello.c,得到arm的可执行程序hello:

arm-linux-gnueabi-gcc hello.c -g -o hello.exe  #带上-g选项编译debug版本

通过file指令,可查看hello.exe程序:

file hello.exe

image-20240125152246595

把hello可执行程序复制到磁盘镜像disk.img中:

挂载(路径/home/kevin/kernel510):

sudo mount -o loop ./a9rootfs.ext3 tmpfs/ 

复制文件(注意路径):

sudo cp /home/kevin/hello.exe /home/kevin/kernel510/tmpfs/

image-20240125153412622

卸载:

sudo umount tmpfs

再次启动虚拟机:

qemu-system-arm -M vexpress-a9 -m 512M -kernel linux-5.10/arch/arm/boot/zImage -dtb linux-5.10/arch/arm/boot/dts/vexpress-v2p-ca9.dtb -nographic -append "root=/dev/mmcblk0  console=ttyAMA0" -sd a9rootfs.ext3 -S -gdb tcp::8080

执行hello.exe程序,即可看到输出结果:

image-20240125153706423

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

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

相关文章

MySQL原理(四)索引(3)索引失效与索引区分度

一、索引失效&#xff1a; 首先未使用索引列作为查询条件索引是肯定会生效的&#xff0c;还有其他的情况&#xff0c;索引列做为了查询条件也失效了&#xff1a; ALTER TABLE staffs ADD INDEX idx_staffs_nameAgePos(NAME, age, pos); 1、select 语句、order by语句&#xf…

来了来了,5000个红包封面免费领

今年公众号很慷慨&#xff0c;给长期运营的作者免费发放了6w个红包封面&#xff0c;感谢公众号平台。 往年还是自己花钱找别人设计&#xff0c;平台审核通过后才能正常发放给大家&#xff0c;自从AI绘画工具问世后&#xff0c;自己也能设计了。 下面的两个封面都是我用AI工具St…

2024.1.30报错记录

今天想调通一套github上的U-net代码&#xff0c;把报错记录一下 第一章 ModuleNotFoundError: No module named skimage 没有这个模块 pip install scikit-image 第二章 TypeError: (‘Keyword argument not understood:‘, ‘input‘) TypeError: (‘Keyword argument …

从 20 多套 MySQL 到 1 套 TiDB丨骏伯网络综合运营管理平台应用实践

原文来源&#xff1a; https://tidb.net/blog/a38c72a4 本文作者&#xff1a;骏伯网络 唐帆&#xff0c;PingCAP 贺美存 骏伯网络简介 广州骏伯网络是一家以数据驱动的科技公司&#xff0c;聚焦移动互联网营销服务&#xff0c;坚持以客户为中心&#xff0c;深耕 APP、运营…

政安晨:示例演绎Python的列表

列表和你可以用它们做的事&#xff1a;包括索引、切片和对象变动 (变异-Mutation) 。 列表 在Python中&#xff0c;列表表示有序的值序列。以下是如何创建列表的示例&#xff1a; primes [2, 3, 5, 7] 我们可以将其他类型的元素放在列表中&#xff1a; planets [Mercury…

【C++】拷贝构造函数和赋值运算符重载详解

目录 拷贝构造函数 概念 特征 赋值运算符重载 运算符重载 赋值运算符重载 ​编辑前置和后置重载 ⭐拷贝构造函数 ⭐概念 拷贝构造函数&#xff1a;只有单个形参&#xff0c;该形参是对本类类型对象的引用(一般常用const修饰)&#xff0c;在用已存 在的类类型对象创建新…

【Java程序设计】【C00248】基于Springboot的摄影跟拍预定管理系统(有论文)

基于Springboot的摄影跟拍预定管理系统&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的摄影跟拍预定管理系统 本系统分为系统功能模块、管理员功能模块、摄影师功能模块以及用户功能模块。 系统功能模块&#xf…

回归预测 | Matlab实现CPO-CNN-LSTM-Attention冠豪猪优化卷积长短期记忆神经网络注意力机制多变量回归预测(SE注意力机制)

回归预测 | Matlab实现CPO-CNN-LSTM-Attention冠豪猪优化卷积长短期记忆神经网络注意力机制多变量回归预测&#xff08;SE注意力机制&#xff09; 目录 回归预测 | Matlab实现CPO-CNN-LSTM-Attention冠豪猪优化卷积长短期记忆神经网络注意力机制多变量回归预测&#xff08;SE注…

【考研408】操作系统笔记

文章目录 [toc] 计算机系统概述操作系统的基本概念操作系统的概念和特征操作系统的目标和功能&#xff08;**处理器管理、存储器管理、设备管理、文件管理、向用户提供接口、扩充机器**&#xff09; 操作系统的发展与分类操作系统的运行环境操作系统的运行机制 操作系统的体系结…

Python(SQLite)executescript用法

SQLite 数据库模块的游标对象还包含了一个 executescript() 方法&#xff0c;这不是一个标准的 API 方法&#xff0c;这意味着在其他数据库 API 模块中可能没有这个方法。但是这个方法却很实用&#xff0c;它可以执行一段 SQL 脚本。 例如&#xff0c;如下程序使用 executescr…

CVEMap:用于查询、浏览和搜索 CVE 的开源工具

CVEMap 是一个开源命令行界面 (CLI) 工具&#xff0c;可让您探索常见漏洞和暴露 (CVE)。它旨在提供一个简化且用户友好的界面来导航漏洞数据库。 尽管 CVE 对于查明和讨论安全漏洞至关重要&#xff0c;但它们的快速增长和偶尔夸大的严重性往往会导致误导性信息。 安全专家必须…

(bean配置类的注解开发)学习Spring的第十三天

bean配置类的注解开发 问题提出 用类充当配置文件 applicationcontext.xml : Configuration注解标识此类为配置类,替代原有xml文件 看原配置文件applicationcontext.xml代码 <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http:/…

EasyCVR视频融合平台如何助力执法记录仪高效使用

旭帆科技的EasyCVR平台可接入的设备除了常见的智能分析网关与摄像头以外 &#xff0c;还可通过GB28181协议接入执法记录仪&#xff0c;实现对执法过程的全称监控与录像&#xff0c;并对执法轨迹与路径进行调阅回看。那么&#xff0c;如何做到执法记录仪高效使用呢&#xff1f; …

MMDB是什么

MMDB (MaxMind DB) 是一种专为地理位置服务和其他网络相关数据设计的二进制文件格式。这种格式主要被用于存储如 IP 地址定位数据之类的信息&#xff0c;使得应用程序可以快速且高效地查询 IP 地址的地理位置、自治系统信息、网络提供商信息等。MMDB 格式由 MaxMind 公司开发&a…

react 使用react-seamless-scroll实现无缝滚动

文章目录 1. 实现无缝滚动效果2. react-seamless-scroll 无缝滚动案例介绍3. react 项目集成3.1 项目引入 cssSeamlessScroll 滚动组件3.2 完整代码3.2.1 newBet.tsx 代码3.2.2 index.module.scss 1. 实现无缝滚动效果 实现单步向下滚动点击更多展开&#xff0c;收起&#xff0…

Quartus IP学习之ISSP(In-System Sources Probes)

一、ISSP IP概要&#xff1a; ISSP&#xff1a;In-System Sources & Probes Intel FPGA IP 作用&#xff1a; 分为In-System Sources与In-System Probesn-System Sources&#xff0c;输入端&#xff0c;等价于拨码开关&#xff0c;通过输入板载FPGA上的拨码开关状态改变…

Unity DOTS中的baking(三)过滤baking的输出

Unity DOTS中的baking&#xff08;三&#xff09;过滤baking的输出 默认情况下&#xff0c;在conversation world&#xff08;baker和baking system运行的环境&#xff09;下产生的所有entities和components&#xff0c;都会作为baking环节的输出。在baking结束时&#xff0c;U…

Android学习之路(29) Gradle初探

前言: 大家回想一下自己第一次接触Gradle是什么时候&#xff1f; 相信大家也都是和我一样&#xff0c;在我们打开第一个AS项目的时候&#xff0c; 发现有很多带gradle字样的文件&#xff1a;setting.gradle, build.gradle,gradle.warpper,以及在gradle文件中各种配置&#xff…

将给定的二维数组旋转90度numpy.rot90()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 将给定的二维数组旋转90度 numpy.rot90() [太阳]选择题 以下说法中正确的是? import numpy as np a np.array([[1,1,1],[2,2,2],[3,3,3]]) print("【显示】a:\n",a) print("…

MIT 6.5830 概述

简介 同MIT6.824系列类似&#xff0c;6.4830是关于Database System的一门课程&#xff0c;官方主页链接。 从课程信息可知&#xff0c;理论课分为 21 个课时&#xff0c;3个问题集&#xff0c;4个实验&#xff0c;1个项目。课程的 ppt 可以下载&#xff0c;对应的课堂回放可以…