Qemu搭建ARM vexpress开发环境(一)

2020-02-15来源: eefocus关键字:Qemu  ARM  vexpress  开发环境

嵌入式开发离不开硬件设备比如:开发板、外设等,但是如果只是想学习研究Linux内核,想学习Linux内核的架构,工作模式,需要修改一些代码,重新编译并烧写到开发板中进行验证,这样未必有些复杂。然而Qemu的使用可以避免频繁在开发板上烧写版本,如果进行与外设无关,仅仅是内核方面的调试,Qemu模拟ARM开发环境完全可以完美地胜任。


下面简单介绍下我的Qemu开发环境搭建过程:


1. 环境

由于在开发过程中也需要Windows系统下的一些工具,于是放弃了以前搭建的双系统环境而采用在PC的Windows10系统下通过VirtualBox虚拟机安装Xubuntu系统进行开发,避免了双系统开发中需要不断重启切换PC系统的问题。Xubuntu系统和Ubuntu系统大同小异,只是桌面封装更加简洁。


1.1 所使用环境

PC系统:Windows10

虚拟机:VirtualBox-5.18

虚拟机系统:Xubuntu

模拟的开发板:vexpress


1.2 搭建环境时使用的工具

Qemu-2.7

linux-4.4.157(Linux Kernel)

u-boot-2017.05

busybox-1.29.3

arm-linux-gnueabi-


2. 安装交叉编译工具

# sudo apt install gcc-arm-linux-gnueabi

3. 安装Qemu工具

有两种方法可以在Linux环境下安装Qemu工具,第一种直接使用XUbuntu系统的apt工具安装,但是这种方法安装的Qemu系统版本不是最新的,如果需要安装最新版本的Qemu工具,就需要通过Git工具下载源码,切换到最新分支再去编译安装了。


3.1 快速安装Qemu:

# sudo apt install qemu

3.2 下载Qemu源码编译安装

从Git服务器下载Qemu代码:


# git clone git://git.qemu-project.org/qemu.git

编译并安装Qemu:


# ./configure --target-list=arm-softmmu --audio-drv-list=

# make

# make install

3.3 查看Qemu版本

# qemu-system-arm --version

QEMU emulator version 2.7.1 (v2.7.1-dirty), Copyright (c) 2003-2016 Fabrice Bellard and the QEMU Project developers

3.4 查看Qemu支持的开发板

通过下面的命令操作可以看到当前版本的Qemu工具支持的开发板列表:


# qemu-system-arm -M help

3.5 运行Qemu

该操作目前还不能运行,因为还没有编译内核,如果手边有编译好的别的版本的zImage文件,可以通过下面命令尝试运行看下效果。


# qemu-system-arm -M vexpress-a9 -m 512M -kernel ./zImage -dtb ./vexpress-v2p-ca9.dtb -nographic -append "console=ttyAMA0"

    -M          指定开发板

    -m          指定内存大小

    -kernel     指定内核文件

    -dtb        指定dtb文件

    -nographic  指定不需要图形界面

    -append     指定扩展显示界面,串口或者LCD

4. 配置并编译Linux内核

4.1 下载Linux内核

通过众所周知的内核下载网站www.kernel.org下载需要的内核版本,这里我取得是相对来说最新的长期支持的内核版本linux-4.4.157。


4.2 解压Linux内核

# tar -xvf linux-4.4.157.tar.xz

4.3 编译Linux内核

# make vexpress_defconfig

# make zImage -j4

# make modules -j4    // 编译驱动模块

# make dtbs

得到编译文件:


arch/arm/boot/zImage

arch/arm/boot/dts/*.dtb

4.4 Qemu启动命令

# qemu-system-arm -M vexpress-a9 -m 512M -kernel kernel/linux-4.4.157/arch/arm/boot/zImage -dtb kernel/linux-4.4.157/arch/arm/boot/dts/vexpress-v2p-ca9.dtb -nographic -append "console=ttyAMA0"

为了使用方便,可以将该命令放到shell脚本中执行:


# cat boot.sh

#! /bin/sh

qemu-system-arm

        -M vexpress-a9 

        -m 512M

        -kernel kernel/linux-4.4.157/arch/arm/boot/zImage      

        -dtb kernel/linux-4.4.157/arch/arm/boot/dts/vexpress-v2p-ca9.dtb       

        -nographic 

        -append "console=ttyAMA0"

启动日志

内核成功启动,前半部分日志省略,启动最后出错是因为没有挂载根文件系统。


input: ImExPS/2 Generic Explorer Mouse as /devices/platform/smb/smb:motherboard/smb:motherboard:iofpga@7,00000000/10007000.kmi/serio1/input/input2

VFS: Cannot open root device "(null)" or unknown-block(0,0): error -6

Please append a correct "root=" boot option; here are the available partitions:

1f00          131072 mtdblock0  (driver?)

1f01           32768 mtdblock1  (driver?)

b300           32768 mmcblk0  driver: mmcblk

Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)

CPU: 0 PID: 1 Comm: swapper/0 Not tainted 4.4.157 #1

Hardware name: ARM-Versatile Express

[<80016420>] (unwind_backtrace) from [<80012e80>] (show_stack+0x10/0x14)

[<80012e80>] (show_stack) from [<802478f8>] (dump_stack+0x84/0x98)

[<802478f8>] (dump_stack) from [<800a7d7c>] (panic+0x9c/0x1f4)

[<800a7d7c>] (panic) from [<806302d4>] (mount_block_root+0x1c8/0x268)

[<806302d4>] (mount_block_root) from [<80630498>] (mount_root+0x124/0x12c)

[<80630498>] (mount_root) from [<806305f0>] (prepare_namespace+0x150/0x198)

[<806305f0>] (prepare_namespace) from [<8062fedc>] (kernel_init_freeable+0x250/0x260)

[<8062fedc>] (kernel_init_freeable) from [<804a99f0>] (kernel_init+0x8/0xe8)

[<804a99f0>] (kernel_init) from [<8000f490>] (ret_from_fork+0x14/0x24)

---[ end Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)

5. 制作根文件系统

使用busybox制作根文件系统


5.1 下载busybox工具

从https://busybox.net/downloads/下载最新的busybox。


5.2 解压busybox

# tar -xvf busybox-1.29.3.tar.bz2

5.3 配置并编译busybox

修改Makefile:


ARCH = arm

CROSS_COMPILE = arm-linux-gnueabi-

编译选择使用glibc动态库,因为静态库可能会出现一些未知的问题


# make menuconfig

Settings  --->

    Build Options  --->

        [ ] Build static binary (no shared libs)

编译并安装:


# make

# make install

5.4 制作简易根文件系统

制作一个简易的根文件系统,该文件系统包含的功能极其简陋,仅为了验证Qemu启动Linux内核后挂载跟文件系统的过程。以后会进一步完善该文件系统。


1) 安装busybox

将busybox编译生成的_install目录下的文件全部拷贝到rootfs/目录:


# mkdir rootfs

# cp /.../busybox-1.29.3/_install/* rootfs/ -rfd

也可以在指定busybox的安装目录直接安装:


# make CONFIG_PREFIX=/.../rootfs/ install

2) 安装glibc库

在根文件系统中添加加载器和动态库:


# mkdir rootfs/lib

# cp /usr/arm-linux-gnueabi/lib/* rootfs/lib/ -rfp

3) 静态创建设备文件

# mkdir rootfs/dev

# cd rootfs/dev

# mknod -m 666 tty1 c 4 1

# mknod -m 666 tty2 c 4 2

# mknod -m 666 tty3 c 4 3

# mknod -m 666 tty4 c 4 4

# mknod -m 666 console c 5 1

# mknod -m 666 null c 1 3

至此,简易版根文件系统就制作完成,该根文件系统只含有最基本的功能,一些其他功能在以后的操作中会进行添加,如有兴趣可以继续参考下一篇文章《》《》


5.5 制作SD卡文件系统镜像

1) 生成一个空的SD卡镜像:

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

32+0 records in

32+0 records out

33554432 bytes (34 MB, 32 MiB) copied, 0.0236764 s, 1.4 GB/s

2) 将SD卡格式化为exts文件系统:

# mkfs.ext3 rootfs.ext3

mke2fs 1.42.13 (17-May-2015)

Discarding device blocks: done                            

Creating filesystem with 32768 1k blocks and 8192 inodes

Filesystem UUID: 51ab1063-a137-48e5-a6f4-4552dad3b898

Superblock backups stored on blocks:

    8193, 24577


Allocating group tables: done                            

Writing inode tables: done                            

Creating journal (4096 blocks): done

Writing superblocks and filesystem accounting information: done

3) 将rootfs烧写到SD卡:

# sudo mount -t ext3 rootfs.ext3 /mnt -o loop

# sudo cp -rf rootfs/* /mnt/

# sudo umount /mnt

5.6 验证

1) Qemu启动命令:

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

2) 启动脚本:

# boot.sh

#! /bin/sh

qemu-system-arm

        -M vexpress-a9 

        -m 512M

        -kernel kernel/linux-4.4.157/arch/arm/boot/zImage      

        -dtb kernel/linux-4.4.157/arch/arm/boot/dts/vexpress-v2p-ca9.dtb       

        -nographic 

        -append "root=/dev/mmcblk0 rw console=ttyAMA0"   

        -sd rootfs.ext3

以上为在串口终端启动系统,按照以下的启动命令可以使用LCD屏作为输出启动系统。


3) 图形化启动内核:

qemu-system-arm -M vexpress-a9 -m 512M -kernel kernel/linux-4.4.157/arch/arm/boot/zImage -dtb kernel/linux-4.4.157/arch/arm/boot/dts/vexpress-v2p-ca9.dtb -append "root=/dev/mmcblk0 rw console=tty0" -sd rootfs.ext3

4) 启动日志:

rtc-pl031 10017000.rtc: setting system clock to 2018-09-24 13:22:14 UTC (1537795334)

ALSA device list:

  #0: ARM AC'97 Interface PL041 rev0 at 0x10004000, irq 33

input: ImExPS/2 Generic Explorer Mouse as /devices/platform/smb/smb:motherboard/smb:motherboard:iofpga@7,00000000/10007000.kmi/serio1/input/input2

EXT4-fs (mmcblk0): mounting ext3 file system using the ext4 subsystem

EXT4-fs (mmcblk0): recovery complete

EXT4-fs (mmcblk0): mounted filesystem w

[1] [2]
关键字:Qemu  ARM  vexpress  开发环境 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic488328.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:Qemu搭建ARM vexpress开发环境(二)----通过u-boot启动Linux内核
下一篇:Exynos4412从SD卡启动的简单网络文件系统制作

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

Qemu搭建ARM vexpress开发环境(三)----NFS网络根文件系统
经过上一篇《Qemu搭建ARM vexpress开发环境(二)----通过u-boot启动Linux内核》,已经实现了通过u-boot加载Kernel启动开发板,并且挂载根文件系统,本文讲述通过NFS网络挂载根文件系统。通过NFS网络根文件系统,可以实现开发板在通过u-boot启动内核后,通过NFS网络在别的PC主机上挂载根文件系统。对于开发调试阶段的工作学习提供了很大的便利,可以直接在Linux主机上开发、编译驱动或者APP,并将目标文件拷贝到NFS服务目录中进行使用(此时文件相当于被拷贝到了开发板的根文件系统中)。也可以在主机端直接修改rootfs文件系统中别的文件,等效于在开发板上直接修改。本文来介绍NFS挂载网络根文件系统
发表于 2020-02-14
基于TQ2440和Qemu的GDB+串口调试(1)
执行quit命令,再次打开ckermit还可以连上板子,并且还可以再次通过echo使kernel再次进入等待远程gdb连接模式。三、Qemu + GDB这部分参考的是笨叔叔的《奔跑吧 Linux内核》。首先需要配置内核,确保编译出来的内核包含调试信息:Kernel hacking    ----> Compile-time checks and compiler options            ----> [*] Compile the kernel with debug info在启动Qemu的时候设置两个参数:-S: 表示Qemu
发表于 2020-02-09
qemu+chroot构建arm aarch64虚拟机
在X86环境下构建出arm虚拟机可以模拟arm环境进行开发、在arm linux的文件系统中安装相应的库文件,编译arm版本等。简单介绍下在X86环境下构建ARM虚拟机的步骤。1、x86环境安装qemu-user-staticsudo apt-get install qemu-user-static2、准备arm linux根文件系统arm linux根文件系统可以直接下载干净的版本或者从运行的arm单板上进行备份获取。arm单板上备份根文件系统命令:sudo tar -cvpzf rootfs.tgz --exclude=/proc --exclude=/mnt --exclude=/sys --exclude
发表于 2020-02-06
基于嵌入式云技术的油井液位远程测试系统
。 其在嵌入式Linux系统的支撑下,通过移植KVM、QEMU虚拟机,实现了测试设备的虚拟化,测控节点和测控服务器之间采用Modbus通信协议。系统实现了实时测试和远程实时测控的功能,能有效地提高采油井的测试效率,节省人力物力财力,更节省了宝贵的时间。 1 系统体系结构 本文设计的嵌入式云测试系统是由云测试监控中心和现场测控两部分构成,现场测控设备由嵌入式测控节点与嵌入式云服务器构成。测控的总体结构如图1所示。 本文基于亚马逊公司的Eucalyptus(桉树)云平台实现了云测试监控中心的功能。Eucalyptus是用于完成对各种虚拟设备、虚拟机实例的全局性监控,对整个集群的计算资源、存储资源、网络资源进行动态配置。在云测试监控中心
发表于 2014-10-24
基于嵌入式云技术的油井液位远程测试系统
MIPS发布简化Android开发的架构工具
    美普思科技公司(MIPS Technologies, Inc.)宣布,可简化Android 应用开发的先进调试和开发工具已开始供货。这些免费工具可通过Android on MIPS 社区获得。MIPS 科技除了发布QEMU 开放源仿真器,还通过与Viosoft 公司合作提供用于QEMU的业界领先Arriba开发工具,使开发工作变得更加容易。MIPS 科技还强化了MIPS架构的Android NDK(Native Development Kit),采用了编译器和丰富的图形用户界面(GUI),可将整个构建过程简化为以简单的点选动作(point-and-click),进行快速的本土开发。     MIPS 科技营销副总裁Art
发表于 2010-03-08
海思ARM平台交叉编译zeroMQ
在使用海思的项目中要使用到ZeroMQ这个消息队列框架,之前在PC端使用感觉不错。所以通过要通过交叉编译,将其移植到ARM平台。移植方法,可以参考 https://blog.csdn.net/sishuihuahua/article/details/77203094  以下是我使用海思交叉编译工具的方法:一、配置编译器./configure --host=arm-himix100-linux --prefix=/opt/hisi-linux/zeromq-4.1.6/arm-zeromq  --without-libsodiumarm-himix100-linux   --host
发表于 2020-02-08
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2020 EEWORLD.com.cn, Inc. All rights reserved