QEMU模拟Cortex-A9运行U-boot和LinuxV0.2.0[互联网+]_第1页
QEMU模拟Cortex-A9运行U-boot和LinuxV0.2.0[互联网+]_第2页
QEMU模拟Cortex-A9运行U-boot和LinuxV0.2.0[互联网+]_第3页
QEMU模拟Cortex-A9运行U-boot和LinuxV0.2.0[互联网+]_第4页
QEMU模拟Cortex-A9运行U-boot和LinuxV0.2.0[互联网+]_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、QEMU模拟Cortex-A9运行U-boot和LinuxQEMU模拟Cortex-A9运行U-boot和Linux11. 实验目的22. 实验要求23. 实验原理24. 实验步骤34.1 VMware虚拟机中安装Ubuntu34.2 安装QEMU模拟器34.3 编译并运行U-boot44.4 编译并运行Linux64.5 在目标机(Linux系统)中运行应用程序9思考题111. 实验目的1) 熟练使用Linux操作系统; 2) 认识一种新的内核模拟器QEMU;3) 掌握嵌入式Linux系统的开发流程;2. 实验要求 1) 在PC机上安装VMware虚拟机,并在VMware中安装Linux操作

2、系统(Ubuntu 12.04);2) 在Ubuntu中安装QEMU;3) 编译U-boot,并在QEMU上运行;4) 编译Linux内核,并使用Busybox制作根文件系统;5)在QEMU上运行Linux操作系统;6)在该Linux系统上运行应用程序。3. 实验原理 1)VMware Workstation虚拟机是可以在Windows/Linux系统上运行的应用程序,它可以模拟基于x86的标准PC环境。这个环境和真实的计算机一样,都有芯片组、CPU、内存、显卡、声卡、网卡、软驱、硬盘、光驱、串口、并口、USB控制器、SCSI控制器等设备。与“多启动”系统相比,VMWare采用了完全不同的概念

3、,多启动系统在一个时刻只能运行一个系统,在系统切换时需要重新启动机器。而VMWare虚拟机软件是一个“虚拟PC”软件,它可以使你在一台机器上同时运行多个Windows、DOS、LINUX系统,并且在系统切换时不需要重启计算机。 在使用上,这台虚拟机和真正的物理主机几乎没有区别,都需要分区、格式化、安装操作系统、安装应用程序和软件,总之,一切操作都跟一台真正的计算机一样。2)QEMU模拟器:QEMU 是一个面向完整PC系统的开源仿真器。除了可以仿真处理器之外,QEMU 还可以仿真所有必要的子系统,如连网硬件和视频硬件。它还允许实现高级概念上的仿真(如对称多处理系统(多达 255个CPU)和对其他

4、处理器架构(如 ARM 和 PowerPC)的仿真。QEMU有两种运行模式:* User mode模拟模式,亦称作使用者模式。QEMU能启动那些为不同中央处理器编译的Linux程序。* System mode模拟模式,亦称作系统模式。QEMU能模拟整个电脑系统,包括中央处理器及其他周边设备。它使得对跨平台编写的程序进行测试及调试变得容易。其亦能用来在一部主机上虚拟多部不同的系统。3)嵌入式Linux系统的结构嵌入式Linux系统从软件的角度看通常可以分为4个层次:引导加载程序Bootloader。内核。完成对硬件设备的控制,Linux内核的主要模块分为以下几个部分:存储管理、CPU和进程管理、

5、文件系统、设备管理和驱动、网络通信、以及系统的初始化(引导)、系统调用等。文件系统。它提供了用于管理系统的各种配置文件,以及为系统执行用户应用程序提供了良好的运行环境。用户应用程序。根据不同的用户需求而编写的程序。4)QEMU与宿主机之间的通信机制:QEMU提供了四种网络通信模式:TAP、user、Sockets和VDE。利用user模式可以实现虚拟机和宿主机之间的通信且较为简单易行,在这种通信模式中,虚拟机处于10.0.2.*网段,该网段通过一个NAT服务器与外界通信,NAT服务器的地址是,虚拟机的IP地址从5开始分配。4. 实验步骤4.1 VMware虚拟机

6、中安装Ubuntu(1)自行下载ubuntu12.04的.iso系统镜像,并在VMware中安装。(2)Ubuntu安装完成后,设置root密码,以便后期编译时获取root权限。(3)终端sudo apt-get update 完成更新。(4)安装GNU的交叉编译工具链。 sudo apt-get install gcc-arm-linux-gnueabisudo apt-get install g+-arm-linux-gnueabi 安装完成后会在 /usr/arm-linux-gnueabi/ 目录下生成库文件、头文件等。4.2 安装QEMU模拟器sudo apt-get install

7、 qemu qemu-system qemu-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中在该目录下解压:tar jxvf u-boot-2012.04.tar.bz2,在当前目录下会产生一个u-boot-12.04的文件夹:进入到u-boot-2012.04目录下,修改其中的Makefile,添加两

8、行(可放在文档的开头),ARCH?=arm CROSS_COMPILE ?= arm-linux-gnueabi-(2)进入到u-boot-2012.04文件夹下,终端输入命令:make ca9x4_ct_vxp_config make 结果如下:结果会在u-boot-2012.04文件夹下生成u-boot.bin等文件,如下图所示:(3)然后在终端中执行下面的命令,来启动U-bootqemu-system-arm -M vexpress-a9 -m 256M -nographic -kernel u-boot或者qemu-system-arm -M vexpress-a9 -m 256M -

9、serial stdio -kernel u-boot结果如下图:此时是检测Flash failed后停止运行,是因为在 arch/arm/lib/board.c里面 board_init_r()函数里检测Flash失败后调用了hang(), 暂时先把hang()去掉就可以运行下去了。正常的运行结果如下:4.4 编译并运行Linux(1)到/下载最新的Linux内核源码,(参考 linux-3.4.4.tar.bz2),解压后得到文件夹linux-3.4.4,修改Makefile , 修改的位置如下图:修改如下ARCH = armCROSS_COMPIL

10、E=arm-linux-gnueabi-在linux-3.4.4目录下 make vexpress_defconfig然后 make menuconfig - System Type 把 Enable the L2x0 outer cache controller 取消, 否则Qemu会起不来。然后make,会在arch/arm/boot/ 目录下生成zImage内核映像文件,这就是我们需要的内核映像。(2)制作根目录系统。1.编译busybox 下载busybox源码:/downloads/busybox-1.21.0.tar.bz2解压,还是在bu

11、sybox-1.21.0目录下的Makefile中修改ARCH = armCROSS_COMPILE=arm-linux-gnueabi-make menuconfig进行配置在Busybox Setting-Build Opdions-选择 Build BusyBox as a static binary (no shared libs)使用静态编译 make ,会在目录中产生install文件, make inatall ,会在目录中生成文件夹_install,2. 制作根文件系统目录mkdir rootfscd rootfs(1) 建立目录结构mkdir bin etc dev lib

12、proc tmp root home sys usr sbin var mnt(2) 运行库-来自工具链cp -a /usr/arm-linux-gnueabi/lib/* lib(3) 配置文件-来自busyboxcp -a /examples/bootfloppy/etc/* etc(4) busybox工具集cp -a /_install/* .(5) 设备文件udo cp -a /dev/console /dev/loop0 /dev/loop1 /dev/null /dev/ram0 /dev/tty /dev/tty0 /dev/tty1 /dev/zero dev(6) 修改md

13、ev配置,mdev负责自动生成设备节点,mdev.conf是配置文件vim etc/mdev.conf controlC0-9 0:0 0660 =snd/pcm.* 0:0 0660 =snd/seq.* 0:0 0660 =snd/mix.* 0:0 0660 =snd/ timer 0:0 0660 =snd/其他特殊要求的设备文件,同样道理即可.(7) 修改启动配置vi etc/init.d/rcS增加mount -n -t proc none /proc mount -n -t sysfs none /sys mdev -s 这句很重要,生成所有的设备节点如果用nfs的话,有了以上目

14、录就可以了3. 根文件系统镜像dd if=/dev/zero of=rootfs.img bs=1M count=64 # 32M的镜像mkfs.ext3 rootfs.imgmkdir tmpfssudo mount -o loop rootfs.img tmpfssudo cp -a rootfs/* tmpfs/sudo umount tmpfsrootfs.img中就有了文件系统镜像了,ext3格式.(3)QEMU运行Linux系统qemu-system-arm -M vexpress-a9 -m 256M -kernel /home/syl/linux-3.4.4/arch/arm/

15、boot/zImage -append root=/dev/mmcblk0 console=tty0 init=/linuxrc -sd rootfs.img运行结果如下:/home/syl/linux-3.4.4/arch/arm/boot/是放置内核镜像的路径。4.5 在目标机(Linux系统)中运行应用程序用户应用程序在目标机上运行有两种方法:将编译后的可执行文件放入到根文件系统中,在做成根文件系统的镜像后,由内核调用并执行。使用NFS(网络文件系统)在本地机和目标机之间建立通信。1)QEMU与Ubuntu之间的通信1. 首先在Ubuntu上安装NFS网络文件系统apt-get inst

16、all nfs-kernel-server2. 在NFS服务的配置文件/etc/exports中添加:/ *(rw,no_root_squash,insecure)3. 关闭Ubuntu的网关,避免连接不上:在/etc/resolv.conf中全部注释掉,不要DNS服务器地址。4. 在宿主机Ubuntu中开启NFS服务: /etc/init.d/nfs-kernel-server start5. 再次启动Qemu,在最后面添加如下命令 -net user -net nic s6. 最后,在目标机中配置网络、挂载NFS文件系统、切换根文件系统: ifconfig eth0 5 u

17、p route add default gw mount -t nfs -o nolock 41:/ /mnt这样就可将41的主机的文件系统挂载到/mnt目录下。(注:41是我的Ubuntu的IP地址,可用ifconfig查看本地机的IP地址。) 图(一) 图(二)图(一)是查看/mnt目录下所挂载的本地机的文件系统,图(二)是本地机的文件系统,比较以上两图可知,本地机上的文件系统在目标机上挂载成功。2)测试Hello World.在本地机上使用vim编辑Hello World测试程序hello.c;编译hell

18、o.c生成可执行文件;将可执行文件在目标机上运行。思考题1、QEMU运行的Linux系统中是否需要安装gcc。2、在本地机(Ubuntu)编译应用程序时,是使用gcc还是arm-linux-gcc?为什么?3、如何将可执行文件在系统开机后自启动?4、QEMU运行的Linux系统是命令行模式,如何将它改成图形用户界面模式?从零使用qemu模拟器搭建arm运行环境为什么会有这篇文章早在2011年的时候,跟当时同事一起讨论,做Linux系统开发正处于整个Linux开发中间层,没有上层的C/C+业务和数据库的开发经验,也没有底层的内核和驱动开发经验,到底路该如何走基于对Linux系统开发的理解和内核的

19、兴趣,认为选择Linux内核开发更适合自己。于是到淘宝上买了块三星s3c2440(arm 9)开发板,学起内核开发。没有过多久,机缘巧合,正式加入了公司的内核开发部。就这样跟内核和arm打上交道了。没有想到这一做就是3年了,arm芯片只有在公司才能使用,回到家里就不能访问了。去年(2014)开始觉得做内核久了,应该向内核社区提交patch,提升知名度和影响力。但在公司提交patch不方便,于是在家里通过qemu方式搭建于ARM A9的运行环境,进行开发和测试验证,一口气提交了好几个patch(link1,link2,link3,link4,link5)并被社区接纳了。最近在梳理Linux内存机

20、制,无论是深入理解Linux内核还是深入理解内核架构这两本红宝书都无法告知你每个细节的时候,就需要查看代码细节,修改代码,甚致做行为分析。此时需要修改代码输出调试信息,以帮助更深入体会代码的逻辑。这该是qemu派上场的时候。其实我前前后后搭建qemu+arm的运行环境已超过5次了,每次都要花上很多时间。碰巧昨天有同事看到我再次搭建,他如搭珍宝,告诉我一定要将搭建qemu的方法告诉他。所以,如果你想买个开发板来做arm + linux嵌入式开发,完全可以使用qemu进行开发。或者你像我一样,对内核机制关心,而不关心于具体的外设器件,最多是关心arm架构相关的功能,也可以使用qemu进行开发。一句

21、话:搭建qemu+arm环境,用于做内核开发和功能分析调试。搭建环境我整个搭建过程都是在笔记本上进行的,Ubuntu 12.04系统;如果是Fodera环境,搭建过程可能略有不同,但关键步骤是不变的。qemu模拟得最好的arm芯片,要数ARM公司的vexpress A9开发板了,本文的搭建过程都是围绕这个开发板进行的。当然,如果你想搭其它开发板,也不难,只要qemu和内核对它有成熟的支持就够了。下面是step by step的搭建过程,建议没有特别诉求的朋友,按照下在面的步骤操作。或者先根据下面的步骤成功搭建vexpress运行环境之后,再根据自己的需求进行更改。下载Linux内核下载内核有两

22、种方法,一种是用Git直接下载内核代码树,方便后面的内核开发。另一种是直接到内核社区下载对应版本的源码包。我采用第一种方法,但后面发现主线上3.18版本和后面版本的代码,使用这种搭建方法运行不起来。目前未查明问题的根因。如果读者想快速搭建成功,建议选用3.16版本的内核进行搭建。方法一:使用gitgit clonegit://pub/scm/linux/kernel/git/torvalds/linux.git方法二:直接下载3.16源代码包wget /pub/linux/kernel/v3.x/linux-3.16.tar

23、.xz安装arm的交叉编译工具链想必做嵌入式开发的朋友,对交叉编译工具链不陌生。如果你订制一个交叉编译工具链,建议你使用crosstool-ng开源软件来构建。但在这里建议直接安装arm的交叉编译工具链:sudo apt-get install gcc-arm-linux-gnueabi编译Linux内核生成vexpress开发板子的config文件:make CROSS_COMPILE=arm-linux-gnueabi- ARCH=arm vexpress_defconfig编译:makeCROSS_COMPILE=arm-linux-gnueabi- ARCH=arm生成的内核镱像位于a

24、rch/arm/boot/zImage, 后续qemu启动时需要使用该镜像。下载和安装qemu模拟器其实Ubuntu 12.04有qemu的安装包,但由于版本较低,对vexpress开发板支持不友好,建议下载高版本的qemu:wget /download/qemu-2.0.2.tar.bz2配置qemu前,需要安装几个软件包:sudo apt-get install zlib1g-devsudo apt-get install libglib2.0-0sudo apt-get install libglib2.0-dev配置qemu,支持模

25、拟arm架构下的所有单板:./configure -target-list=arm-softmmu -audio-drv-list=编译和安装:makemake install测试qemu和内核能否运行成功qemu已经安装好了,内核也编译成功了,到这里最好是测试一下,编译出来的内核是否OK,或者qemu对vexpress单板支持是否够友好。运行命令很简单:qemu-system-arm -M vexpress-a9 -m 512M -kernel /home/ivan/kernel_git/linux/arch/arm/boot/zImage -nographic-append console

26、=ttyAMA0如果看到内核启动过程中的打印,说明前的搭建是成功的。这里简单介绍下qemu命令的参数:-M vexpress-a9 模拟vexpress-a9单板,你可以使用-M ?参数来获取该qemu版本支持的所有单板-m 512M 单板运行物理内存512M-kernel/home/ivan/kernel_git/linux/arch/arm/boot/zImage 告诉qemu单板运行内核镜像路径-nographic不使用图形化界面,只使用串口-append console=ttyAMA0内核启动参数,这里告诉内核vexpress单板运行,串口设备是哪个tty。注意:我每次搭建,都忘了内核

27、启动参数中的console=参数应该填上哪个tty,因为不同单板串口驱动类型不尽相同,创建的tty设备名当然也是不相同的。那vexpress单板的tty设备名是哪个呢? 其实这个值可以从生成的.config文件CONFIG_CONSOLE宏找到。如果搭建其它单板,需要注意内核启动参数的console=参数值,同样地,可从生成的.config文件中找到。制作根文件系统到这里是否大功告成了呢? 其实在上面的测试中,你会发现内核报panic,因为内核找不到根文件系统,无法启init进程。根文件系统要考虑两个方面:1. 根文件系统的内容 如果你看过Linux From Scratch,相信你会对这一步

28、产生恐惧感,但如果一直从事嵌入式开发,就可以放下心来。根文件系统就是简单得不能再简单的几个命令集和态动态而已。为什么Linux From Scratch会有那么复杂,是因为它要制作出一个Linux发生版。但在嵌入式领域,几乎所有的东西,都是mini版本,根文件系统也不例外。 本文制本的根文件系统 = busybox(包含基础的Linux命令) + 运行库 + 几个字符设备2. 根文件系统放在哪里 其实依赖于每个开发板支持的存储设备,可以放到Nor Flash上,也可以放到SD卡,甚至外部磁盘上。最关键的一点是你要清楚知道开发板有什么存储设备。 本文直接使用SD卡做为存储空间,文件格式为ext3格式下载、编译和安装busyboxwget http:/www.busybox.NET/downloads/busybox-1.20.2.tar.bz2make defconfigmake CROSS_COMPILE=arm-linux-gnueabi-make installCROSS_COMPILE=arm-linux-gnueabi-安装完成后,会在busybox目录下生成_install目录,该目录下的程序就是单板运行所需要的命令。形成根目录结构先在Ubuntu主机环境下,形成目录结构,里面存放的文件和目录与单板上

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论