嵌入式开发板模拟器:QEMU

前两天看微信公众号时发现了一个嵌入式模拟器,感觉很不错,自己动手安装了一个,折腾了几天,下载一直是个问题,特此记录如下

模拟器大家应该都听说过,有的小伙伴打游戏也会安装模拟器,今天我们介绍的主角QMEU就是一个可以用在嵌入式的模拟器,如果你想学习嵌入式,但身边没有开发板,这时候你可以尝试使用它来模拟Linux内核的启动,当然它还可以模拟ARM、MIPS等各种CPU架构,本文主要介绍模拟ARM的启动流程

(一)环境介绍

        虚拟机:VMware

        Ubuntu 16.04LTS

(二)安装QEMU

我们常用的VMware和virtualBox只能在X86架构上,虚拟一台X86计算机,但是QEMU能用在X86架构下虚拟出ARM计算机。QEMU时一个支持跨平台的虚拟机,有两种模式:user mode和system mode,在system mode下能够模拟出整个计算机,可以在qemu上运行 操作系统,在user mode下,可以运行和当前平台指令集不同的可执行程序。例如可以用qemu在x86上运行ARM的可执行程序,但是两个平台必须是同一种操作系统,比如Linux。

由于本文介绍ARM版本,我们可以在Ubuntu里使用sudo apt install qemu-system-arm命令去安装,但是不太推荐此方法,Ubuntu里安装源更新比较慢,安装版本不确定,另外就是从官网(https://www.qemu.org/)下载源码包来安装,如果想了解更多,可以从阅读官网上相关信息。

(1)从官网下载好安装包,或者用我下载好的:qemu

wget https://download.qemu.org/qemu-5.1.0.tar.xz

(2)执行下面的命令

$: tar -xvJf qemu-5.0.1.tar.xz 
$: cd qemu-5.0.1
$: ./configure
$: make & make install //如果报错要安装两个文件:apt-get install libglib2.0-devapt-get install libpixman-1-dev

通过上面的安装了32位(qemu-system-arm)和64位(qemu-system-aarch64)的模拟器,使用help命令查看支持的开发板,这里面有很多我们的开发版选项,本文以vexpress-a9 (ARM Versatile Express for Cortex-A9) 为例进行讲解。

(三)编译操作系统

 (1)编译u-boot

      下载u-boot代码:


git clone https://gitlab.denx.de/u-boot/u-boot.git
//注意这个有时候会比较慢,找个合适的时间下载(比如早上),或者镜像上下载

下载完成后可以在u-boot的configs目录下查看配置文件,我们选择的vexpress-a9 配置文件是vexpress_ca9x4_defconfig,

make  vexpress_ca9x4_defconfig
make CROSS_COMPILE=arm-linux-gnueabihf- all//make的时候可能出错,按照出错提示百度相关错误,可能由于没有相关命令支持,例如我安装时提示flex找不到,执行apt-get install flex在make就成功了
//需要交叉编译工具的可以在这里下载http://releases.linaro.org/components/toolchain/binaries/
注意:如果指定交叉编译器的路径一定要使用绝对路径

 

(2)制作文件系统

以前都是使用busybox编译,然后手动创建跟文件目录,但是现在我们使用bulidroot可以很轻松容易的构建跟文件系统(这里感谢下文链接的作者提供了这么方便的工具)

buildroot下载

git clone git://git.buildroot.net/buildroot

 

上面下载的代码并不是真正下载跟文件系统,真正下载跟文件系统是在我们配置好后,编译时下载的。

  执行make menuconfig来配置选项:

然后在Target opions选择相应的目标平台,我们这里点进去选择arm(little-endian)即ARM架构小端模式

build options选项我这里不修改保持默认,有需要的可以自行修改

编译工具链toolchain选择外部,找到自己的编译工具链位置,具体参考我的配置情况

上面的配置要注意内核头文件和编译工具链版本一样,不知道的可以在相应选项上按h查看帮助信息

选择对应的控制台信息:

为了减少跟文件系统镜像,这里在filesystem images里面选择如下,意思是使压缩文件系统(lz4),内核启动时解析文件系统。

其他配置先保持默认,有需要我们再修改

执行make savedefconfig命令,就会生成新的 defconfig 文件,然后执行make命令(执行make时会连接网络下载相关资源,注意网络畅通)

(3)编译kernel

  代码下载:

git clone https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git

  不推荐使用上面的方法,下载太慢了,可以在网上直接搜相关镜像下载,这里我使用正点原子提供的kernel作为演示,使用imx的配置文件imx_v7_defconfig

然后把上面buildroot编译的文件系统拷贝过来

 cp /opt/buildroot/output/images/rootfs.cpio .make ARCH=arm  vexpress_defconfigmake ARCH=arm  menuconfig

make ARCH=arm CROSS_COMPILE=/交叉编译器路径/bin/arm-linux-gnueabihf-  -j8

注意:上面一定要指定架构为arm架构

(4)系统启动

下面我们模仿sd卡启动过程

制作sd卡镜像:

dd if=/dev/zero of=sd.img bs=4096 count=4096
mkfs.vfat sd.img

把编译好的 kernel zImage 和 dtb 文件拷贝到 sd.img 中

mount sd.img /mnt/ -o loop,rw
cp arch/arm/boot/zImage /mnt/
cp arch/arm/boot/dts/vexpress-v2p-ca9.dtb /mnt/
umount /mnt

启动qemu

qemu-system-arm -M vexpress-a9 -m 512M -kernel ../u-boot/u-boot -nographic  -sd sd.img

可以看到uboot启动了:

但是没有找到内核,我们还需要下面的操作

查看内核执行地址相对内存的偏移地址:0x8000

在 u-boot 命令行中输入bdinfo命令,可以查到这块开发板内存的起始地址:

//读取内核文件到开发板内存中
fatload mmc 0:0 0x62008000 zImage
fatload mmc 0:0 0x64008000 vexpress-v2p-ca9.dtb//启动内核
bootz 0x62008000 - 0x64008000

(四) 总结

  通过上面的操作我们完成了模拟内核启动的流程,有几个问题也折腾了好久说一下注意的几点:

(1)编译uboot、kernel时注意架构的选择

(2)在内核启动不成功,可能是sd.img没有制作成功

  当然qemu并不能完全替代开发板,更多的功能可以自己发掘哈哈~

 

参考文章:Linux利器:QEMU!用它模拟开发板能替代真开发板?

                  QEMU编译安装

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

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

相关文章

gcc: weak_alias如何使用

本文主要说明weak和alias是什么和如何使用它 __attribute__是用来说明函数的属性,weak和alias分别是两个属性。 (一)强符号和弱符号: 强符号:已经初始化的全局变量和未被weak修饰的函数弱符号:未初始化的全…

静态Include和动态Include测试并总结

主要代码 hjzgg.css .center-div{width:auto;margin-left: 40%;margin-right: 40%;display: block;position: absolute;top:0px;left:0px; }.text-div{margin-top: 80px; }.hjzgg-div{color:transparent;font-size:20px;font-weight: bold;letter-spacing:2px;-webkit-animatio…

ueditor的配置和使用

ueditor下载好之后直接复制到项目的WebContent目录下,并将ueditor\jsp\lib下的jar包复制或者剪切到项目的lib目录下。先看一下效果,如下: 1.文件的上传 首先在ueditor/jsp目录下找到config.json文件,就拿Image上传来说吧。 "…

windows上搭建NFS服务器

在进行嵌入式开发的时候,我们常用的做法是搭建NFS服务器,然后使把文件系统、调试程序放在NFS服务器上,这样可以方便调试,以前都是在linux里面开启NFS服务器,今天来说下window里的nfs服务器–haneWin 一、软件安装和使…

Hibernate注解

前言: 最近正在学习Hibernate通过注解(annotation)来管理映射关系,以前都是通过XML映射文件。下面拿个小例子说一下。 数据库物理模型: 数据库的描述: 一篇博客随笔可以分到不同的类中,一个类中…

zyUpload+struct2完成文件上传

前言: 最近在写自己的博客网站,算是强化一下自己对s2sh框架的理解。期间遇到了很多问题,这些问题在写之前都考虑过,感觉也就是那样吧。但正真遇到了,也挺让人难受的。就利用zyUpload这个js插件实现文件的上传&#xff…

java发送内嵌图片邮件

前言: 博客系统中需要邮件服务的功能,以前写过类似的功能,不过功能太简单了,仅仅是发送文本内容,现在尝试一下发送内嵌图片邮件! 准备工作: 请参考:http://www.cnblogs.com/hujunzhe…

SD卡移植FAT32文件系统无MBR

问题:在研究SD卡和FAT32文件系统的时候,发现SD卡有的有MBR,有的没有MBR,这个为什么呢? 分析:MBR是主引导记录,是在给磁盘分区的时候建立的,我们的SD卡没有这个可能就是没有进行过分区…

FAT32文件系统介绍

FAT32文件系统(一)为什么要有文件系统(二)FAT32文件系统组成(三)分步介绍各部分(1) 首先介绍一下MBR(2)DBR介绍(3)FAT表介绍(4) 数据区(一)为什么要有文件系统 文件系统是操作系统用…

java中动态代理实现机制

前言: 代理模式是常用的java设计模式,它的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。代理类与委托类之间通常会存在关联关系,一个代理类…

libiconv库简单裁剪支持CP437编码

有许多人在做项目的时候都会遇到字符编码的不一致导致的乱码问题,那如何去解决呢?在Linux系统上可以通过iconv函数族来进行编码转换,但有时候我们并不需要全部的字符集,因为可能会占用比较大的空间,本文主要支持CP437编…

简单java在线测评程序

简单java程序在线测评程序 一.前言 大家过年好!今年的第一篇博客啊!家里没有网,到处蹭无线!日子过得真纠结!因为毕设的需求,简单写了一个java程序在线测评程序,当然也可以在本地测试…

简单文本编辑器

一、前言 聚天地之灵气,集日月之精华!一个简单的java文本编辑器由此而生。毕设所需,很是无奈! 二、界面预览 三、实现思路 1.字体选择器的实现 (1).字体类 class MyFont{private Font font;private Color color;public Font getFo…

u-boot新增命令后出现data abort

(一)问题描述 u-boot下新增了一条update的命令,直接输入update没有报错,但是输入up按TAB键补全时发现出现data abort,而且输入不支持的命令也会有data abort (二)解决方法 最开始我包含的头…

core文件如何分析

目录(一)什么是coredump(二)coredump产生的条件(1)coredump产生主要原因:(2)如何生成coredump(三)gdb使用(四)实例调试coredump文件(五)总结(一)什么是coredu…

SpringMVC+FreeMarker

前言: 最近在学习SpringMVC,模板引擎用的是FreeMarker,之前没有接触过。利用SpringMVC开发其实还有许多的步骤,比如控制层,服务层,持久化层,实体等等,先弄了一个小demo来总结一下Spr…

SpringMVC那点事

一、SpringMVC返回json数据的三种方式 1、第一种方式是spring2时代的产物&#xff0c;也就是每个json视图controller配置一个Jsoniew。 如&#xff1a;<bean id"defaultJsonView" class"org.springframework.web.servlet.view.json.MappingJacksonJsonView&q…

(一)最邻近插值python实现

这里写目录标题&#xff08;一&#xff09;原始图像&#xff08;二&#xff09;最邻近插值实现&#xff08;三&#xff09;python实现1. 安装库2. python程序编写3. 效果4. 工程文件&#xff08;一&#xff09;原始图像 &#xff08;二&#xff09;最邻近插值实现 一般情况下我…

(二)双线性插值python实现

这里写目录标题&#xff08;一&#xff09;原始图像&#xff08;二&#xff09;双线性插值原理&#xff08;三&#xff09;python实现1. 安装库2. python程序编写3. 效果4. 工程文件&#xff08;一&#xff09;原始图像 &#xff08;二&#xff09;双线性插值原理 一般情况下我…

(三)图像转灰度图Python实现

这里写目录标题&#xff08;一&#xff09;原始图像&#xff08;二&#xff09;转换原理&#xff08;三&#xff09;python实现1. 安装库2. python程序编写3. 效果4. 工程文件&#xff08;一&#xff09;原始图像 &#xff08;二&#xff09;转换原理 &#xff08;三&#xff…