CentOS 7 利用qemu模拟ARM vexpress A9开发板

摘要:
据说qemu非常适合模拟手臂。我今天就试试。为CentOS7编译和安装qemu的方法之前已有记录:http://www.cnblogs.com/BinBinStory/p/7618303.html我的版本是2.10.02。编译通过解压缩内核文件下载的内核文件,进入解压缩文件夹,然后运行以下指令进行编译。生成vexpress开发板的配置文件:makeCROSS_COMPILE=arm none-linux-gnueabi-ARCH=armvexpress_Defconfig编译:makeCROSS_COMPILE=arm-linux-nux-gnuiabi-ARC=arm执行启动脚本#/Bin/bashqemu-system arm Mvexpress-a9-m512M kernel/home/walt740/kernel/linux-4.13.5/ARCH/arm/boot/zImagedtb/home/walt740/kernel/linux-4.13.5/arch/arm/boot/dts/vexpress-v2p-ca9.dtb-ographic-append“console=ttyAM0”3.根文件系统是否在这里完成/bin/bashsudorm-rfrootfssudorm-rftmpfssudorf-fa9rootfs。ext3sudmkdirrootfssudocp_install/*rootfs/-rafmkdirprootfs/{lib,proc,sys,tmp,root,var,mnt}sudocp arf/usr/local/gcc arm none-eabi/arm-ninux-gnueabi/libraootfs/sudocpetcrootfs/-arfsudormrootfs/lib/*。asudomkdir prootfs/dev/sudomknodorotfs/dev/tty1c41sudomknodorotfs/dev/tty2c42proudomknonorotfs/dev/tty3c43sudomknonorotfs/dev/tty 4c44sudomknororotfs/dev/consolec11sudomKnodrowtfs/dev/nullc13sudoddif=/dev/zerof=a9rootfs.ext3bs=1Mcount=32sudomkfs.ext3sudomkdir-ptmpfssudomount-text3a9rootfs。Ext3tmpfs/-oropsudocp errorotfs/*tmpfs/sudoumounttmpfs其中,etc下是启动配置文件,您可以在此处下载:http://files.cnblogs.com/files/pengdonglin137/etc.tar.gz4.在系统启动并运行并且完成以上所有步骤后,您可以启动qemu来模拟vexpress开发板。命令参数如下:qemu-system-arm-Mvexpress-a9-m512M-kernellinux-kernel/linux-4.13/arch/arm/boot/zImage-dtlinux-kernel/linux-413/arch/aarm/boot/dts/vexpress-v2p-ca9.dtb-ographic-append“root=/dev/mmcblk0Console=ttyAM0”-sda9rootfs。ext3从内核开始打印。

听说qemu用于仿真arm很不错,今日就来试了一把。由于刚刚开始,了解的并不多。本文仅仅记录Qemu装载Linux kernel和busybox根文件系统的过程。后续将会深入了解仿真的其他内容。

先上成果图:

CentOS 7 利用qemu模拟ARM vexpress A9开发板第1张

1. 安装QEMU

QEMU是一套由Fabrice Bellard所编写的以GPL许可证分发源码的模拟处理器,在GNU/Linux平台上使用广泛。Bochs,PearPC等与其类似,但不具备其许多特性,比如高速度及跨平台的特性,通过KQMEU这个开源的加速器,QEMU能模拟至接近真实电脑的速度。
之前已有记录CentOS 7编译安装qemu的方法:
http://www.cnblogs.com/BinBinStory/p/7618303.html
我的版本是2.10.0
CentOS 7 利用qemu模拟ARM vexpress A9开发板第2张

2. 编译内核

解压下载的kernel文件,进入解压后的文件夹,运行下面的指令编译。

生成vexpress开发板子的config文件:
make CROSS_COMPILE=arm-none-linux-gnueabi- ARCH=arm vexpress_defconfig

编译:

make CROSS_COMPILE=arm-linux-gnueabi- ARCH=arm

执行启动脚本

   #! /bin/bash                                                                                                                
    
   qemu-system-arm 
           -M vexpress-a9 
           -m 512M 
           -kernel /home/walt740/kernel/linux-4.13.5/arch/arm/boot/zImage 
           -dtb /home/walt740/kernel/linux-4.13.5/arch/arm/boot/dts/vexpress-v2p-ca9.dtb 
           -nographic 
           -append "console=ttyAMA0"

CentOS 7 利用qemu模拟ARM vexpress A9开发板第3张

3. 制作根文件系统

到这里是否大功告成了呢? 其实在上面的测试中,你会发现内核报panic,因为内核找不到根文件系统,无法启init进程。 

根文件系统要考虑两个方面:

1. 根文件系统的内容

在嵌入式领域,几乎所有的东西,都是mini版本,根文件系统也不例外。

本文制本的根文件系统 = busybox(包含基础的Linux命令)  + 运行库 + 几个字符设备

2. 根文件系统放在哪里

其实依赖于每个开发板支持的存储设备,可以放到Nor Flash上,也可以放到SD卡,甚至外部磁盘上。最关键的一点是你要清楚知道开发板有什么存储设备。

    本文直接使用SD卡做为存储空间,文件格式为ext3格式

下载、编译和安装busybox

wget http://www.busybox.net/downloads/busybox-1.27.2.tar.bz2

make defconfig

make menuconfig
make CROSS_COMPILE=arm-none-linux-gnueabi- #重要 make install

CentOS 7 利用qemu模拟ARM vexpress A9开发板第4张

安装完成后,会在busybox目录下生成_install目录,该目录下的程序就是单板运行所需要的命令。

CentOS 7 利用qemu模拟ARM vexpress A9开发板第5张

形成根目录结构

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

sudo rm -rf rootfs
sudo rm -rf tmpfs
sudo rm -f a9rootfs.ext3

sudo mkdir rootfs
sudo cp _install/*  rootfs/ -raf

mkdir -p rootfs/{lib,proc,sys,tmp,root,var,mnt}

sudo cp -arf /usr/local/gcc-arm-none-eabi/arm-none-linux-gnueabi/lib rootfs/

sudo cp etc rootfs/ -arf sudo rm rootfs/lib/*.a sudo mkdir -p rootfs/dev/ sudo mknod rootfs/dev/tty1 c 4 1 sudo mknod rootfs/dev/tty2 c 4 2pro sudo mknod rootfs/dev/tty3 c 4 3 sudo mknod rootfs/dev/tty4 c 4 4 sudo mknod rootfs/dev/console c 5 1 sudo mknod rootfs/dev/null c 1 3 sudo dd if=/dev/zero of=a9rootfs.ext3 bs=1M count=32 sudo mkfs.ext3 a9rootfs.ext3 sudo mkdir -p tmpfs sudo mount -t ext3 a9rootfs.ext3 tmpfs/ -o loop sudo cp -r rootfs/* tmpfs/ sudo umount tmpfs

其中,etc下是启动配置文件,可以的到这里下载:

4. 系统启动运行

完成上述所有步骤之后,就可以启动qemu来模拟vexpress开发板了,命令参数如下:
qemu-system-arm -M vexpress-a9 -m 512M 
-kernel linux-kernel/linux-4.13/arch/arm/boot/zImage 
-dtb linux-kernel/linux-4.13/arch/arm/boot/dts/vexpress-v2p-ca9.dtb 
-nographic -append "root=/dev/mmcblk0  console=ttyAMA0" 
-sd a9rootfs.ext3

 

CentOS 7 利用qemu模拟ARM vexpress A9开发板第6张

 

从内核启动打印。到命令行提示符出现,激动人心的时刻出现了……

如果内核报错:

[    1.965000] Failed to execute /linuxrc (error -8).  Attempting defaults...
[    1.990000] request_module: runaway loop modprobe binfmt-464c
[    2.000000] Starting init: /sbin/init exists but couldn't execute it (error -8)
[    2.020000] request_module: runaway loop modprobe binfmt-464c
[    2.030000] Starting init: /bin/sh exists but couldn't execute it (error -8)
[    2.040000] Kernel panic - not syncing: No working init found.  Try passing init= option to kernel. See Linux Documentation/init.txt for guidance.
[    1.955000] request_module: runaway loop modprobe binfmt-464c
//该错误是由于没有配置交叉编译工具  
配置busybox时,在配置中发现busybox setting->build options->
在cross compile prefix中写入arm-none-linux-gnueabi-

 CentOS 7 利用qemu模拟ARM vexpress A9开发板第7张

CentOS 7 利用qemu模拟ARM vexpress A9开发板第8张

这个错误可在编译阶段排除  make CROSS_COMPILE=arm-none-linux-gnueabi- #重要

5. qemu 退出方法

此时先按CTRL+A组合键并且放手后再按X键退出QEMU。

CentOS 7 利用qemu模拟ARM vexpress A9开发板第9张

----------------------------------------------------------------------------

搭建的过程看似简单,可也遇到了不少麻烦,很多都是通过百度/bing解决的。

 

参考:

从零使用qemu模拟器搭建arm运行环境

用Qemu模拟vexpress-a9 (二) --- 创建根文件系统

qemu 退出方法

用Qemu模拟vexpress-a9(一) --- 搭建Linux kernel调试环境

 

免责声明:文章转载自《CentOS 7 利用qemu模拟ARM vexpress A9开发板》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇(九)Docker-PS 详解Autoit安装及启动下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

LINUX环境下,达梦数据库8配置ODBC连接

1、检查gcc包 [root@localhost ~]#rpm -qa|grep gcc 如若没有安装,则使用如下方式安装。 安装gcc包 [root@localhost ~]#yum install -y gcc 2、cd到unixODBC安装包的目录 3、解压安装包,执行指令 [root@localhost home]#tar -xzvf unixO...

Linux下的压缩和解压缩命令gzip/gunzip

作者:邓聪聪 Linux下的压缩和解压缩命令——gzip/gunzip yum -y install zip gzip (--安装压缩工具) gzip命令 gzip命令用来压缩文件。gzip是个使用广泛的压缩程序,文件经它压缩过后,其名称后面会多处“.gz”扩展名。 gzip是在Linux系统中经常使用的一个对文件进行压缩和解压缩的命令,既方便又...

[Linux实用工具]Ubuntu环境下SSH的安装及使用

SSH分为客户端和服务端。 服务端是一个守护进程,一般是sshd进程,在后台运行并响应来自客户端的请求。提供了对远程请求的处理,一般包括公共密钥认证、密钥交换、对称密钥加密和非安全连接。 客户端一般是ssh进程,另外还包含scp、slogin、sftp等其他进程。 工作机制: 1. 客户端发送一个连接请求到远程服务端 2. 服务端检查申请的包和IP地址,...

docker原理(转)

转自:https://zhuanlan.zhihu.com/p/22382728      https://zhuanlan.zhihu.com/p/22403015 在学习docker的过程中,我发现目前docker学习最大的障碍,不是网上的资源太少,而是网上的资源太多,资源太多带来的噪声让学习效率降低不少。而在讲解docker原理上,所有的讲解都是关于...

linux clamav杀毒软件的安装

一、概述   Linux比其它操作系统更稳定更安全。理论上Linux是有可能被病毒侵害的。但实际上 Linux机器几乎不可能遭受病毒的攻击。所以我这里的问题是为什么要为Linux准备防病毒软件,为了更好理解,我准备了以下理由,Linux平台安装杀毒软件的原因:1、从Linux平台扫描Windows驱动。2、通过网络扫描Windows工作站。3、在Linux...

父进程非阻塞回收子进程(适用LINUX下C语言的clientserver模型)

      众所周知,子进程退出后(不管是正常还是异常退出),其父进程需要通过wait或waitpid来回收子进程的一些资源。回收是没有疑义的,但是父进程在哪儿回收,以什么方式回收,却影响着设计思路和效率。        一般的回收机制都属于阻塞回收,父进程阻塞等待子进程技术,收到子进程的退出状态。然而在实验中我需要实现的属于client-server模型...