配置ARM虚拟机_使用qemu建立mini2440的模拟仿真环境

编者按:

参考文章&课程:

  • leao :用qemu建立mini2440的模拟仿真环境
    https://www.cnblogs.com/jinmu190/archive/2011/03/21/1990698.html
  • 星海一叶舟:qemu安装mini2440的修炼经历https://blog.csdn.net/star2523/article/details/7562210
  • 平震宇:嵌入式Linux应用于开发实践 _项目5 构建嵌入式Linux开发环境_5.6 配置交叉编译环境;5.9/10配置ARM虚拟机https://blog.csdn.net/star2523/article/details/7562210

1. 准备

1.1 认识压缩包们

  1. QEMU

中文名:虚拟操作系统模拟器
用途:模拟操作系统

百度百科中说道:QEMU是一套由法布里斯·贝拉(Fabrice Bellard)所编写的以GPL许可证分发源码的模拟处理器,在GNU/Linux平台上使用广泛。

说白了,QEMU就是是一套可以在操作系统(GNU/Linux)中仿真出另一套操作系统的仿真软件。 因为它可以在系统中仿真出一颗虚拟的CPU,然后将要仿真的操作系统交给这颗虚拟CPU去处理,所以能够达到同一平台却能同时执行两种操作系统的目的。

更多详解请移步百度百科:https://baike.baidu.com/item/QEMU/1311178?fr=aladdin

  1. U-Boot

全称:Universal Boot Loader

还是百度百科说的:Das U-Boot 是一个主要用于嵌入式系统的引导加载程序,可以支持多种不同的计算机系统结构,包括PPC、ARM、AVR32、MIPS、x86、68k、Nios与MicroBlaze。

更加详细一点来说,u-boot是一种普遍用于嵌入式系统中的Bootloader,Bootloader是在操作系统运行之前执行的一小段程序,通过它,我们可以初始化硬件设备、建立内存空间的映射表,从而建立适当的软硬件环境,为最终调用操作系统内核做好准备。 Boot Loader的主要运行任务就是将内核映象从硬盘上读到RAM中,然后跳转到内核的入口点去运行,即开始启动操作系统。系统在上电或复位时通常都从地址0x00000000处开始执行,而在这个地址处安排的通常就是系统的Boot Loader程序。

更多详解请移步百度百科:https://baike.baidu.com/item/U-Boot/10377075?fr=aladdin#5

  1. kernel

中文名:内核
类别:软件

万能的百度百科说:内核是操作系统最基本的部分,是一个操作系统的核心。它是为众多应用程序提供对计算机硬件的安全访问的一部分软件,这种访问是有限的,并且内核决定一个程序在什么时候对某部分硬件操作多长时间。内核是基于硬件的第一层软件扩充,提供操作系统的最基本的功能,是操作系统工作的基础,它负责管理系统的进程、内存、设备驱动程序、文件和网络系统,决定着系统的性能和稳定性。

通俗点,我们将操作系统的代码分成2部分。内核所在的地址空间称作内核空间。而在内核以外的统称为外部管理程序,它们大部分是对外围设备的管理和界面操作。外部管理程序与用户进程所占据的地址空间称为外部空间。通常,一个程序会跨越两个空间。当执行到内核空间的一段代码时,我们称程序处于内核态,而当程序执行到外部空间代码时,我们称程序处于用户态。

更多详解请移步:
百度百科:https://baike.baidu.com/item/%E5%86%85%E6%A0%B8/108410
AlbenXie:什么是内核https://blog.csdn.net/AlbenXie/article/details/80436095

1.2 压缩包下载

几句吐槽:深刻怀疑这是个垃圾网站,从打开到下载都慢到了一种境界。要有耐心……也可以换个浏览器多试几次。

qemu for mini2440下载
https://repo.or.cz/w/qemu/mini2440.git
在这里插入图片描述
点击图片中红色方框里面的tar.gz,就开始下载

U-boot for mini2440下载
https://repo.or.cz/w/u-boot-openmoko/mini2440.git

kernel for mini2440下载
https://repo.or.cz/w/linux-2.6/mini2440.git
在这里插入图片描述
注意,这里下载的是likely

下载完成之后的压缩包如下
在这里插入图片描述
把压缩包放到虚拟机中,再解压出来,就可以进行安装编译了。

#解压QEMU
tar -xzvf mini2440-18b91f2.tar.gz
#解压U-boot
tar -xzvf mini2440-0805cf2.tar.gz
#解压kernel
tar -xzvf mini2440-1ebb861.tar.gz 

在这里插入图片描述
注:这里我是将压缩包放在/opt/develop中,解压需要用到超级用户权限。即在命令前面加上sudo。

1.3 目标文件系统Rootfs-Qtopia-Qt4下载

下载地址:
http://www.arm9.net/download.asp
配置ARM虚拟机_使用qemu建立mini2440的模拟仿真环境_第1张图片
单击即可下载。同上,把压缩包放到虚拟机中解压出来。
在这里插入图片描述

2. 配置编译

单看教程安装编译真是简单至极,但事实上,在整个过程中我遇到了数不清的问题。

在开始之前,建议先登陆超级用户权限,不让会有很多操作无法进行。

#进入超级用户
sudo su

在这里插入图片描述

  1. 编译安装QEMU
#进入QEMU文件夹
cd mini2440-18b91f2
#配置
./configure --target-list=arm-softmmu 

在配置这一步出错:

The error log from compiling the libSDL test is: 
/tmp/qemu-conf--3170-.c:1:17: fatal error: SDL.h: 没有那个文件或目录
compilation terminated.
ERROR: QEMU requires SDL or Cocoa for graphical output

是缺少链接库的缘故,安装上即可解决。

#安装sdl库
apt-get install libsdl1.2-dev
#重新配置
./configure --target-list=arm-softmmu 

这里有个小插曲,由于我虚拟机本身配置的问题,apt-get无法下载。这里需要给apt更换一个下载源,详细操作请看:
命令行方式解决:xnlay :buntu apt-get由于源导致下载失败
https://blog.csdn.net/xnlay/article/details/79949484
图形界面解决:百度经验:Linux中apt-get命令下载或安装失败怎么办
https://jingyan.baidu.com/article/546ae185d754911149f28ca8.html
两种方案任选一种均可解决问题。

配置成功结果如下:
配置ARM虚拟机_使用qemu建立mini2440的模拟仿真环境_第2张图片
接着编译

#make
make -j4

成功结果如下:
在这里插入图片描述
2. 配置编译U-boot

#进入U-boot文件夹
cd /opt/develop/mini2440-0805cf2
#配置
make mini2440_config

配置成功结果如下:
在这里插入图片描述

#编译
make -j4

这里编译花费的时间会比较长,成功结果如下:
配置ARM虚拟机_使用qemu建立mini2440的模拟仿真环境_第3张图片
完成之后可以看到该文件夹中的U-boot.bin是原始二进制文件(raw image),执行CPU底层初始化。
详情参考:LouisGou:uboot移植(六)u-boot.bin 内存布局分析https://blog.csdn.net/JerryGou/article/details/80370000
配置ARM虚拟机_使用qemu建立mini2440的模拟仿真环境_第4张图片
3. kernel配置编译
在编译内核之前,必须先确认虚拟机是有交叉编译环境的,否则内核无法编译。

#查看虚拟机交叉编译环境
arm-linux-gcc -v

如果有,则屏幕上会显示交叉编译环境的版本:
配置ARM虚拟机_使用qemu建立mini2440的模拟仿真环境_第5张图片
若没有,请移步:

下面开始内核编译

#进入kernel文件夹
cd mini2440-1ebb861/
#配置
make mini2440_defconfig ARCH=arm

成功:
在这里插入图片描述

#进入内核配置文件
make ARCH=arm menuconfig

如果需要对内核进行修改,则在此进行修改,没有的话直接退出。
配置ARM虚拟机_使用qemu建立mini2440的模拟仿真环境_第6张图片

#编译
make ARCH=arm CROSS_COMPLE=arm-linux- uImage
#ARCH =arm CROSS_COMPILE=arm-linux- 表明:编译出来的目标是针对ARM体系结构的。
#因为是针对ARM体系结构,所以需要使用交叉编译器。使用CROSS_COMPILE=xxx来指定交叉编译器。

在这一步出现错误:

opt/FriendlyARM/toolschain/4.4.3/bin//arm-linux-gcc: 15: exec: 
/opt/FriendlyARM/toolschain/4.4.3/bin/.arm-none-linux-gnueabi-gcc: not found

原因是这个交叉编译工具是32位的,而操作系统是64位的,需要安装32位的库。

#针对ubuntu 18.04 
apt-get install lib32ncurses5 lib32z1

编译成功:
在这里插入图片描述
按照上图的路径,可以找到uImage文件,如下图。这里小小说一下,uImage中文翻译为内核程序,也就是操作系统打开之后,由U-boot启动代码引导操作系统,U-boot在完成一部分硬件初始化之后就把控制权交给uImage,这个uImage就是内核,内核是操作系统最核心的部分。
在这里插入图片描述
到这里来,就完成了QEMU,U-boot和内核的配置编译,接下来就是激动人心的内核加载了。

3. 内核启动

唠唠叨叨说一下我的理解,QEMU模拟出来一个CPU,启动的时候U-boot做启动引导,对虚拟硬件进行初始化,完成之后把控制权交给内核,也就是上面说的uImage,内核负责管理系统的进程、内存、设备驱动程序、文件和网络系统,决定着系统的性能和稳定性。直到这里,我们虚拟出来的这个ARM虚拟机是独立的,并且上面有了一些规则。但是我们知道,一个完备的操作系统,除了上述内容,还缺少了一个文件系统,就相当于我们打开电脑之后,没有C盘和E盘之类的。想让ARM虚拟机拥有文件系统,这里就需要用到挂载。下面是详细步骤。

  1. 下载目标文件系统

题外话:这里特意写出来,是因为看的很多帖子的教程都没有这一个步骤,可能大家都是大佬,觉得这一步是理所当然的,而我这个小菜鸡却在这里卡住了很久。

这里的文件系统使用的是友善之臂的Rootfs-Qtopia-Qt4,具体步骤见上面的准备阶段1.3。

  1. 安装nfs服务器

来自百度百科:网络文件系统,英文Network File System(NFS),是由SUN公司研制的UNIX表示层协议(presentation layer protocol),能使使用者访问网络上别处的文件就像在使用自己的计算机一样

我们要做的,就是让mini2440访问Linux上面的Rootfs-Qtopia-Qt4。

#安装nfs服务
 apt-get install nfs-kernel-server
 #修改配置文件
 vim /etc/exports

在文档最后添加

/opt/rootfs_qtopia_qt4  *(rw,sync,no_subtree_check)
#注意:/opt/rootfs_qtopia_qt4 是所要共享的目标文件系统。

如下,修改后保存退出。
配置ARM虚拟机_使用qemu建立mini2440的模拟仿真环境_第7张图片
重启nfs服务,让修改生效

/etc/init.d/nfs-kernel-server restart
  1. 修改启动文件
  • 修改mini2440_start.sh
#进入QEMU下mini2440文件夹
cd /opt/develop/mini2440-18b91f2/mini2440
vim mini2440_start.sh

修改为如下:

base=$(dirname $0)
echo Starting in $base
name_nand="$base/mini2440_nand128.bin"
#虚拟出一个128M的nondflash文件
if [ ! -f "$name_nand" ]; then
        echo $0 : creating NAND empty image : "$name_nand"
#       dd if=/dev/zero of="$name_nand" bs=528 count=131072
        dd if=/dev/zero of="$name_nand" bs=2112 count=65536
        echo "** NAND file created - make sure to 'nand scrub' in u-boot"
fi
#加载内核,配置虚拟网卡等工作
cmd="$base/../arm-softmmu/qemu-system-arm \
        -M mini2440 $* \
        -serial stdio \
        -mtdblock "$name_nand" \
        -show-cursor \
        -usb -usbdevice keyboard -usbdevice mouse \
        -kernel uImage \
        -net nic,vlan=0 -net tap,vlan=0,ifname=tap0, script=$base/qemu-ifup,downscript=$base/qemu-ifdown \
        -monitor telnet::5555,server,nowait"
echo $cmd
$cmd
  • 建立脚本qemu-ifup加载虚拟网卡

注意,此处代码中#并非注释的意思,//才是。

#!/bin/sh
//创建虚拟网卡tap0
tunctl -u root -t $1
//给虚拟网卡配置虚拟地址
ifconfig $1 10.0.0.1 promisc up
#sudo brctl addif br0 $1
  • 建立脚本qemu-ifdowm卸载虚拟网卡
#!/bin/sh
ifconfig $1 10.0.0.1 down
  • 将u-boot.bin和uImage复制到mini2440文件夹下
cd /opt/develop/mini2440-1ebb861/arch/arm/boot/
cp uImage /opt/develop/mini2440-18b91f2/mini2440/
cd /opt/develop/mini2440-0805cf2/
cp u-boot.bin /opt/develop/mini2440-18b91f2/mini2440/

mini2440中的文件如下:
在这里插入图片描述

你可能感兴趣的:(linux,ubuntu)