QEMU模拟CortexA9运行Uboot和LinuxV020互联网+Word格式.docx
《QEMU模拟CortexA9运行Uboot和LinuxV020互联网+Word格式.docx》由会员分享,可在线阅读,更多相关《QEMU模拟CortexA9运行Uboot和LinuxV020互联网+Word格式.docx(17页珍藏版)》请在冰豆网上搜索。
1)VMwareWorkstation虚拟机是可以在Windows/Linux系统上运行的应用程序,它可以模拟基于x86的标准PC环境。
这个环境和真实的计算机一样,都有芯片组、CPU、内存、显卡、声卡、网卡、软驱、硬盘、光驱、串口、并口、USB控制器、SCSI控制器等设备。
与“多启动”系统相比,VMWare采用了完全不同的概念,多启动系统在一个时刻只能运行一个系统,在系统切换时需要重新启动机器。
而VMWare虚拟机软件是一个“虚拟PC”软件,它可以使你在一台机器上同时运行多个Windows、DOS、LINUX系统,并且在系统切换时不需要重启计算机。
在使用上,这台虚拟机和真正的物理主机几乎没有区别,都需要分区、格式化、安装操作系统、安装应用程序和软件,总之,一切操作都跟一台真正的计算机一样。
2)QEMU模拟器:
QEMU是一个面向完整PC系统的开源仿真器。
除了可以仿真处理器之外,QEMU还可以仿真所有必要的子系统,如连网硬件和视频硬件。
它还允许实现高级概念上的仿真(如对称多处理系统(多达255个CPU))和对其他处理器架构(如ARM和PowerPC)的仿真。
QEMU有两种运行模式:
*Usermode模拟模式,亦称作使用者模式。
QEMU能启动那些为不同中央处理器编译的Linux程序。
*Systemmode模拟模式,亦称作系统模式。
QEMU能模拟整个电脑系统,包括中央处理器及其他周边设备。
它使得对跨平台编写的程序进行测试及调试变得容易。
其亦能用来在一部主机上虚拟多部不同的系统。
3)嵌入式Linux系统的结构
嵌入式Linux系统从软件的角度看通常可以分为4个层次:
引导加载程序Bootloader。
内核。
完成对硬件设备的控制,Linux内核的主要模块分为以下几个部分:
存储管理、CPU和进程管理、文件系统、设备管理和驱动、网络通信、以及系统的初始化(引导)、系统调用等。
文件系统。
它提供了用于管理系统的各种配置文件,以及为系统执行用户应用程序提供了良好的运行环境。
用户应用程序。
根据不同的用户需求而编写的程序。
4)QEMU与宿主机之间的通信机制:
QEMU提供了四种网络通信模式:
TAP、user、Sockets和VDE。
利用user模式可以实现虚拟机和宿主机之间的通信且较为简单易行,在这种通信模式中,虚拟机处于10.0.2.*网段,该网段通过一个NAT服务器与外界通信,NAT服务器的地址是10.0.2.2,虚拟机的IP地址从10.0.2.15开始分配。
4.实验步骤
4.1VMware虚拟机中安装Ubuntu
(1)自行下载ubuntu12.04的.iso系统镜像,并在VMware中安装。
(2)Ubuntu安装完成后,设置root密码,以便后期编译时获取root权限。
(3)终端sudoapt-getupdate完成更新。
(4)安装GNU的交叉编译工具链。
sudoapt-getinstallgcc-arm-linux-gnueabi
sudoapt-getinstallg++-arm-linux-gnueabi
安装完成后会在/usr/arm-linux-gnueabi/目录下生成库文件、头文件等。
4.2安装QEMU模拟器
sudoapt-getinstallqemuqemu-systemqemu-utils
然后在终端中运行qemu-system-arm--version会显示如下QEMU的版本信息:
4.3编译并运行U-boot
(1)在windows下到
ftp:
//ftp.denx.de/pub/u-boot/下载最新版本的U-Boot源代码,(参考版本u-boot-2012.04.tar.bz2),下载完后将其放入ubuntu中在该目录下解压:
tarjxvfu-boot-2012.04.tar.bz2,在当前目录下会产生一个u-boot-12.04的文件夹:
进入到u-boot-2012.04目录下,修改其中的Makefile,添加两行(可放在文档的开头),
ARCH?
=arm
CROSS_COMPILE?
=arm-linux-gnueabi-
(2)进入到u-boot-2012.04文件夹下,终端输入命令:
makeca9x4_ct_vxp_config
make
结果如下:
结果会在u-boot-2012.04文件夹下生成u-boot.bin等文件,如下图所示:
(3)然后在终端中执行下面的命令,来启动U-boot
qemu-system-arm-Mvexpress-a9-m256M-nographic-kernelu-boot
或者
qemu-system-arm-Mvexpress-a9-m256M-serialstdio-kernelu-boot
结果如下图:
此时是检测Flashfailed后停止运行,是因为在arch/arm/lib/board.c里面board_init_r()函数里检测Flash失败后调用了hang(),暂时先把hang()去掉就可以运行下去了。
正常的运行结果如下:
4.4编译并运行Linux
(1)到http:
//www.kernel.org/下载最新的Linux内核源码,(参考linux-3.4.4.tar.bz2),解压后得到文件夹linux-3.4.4,修改Makefile,修改的位置如下图:
修改如下
ARCH=arm
CROSS_COMPILE=arm-linux-gnueabi-
在linux-3.4.4目录下makevexpress_defconfig
然后makemenuconfig-->
SystemType
把EnabletheL2x0outercachecontroller取消,否则Qemu会起不来。
然后make,会在arch/arm/boot/目录下生成zImage内核映像文件,这就是我们需要的内核映像。
(2)制作根目录系统。
1.编译busybox
下载busybox源码:
解压,还是在busybox-1.21.0目录下的Makefile中修改
makemenuconfig进行配置
在BusyboxSetting--->
BuildOpdions-->
选择[]BuildBusyBoxasastaticbinary(nosharedlibs)使用静态编译
make,会在目录中产生install文件,
makeinatall,会在目录中生成文件夹_install,
2.制作根文件系统目录
mkdirrootfs
cdrootfs
(1)建立目录结构
mkdirbinetcdevlibproctmproothomesysusrsbinvarmnt
(2)运行库-来自工具链
cp-a/usr/arm-linux-gnueabi/lib/*lib
(3)配置文件-来自busybox
cp-a<
busybox_dir>
/examples/bootfloppy/etc/*etc
(4)busybox工具集
/_install/*.
(5)设备文件
udocp-a/dev/console/dev/loop0
/dev/loop1
/dev/null
/dev/ram0
/dev/tty
/dev/tty0
/dev/tty1
/dev/zerodev
(6)修改mdev配置,mdev负责自动生成设备节点,mdev.conf是配置文件
vimetc/mdev.conf
controlC[0-9]0:
00660=snd/
pcm.*0:
seq.*0:
mix.*0:
timer0:
其他特殊要求的设备文件,同样道理即可.
(7)修改启动配置
vietc/init.d/rcS
增加
mount-n-tprocnone/proc
mount-n-tsysfsnone/sys
mdev-s这句很重要,生成所有的设备节点
如果用nfs的话,有了以上目录就可以了
3.根文件系统镜像
ddif=/dev/zeroof=rootfs.imgbs=1Mcount=64#32M的镜像
mkfs.ext3rootfs.img
mkdirtmpfs
sudomount-olooprootfs.imgtmpfs
sudocp-arootfs/*tmpfs/
sudoumounttmpfs
rootfs.img中就有了文件系统镜像了,ext3格式.
(3)QEMU运行Linux系统
qemu-system-arm-Mvexpress-a9-m256M-kernel/home/syl/linux-3.4.4/arch/arm/boot/zImage-append"
root=/dev/mmcblk0console=tty0init=/linuxrc"
-sdrootfs.img
运行结果如下:
/home/syl/linux-3.4.4/arch/arm/boot/是放置内核镜像的路径。
4.5在目标机(Linux系统)中运行应用程序
用户应用程序在目标机上运行有两种方法:
将编译后的可执行文件放入到根文件系统中,在做成根文件系统的镜像后,由内核调用并执行。
使用NFS(网络文件系统)在本地机和目标机之间建立通信。
1)QEMU与Ubuntu之间的通信
1.首先在Ubuntu上安装NFS网络文件系统apt-getinstallnfs-kernel-server
2.在NFS服务的配置文件/etc/exports中添加:
/
*(rw,no_root_squash,insecure)
3.关闭Ubuntu的网关,避免连接不上:
在/etc/resolv.conf中全部注释掉,不要DNS服务器地址。
4.在宿主机Ubuntu中开启NFS服务:
/etc/init.d/nfs-kernel-serverstart
5.再次启动Qemu,在最后面添加如下命令
-netuser-netnic–s
6.最后,在目标机中配置网络、挂载NFS文件系统、切换根文件系统