热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Qemu搭建ARMvexpress开发环境(一)

Qemu搭建ARMvexpress开发环境(一)标签(空格分隔):QemuARMLinux嵌入式开发离不开硬件设备比如:开发

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

标签(空格分隔): Qemu ARM Linux


嵌入式开发离不开硬件设备比如:开发板、外设等,但是如果只是想学习研究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&#43;0x10/0x14)
[<80012e80>] (show_stack) from [<802478f8>] (dump_stack&#43;0x84/0x98)
[<802478f8>] (dump_stack) from [<800a7d7c>] (panic&#43;0x9c/0x1f4)
[<800a7d7c>] (panic) from [<806302d4>] (mount_block_root&#43;0x1c8/0x268)
[<806302d4>] (mount_block_root) from [<80630498>] (mount_root&#43;0x124/0x12c)
[<80630498>] (mount_root) from [<806305f0>] (prepare_namespace&#43;0x150/0x198)
[<806305f0>] (prepare_namespace) from [<8062fedc>] (kernel_init_freeable&#43;0x250/0x260)
[<8062fedc>] (kernel_init_freeable) from [<804a99f0>] (kernel_init&#43;0x8/0xe8)
[<804a99f0>] (kernel_init) from [<8000f490>] (ret_from_fork&#43;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 &#61; arm
CROSS_COMPILE &#61; arm-linux-gnueabi-

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

# make menuconfig
Settings --->Build Options --->[ ] Build static binary (no shared libs)

编译并安装&#xff1a;

# make
# make install

5.4 制作简易根文件系统

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

1) 安装busybox

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

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

也可以在指定busybox的安装目录直接安装&#xff1a;

# make CONFIG_PREFIX&#61;/.../rootfs/ install

2) 安装glibc库

在根文件系统中添加加载器和动态库&#xff1a;

# 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

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

5.5 制作SD卡文件系统镜像

1) 生成一个空的SD卡镜像&#xff1a;

# dd if&#61;/dev/zero of&#61;rootfs.ext3 bs&#61;1M count&#61;32
32&#43;0 records in
32&#43;0 records out
33554432 bytes (34 MB, 32 MiB) copied, 0.0236764 s, 1.4 GB/s

2) 将SD卡格式化为exts文件系统&#xff1a;

# 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, 24577Allocating group tables: done
Writing inode tables: done
Creating journal (4096 blocks): done
Writing superblocks and filesystem accounting information: done

3) 将rootfs烧写到SD卡&#xff1a;

# sudo mount -t ext3 rootfs.ext3 /mnt -o loop
# sudo cp -rf rootfs/* /mnt/
# sudo umount /mnt

5.6 验证

1) Qemu启动命令&#xff1a;

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&#61;/dev/mmcblk0 rw console&#61;ttyAMA0" -sd rootfs.ext3

2) 启动脚本&#xff1a;

# 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&#61;/dev/mmcblk0 rw console&#61;ttyAMA0" \-sd rootfs.ext3

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

3) 图形化启动内核&#xff1a;

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&#61;/dev/mmcblk0 rw console&#61;tty0" -sd rootfs.ext3

4) 启动日志&#xff1a;

rtc-pl031 10017000.rtc: setting system clock to 2018-09-24 13:22:14 UTC (1537795334)
ALSA device list:#0: ARM AC&#39;97 Interface PL041 rev0 at 0x10004000, irq 33
input: ImExPS/2 Generic Explorer Mouse as /devices/platform/smb/smb:motherboard/smb:motherboard:iofpga&#64;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 with ordered data mode. Opts: (null)
VFS: Mounted root (ext3 filesystem) on device 179:0.
Freeing unused kernel memory: 284K
random: nonblocking pool is initialized
can&#39;t run &#39;/etc/init.d/rcS&#39;: No such file or directoryPlease press Enter to activate this console.
/ #
/ #
/ # uname -a
Linux (none) 4.4.157 #1 SMP Sun Sep 23 21:11:22 CST 2018 armv7l GNU/Linux

至此&#xff0c;Qemu启动Linux内核并挂载跟文件系统已经启动成功&#xff0c;通过串口终端可以正常和系统进行简单功能的交互。
打印中提示的不能运行/etc/init.d/rcS问题&#xff0c;只需要添加/etc/init.d/rcS文件即可&#xff0c;文件内容可以是提示语句。

# cat /etc/init.d/rcS
Hello Qemu Linux!

5.7 关闭Qemu环境

Qemu环境搭建好之后&#xff0c;发现无法通过shutdown等工具关闭&#xff0c;因为Qemu也是一个进程&#xff0c;可以通过杀掉Qemu进程的方法关闭Qemu模拟环境。

# ps -a
# kill xxx

本文讲述了Qemu环境启动Linux内核&#xff0c;并挂载SD卡中的根文件系统的一些操作步骤。如果需要在Qemu环境下以ARM开发板的正常启动流程来加载Linux内核并挂载根文件系统&#xff0c;可以参考下一篇文章《Qemu搭建ARM vexpress开发环境(二)----通过u-boot启动Linux内核》。

转:https://www.cnblogs.com/microxiami/p/9746979.html



推荐阅读
  • Linux CentOS 7 安装PostgreSQL 9.5.17 (源码编译)
    近日需要将PostgreSQL数据库从Windows中迁移到Linux中,LinuxCentOS7安装PostgreSQL9.5.17安装过程特此记录。安装环境&#x ... [详细]
  • 在 CentOS 6.4 上安装 QT5 并启动 Qt Creator 时,可能会遇到缺少 GLIBCXX_3.4.15 的问题。这是由于系统中的 libstdc++.so.6 版本过低。本文将详细介绍如何通过更新 GCC 版本来解决这一问题。 ... [详细]
  • 在 Ubuntu 中遇到 Samba 服务器故障时,尝试卸载并重新安装 Samba 发现配置文件未重新生成。本文介绍了解决该问题的方法。 ... [详细]
  • centos 7.0 lnmp成功安装过程(很乱)
    下载nginx[rootlocalhostsrc]#wgethttp:nginx.orgdownloadnginx-1.7.9.tar.gz--2015-01-2412:55:2 ... [详细]
  • 本文详细介绍如何在忘记MySQL服务器密码的情况下进行密码重置,包括具体的步骤和注意事项。 ... [详细]
  • 兆芯X86 CPU架构的演进与现状(国产CPU系列)
    本文详细介绍了兆芯X86 CPU架构的发展历程,从公司成立背景到关键技术授权,再到具体芯片架构的演进,全面解析了兆芯在国产CPU领域的贡献与挑战。 ... [详细]
  • 2020年9月15日,Oracle正式发布了最新的JDK 15版本。本次更新带来了许多新特性,包括隐藏类、EdDSA签名算法、模式匹配、记录类、封闭类和文本块等。 ... [详细]
  • 高端存储技术演进与趋势
    本文探讨了高端存储技术的发展趋势,包括松耦合架构、虚拟化、高性能、高安全性和智能化等方面。同时,分析了全闪存阵列和中端存储集群对高端存储市场的冲击,以及高端存储在不同应用场景中的发展趋势。 ... [详细]
  • 本文详细介绍了如何在 Linux 系统上安装 JDK 1.8、MySQL 和 Redis,并提供了相应的环境配置和验证步骤。 ... [详细]
  • 本文详细介绍了在 Ubuntu 系统上搭建 Hadoop 集群时遇到的 SSH 密钥认证问题及其解决方案。通过本文,读者可以了解如何在多台虚拟机之间实现无密码 SSH 登录,从而顺利启动 Hadoop 集群。 ... [详细]
  • Python 数据可视化实战指南
    本文详细介绍如何使用 Python 进行数据可视化,涵盖从环境搭建到具体实例的全过程。 ... [详细]
  • MicrosoftDeploymentToolkit2010部署培训实验手册V1.0目录实验环境说明3实验环境虚拟机使用信息3注意:4实验手册正文说 ... [详细]
  • 本文介绍了Java编程语言的基础知识,包括其历史背景、主要特性以及如何安装和配置JDK。此外,还详细讲解了如何编写和运行第一个Java程序,并简要介绍了Eclipse集成开发环境的安装和使用。 ... [详细]
  • 网站访问全流程解析
    本文详细介绍了从用户在浏览器中输入一个域名(如www.yy.com)到页面完全展示的整个过程,包括DNS解析、TCP连接、请求响应等多个步骤。 ... [详细]
  • Linux系统中默认安装目录有哪些?Tomcat在Linux下的默认安装路径是什么?
    在Linux系统中,默认安装目录通常包括 `/usr`, `/opt`, 和 `/var` 等。对于Tomcat而言,在Linux下的默认安装路径通常是 `/opt/tomcat` 或者 `/usr/local/tomcat`。具体路径可能会因不同的发行版和配置而有所差异。例如,在Ubuntu Server中,Tomcat的默认安装路径通常是 `/opt/tomcat`。这些目录的选择旨在确保系统的整洁性和可维护性。 ... [详细]
author-avatar
davidwzw2009413
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有