【RAM】Ubuntu中QEMU模拟ARM开发环境

https://blog.csdn.net/qq_24188351/article/details/77891353

https://blog.csdn.net/qq_24188351/article/details/77921653

一步步教你如何在Ubuntu虚拟机中安装QEMU并模拟模拟arm 开发环境(一)uImage u-boot

2017年09月08日 09:58:02 风清扬的博客 阅读数:16692

 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_24188351/article/details/77891353

初次接触qemu是因为工作的需要,有时候下了班,可能需要在家研究一些东西,因为博主用到arm环境,这时候博主比较小气,不愿花钱买开发板,当然博主在这里给大家的建议是,如果要真正学懂arm构架的相关知识,还是单独买一块arm的开发板,慢慢摸索吧,毕竟这才是最好的学习方法,如果你不愿花钱那么你可以跟着博主一起来操作,今天的这篇文章,博主主要讲的是,在Ubuntu虚拟机环境下,采用qemu 来模拟出arm的开发环境,在操作开始之前,首先科普一下:

1.什么是QEMU:QEMU可以简单的理解为虚拟操作系统模拟器,顾名思义这是一种虚拟的存在(更多介绍请参考百度百科)

2.为什么要采用QEMU 模拟操作环境:(1)为攻城狮们节约时间,在家也可以随时学习,可以脱离开发板实物,(2)方便调试等等

特此声明:本文章主要争对初入职场的小白,如果您不是为了更高端更复杂的嵌入式环境搭建,请跟着博主一步步操作!!!

第一部分:Ubuntu虚拟机的安装,博主环境,宿主机为 wind64位,所以我们这里下载Ubuntu镜像为桌面版的64位镜像

1.Ubuntu17.04下载地址及其版本:

http://releases.ubuntu.com/17.04/   

下载到宿主机,无需做解压,

请分清您自己的宿主机版本,当然也可以安装32位,但为了后面保证不出错,建议和我一样

接下来就是打开虚拟机进行一步步的安装了,博主在这里就不做展示了,下面我安装好的画面,

2.Ubuntu安装好以后,我们做如下操作,sudo apt-get  update 更新我们的软件,保证后面安装其他软件都是最新版本的

3,软件更新完毕,我们先安装 vim  工具,为了后面更方便的操作sudo apt-get vim

4,vim安装完毕后,我们接下来要安装一个重要的工具了,vmware-tools,这是Ubuntu和我们宿主机之间进行互交的工具,

点击之后,系统会自动挂载虚拟磁盘,里面存放我们需要的vmware-tools工具安装目录和可执行文件,我们把它拷贝到home下,新建一个文件夹放在里面

接下就是进行解压和安装了,一路  enter  键 和 yes  no  的输入,等待安装完毕

安装完毕后,我们可以试试安装是否正确,我们从宿主机复制一个文件到我们的Ubuntu看看,是个可以复制成功,如果不能复制,可以输入命令 reboot  重启我们的虚拟机

问题就解决,当然你可以为主机和虚拟机差创建一个共享文件夹(相关方法这里就不罗嗦了,自己百度吧),博主这里试了试,安装时正确的

至此我们的Ubuntu开发环境初步就搭建完成了,这里只是介绍了,最初不得开发环境搭建和配置,更多的自己慢慢摸索吧

第二部分:安装QEMU ,我们的主角终于要登场了

1.博主在这里就选择联网自己安装了,这样比较方便,手动安装要先安装依赖库,想提高自身的博友们,可以借鉴别人的帖子

这里博主也给大家提供QEMU 的下载地址:

http://download.csdn.net/download/jinchengzhou/9464470  (qemu)

下面安装  qemu  采用联网方式安装:

静等安装完毕吧,安装完毕,我们输如  qemu  敲击tab键,就可以匹配出如下的 可以模拟环境,本次我们模拟的就是

qemu-system-arm  的开发环境

下面来看看我们安装的版本,2.8版本已经很高了

第三部分:下载内核源码并编译

1.下载地址:http://www.kernel.org

我们下载一个比较稳定的版本 4.9.98

因为我们此次使用模拟arm  开发环境,所有我们需将内核编译成  arm  版本的内核

2.安装arm-linuc-gcc  交叉编译工具,可以到网上去下载,版本如下

我们将安装包拷贝到 /opt/ 在,进行解压工作,将最终得到的  4.4.3  目录在移动到 /opt/下,这样路径变的简短,方便我们解下来配置环境变量

2. shell窗口输入 sudo vi ~/.bashrc  在左后加入一行,保存退出,再输入  source ~/.bashrc  是我们的配置立即生效

3,我们在shll窗口输入 arm-none-   敲击tab 键,看能否匹配出如下:能配置出就说明我们的配置和安装都正确

4,您还可以自己编写一个最简单的程序,用 arm-none-linux-gnueabi-gcc  来编译看看,是不是 arm  版本的可执行文件,博主在这里不做演示

4.交叉工具安装好以后我们的内核源码也下在好了,我们将它拷贝到Ubuntu里面,放在你喜欢的目录下,进行解压 

tar -xvf  要解压的文件,解压完毕后我们进入  最 顶层的 Makefile  文件里面,做如下修改:

5.修改完毕后,保存退出

6.我们再查看   aech/arm/configs  目录里的各个厂商的内核配置文件,这个文件非常重要,并做如下操作:

7.至此我们就将我们需要的内核编译时需要的配置文件写入内核了

8,下面还需要对内核进行详细的配置,输入make  menuconfig ,这时,可能会出错,我们还需要安装 库文件

9,输入: sudo apt-get install   libncurses5-dev  就可以解决,我们在输入 make menuconfig 会进入如下画面:

10.我们将如图 标示  的部分 选上,让内核支持nfs功能。

11.因为我们需要用nfs 来挂载根文件系统,所有我们将 nfs  功能 编译进内核之中,使其支持nfs 功能

12.接下来我们就可以进行编译了,输入  make LOADADDR=0X60003000 uImage -j4 ,这里可能会报错,

找不到mkimage  ,起初博主也感动模糊,但经过 某某度  之后,原来是 因为我们需要 u-boot 来通过自动引导内核启动

的工具将内核在编译成uImage 的格式

13.出错解决: 这里单独参看我的博客,更详细的解决方式, 这里我们 输入  sudo  apt-get install u-boot-tools 进行安装,成功后关闭 shell窗口,再次打开, 就可以解决

14,再次进行编译内核,成功了,看到这里,博主心里送了一口气,终于可以喝口茶了

也许看到这里你已经迷糊了,但是作为一名coder,如果你想在你的不惑之年你还想成为一名大师级的coder,那么我可以告诉你,这些都是小儿科,

等着你的大山还很多呢,打起精神来,骚年!接下来才是本文章的重中之重,没有一下的操作做铺垫,前面和后面的我们做的再好在漂亮,都是白搭的

第四部分:配置我们的ubuntu 和 qemu 的网络环境,因为我们要通过网络来从主机下载内核并有u-boot引导启动,还要加载跟文件系统,所以如下的操作非常必要:

1.ubuntu安装 tftp 服务器,如图,输入  sudo apt-get install tftp-hpa tftpd-hpa  来自动安装 tftp服务器

2.安装完成后,我们需要做相应的配置 vi /etc/default/tftpd-hpa  做如下的更改

这里的路径可以根据自己的喜好来自己定义,博主在这里就定义在家目录下了,在哪里定义我们就要在哪里创建 tftpboot  目录

配置好后,保存退出,wq退出,

!!!注意:博主在这里在给大家一个建议,我在退出某个文件的时候,你确定好的文件可以 wq  或 w  ,x  ,对于你在查看别人的代码的时候,建议在退出的时候选择 q 退出,这样及时你不小心碰到 键盘对文件经行了无意间的修改也没关系,因为 q 是不保存退出,这是一个好习惯,对应一个上万行代码的文件来说你这样做是必要的

3.   cd /home     我们回到家目录下  ,输入  sudo mkdir tftpboot   创建 tftpboot 目录,加上最高权限  sudo chmod 777 tftpboot 

4保存退出后,我们需要重启tftp 服务器来让其生效 ,输入  sudo /etc/init.d/tftpd-hpa restart  ,显示如下表示重启成功

在此,我们还可以输入   ps -e | grep "tftp"   来查看 tftp  的进程号

5,我们将第三部分中编译内核生产的uImage  内核镜像拷贝到tftpboot目录下

6.tftp服务器安装好以后,我们还需要安装nfs  服务,输入  sudo apt-get install  nfs-kernel-server 

7.安装完成  我们在   /dev   目录需要创建nfs 设备的挂载点

mkdir  /dev/nfs 

8.做如下的配置 vi /etc/export  在文件的最后一行添加如下内容

/home/rootfs *(rw,sync,no_root_aquash,no_suntree_check)

前面的内容代表后面我们制作好的根文件的存放的路径

9,重启 nfs  服务,suod /etc/inint.d/nfs-kernel-server restart  

10,这一步也很关键,配置qemu和  ubuntu 网络桥接

先安装一个小工具:  sudo apt-get 

install uml-utilities bridge-utils

11 ,打开相应的文件进行配置网络   sudo  vi /etc/network/interfaces

做如下内容的添加,我们再为qemu添加一块网卡   br0

12,同样保存退出,这里我们需要重启ubuntu 来是我们配置的网络生效  输入   reboot   来重启ubuntu

13,ubuntu  重启之后  ,我们输入   ifconfig   指令来查看我们新添加的网络是否成功 ,如果看到  br0  存在且和  ip 地址,说明配置成功

这里博主在制作的过程中忘记保存图片啦,就不贴出来了

做到这里我们可以暂时歇一歇,因为我们后面还有很多的事请要做,u-boot  的编译  和  根文件的制作都非常重要!

第五部分:我们需要为我们的内核启动来编译生成u-boot,u-boot的下载地址和下载的版本

ftp://ftp.denx.de/pub/u-boot/

1.我们将下载来大u--boot文件进行解压  tar -xvf u-boot-2017.07.tar.bz2   得到  u-boot-2017.07  文件夹

2.  cd u-boot-2017.07  进入文件夹,在执行 cd configs  ,在这里我可以看到很多厂商开发板的配置文件

我们选择   vexpress-ca9x4_defconfig  这个配置文件,并做如下的操作

3.这样我们就生成了 .config文件了,接着 我们在 顶层目录下  vi Makefile  打开文件做如下的更改:

  249 行添加     CROSS_COMPILE ?=arm-none-kinux-gnueabi-   这样的内容,完毕  保存退出

4,还是在定层目录  执行   vi  config.mk  打来文件   条件如下的内容:更改25行的内容

5. 接这再输入  vi include/configs/vexpress_comm.h打开文件,别问为什么  跟着操作,加入一下的内容:

6.添加完以上内容,保存退出,这样我们就配置好, 接下来就是见证奇迹的时刻了

7,输入   make -j4   开启4个线程来进行编译

8,得到我们的劳动成果了

9.  cp  u-boot  /tftpboot   目录下,我将从这里启动u-boot并加装内核zai

总结我们得到的成果:   内核镜像  uImage   u-boot  ,接下来我们还需要制作 根文件系统!!!!

好了,经过以上n多步的操作,我们离目标又更近一步了,但是我们还有工作没做完了,晚已深,人已困,今晚就到这。

后面博主会抽出时间来把  rootfs  的制作方法也展示给大家,让大家尽快把 qemu模拟arm  环境制作出来,给自己增加信心,在IT 的路上越来越好!!!

一步步教你如何在ubuntu虚拟机中安装QEMU并模拟arm 开发环境(二)rootfs制作

2017年09月10日 13:11:06 风清扬的博客 阅读数 3173

 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_24188351/article/details/77921653

过了,一天,周又到了,博主终于可以拿出时间来把上一次没有给大家展示完了的内容今天在这里一并展示给大家,希望和大家共同进步,共同学习,同时我也虔诚的希望各位业界的朋友把自己的工作经验拿出来大家一起分享,一起交流,一起学习,技术的革新少不了大家努力!!!,好了。废话不多说,开始今天的内容吧:

第一部分:制作根文件系统

1.其实对于这个根文件系统,博主一直没有搞明白,何为根文件,想必知道device tree 的朋友并不 陌生,系统本身就是个树形结构,我们整个系统除了u-boot ,内核,其次就是  根文件,内核跑起来之后,接着就要挂载根文件了,根文件系统里存放着我们的各类参数,系统初始化数据,各种系统工具,库文件,头文件。

2.制作根文件要好多的方法,你也可以直接到开发板的厂商官网去看看是否有提供,这样里面的工具,库文件,头文件比较齐全,这样就不用花费时间去制作,但是这样有个缺点就是根文件系统过于庞大,臃肿,所以,这就解释了为什么根文件系统是可以定制的,内核也是可以裁剪的,有些开发板本身自己的内存比较小,如果在加之系统过于庞大,那么这样是不行

3.制作根文件系统的工具:一般有三个,buildroot,busybox ,yocto  ,博主只有用过前两个,我们今天所展示的就是基于 buildroot 而定制的根文件系统

(1)首先我们需要下载  buildroot  安装包:

buildroot  下载地址:https://buildroot.org 

(2)下载好以后我们拖放在虚拟机中,进行解压   tar -xvf buildroot-2017.02.5.tar.bz2

(3)解压完毕,我们打开buildroot-2017.05,里面的   configs  这里面有各种厂商的开发板的配置文件,我们找到我们需要的,这里有很多,要和我们在 第一节  中做使用的相同

(3)找到之后我们点击鼠标右键 复制,并  cd ../ 退回上级目录,执行  make qenu_vexpress_defconfig  将配置文件写入 并生成了一个  .cionfig 的配置文件,出现如下图中的所示,说明写入成功

(4)接下来我还可以对源码进行一些详细的配置  :输入  make menuconfig  ,如果这里出错,你可以参考 第一节  中的 解决 方法,如果你在第一节中照着我的做了,那么这里是不会报错的,成功会进入如下的画面

(5)这里我们需要注意的是 :system configuration---->   这项,按 上下 键移到这项,按下 enter  键 进入

找到图中箭头所指的 选项,选择激活密码,并在下面的画面中输入密码,这样操作就需要我们输入密码才能登入根文件系统,博主之前在制作的过程中并没有选择,结果在成功加载 了内核之后进入根文件系统时提示要密码,在尝试了多次仍然失败后,博主重新进行了源码的编译,并选择了密码登录,才能成功登入系统

(6)选择完毕,选择  “exit” 退出主界面上,在选择图中的箭头所指的选项

进入该选项,进行如下的操作:这里我们选择的根文件系统的格式 ext4,根文件的格式有很多种,以后详细跟大家解释

选择完毕后,我们在该画面里选择如下的选项: 这里选项的是我们制作好跟文件后,进行压缩生成一个根文件的压缩文件,这样方便我们进行转移,可以保持文件的完整性

(7)其他的选项我都保持默认就可以了,我们进行保存

(8)解下来我就要进行编译工作了,输入  make -j4,等带编译完毕,我们看看我们的劳动成果

箭头所指的就是我们要的文件了

buildroot 的功能很强大,我们可以用它为我们制定一个属于自己的 操作系统,上图中我们可以看到,最终生成了 根文件rootfs.tar,内核镜像zImage  

在host  目录我usr/bin 目录还生成叫  arm  的交叉编译工具链,

我们在制作根文件的时候,还可以选择busybox工具,其实你只要仔细查看了  buildroot  的选项过程,你会发现,buildroot其实是调用了busybox工具

这里我们只是介绍 采用 qemu  来模拟arm 的环境,至于要把我们生成的目标文件下载到嵌入式开发板实物,我们要需要是buildroot生成uboot文件如下:

这样我们就可以生成 u-boot  引导文件,即可以将  rootfs.ext4,  u-boot, zImage  这些文件下载或烧写到开发板对应的扇区,就组成了我们的操作系统

至于如何烧写,这里不做讲解

第二部分:采用 qemu  生成我们最终的 模拟 环境

(1)通过在第一章中的操作,我们已经有了  u-boot引导文件,kernel的可引导镜像uImage,和配置好网络加载相关的环境变量,而在本节中的操作,我们又生成根文件系统的压缩文件rootfs.tar

(2)我们加目录下新建一个文件夹  QEMU ,将第一节中生成的文件: u-boot   uImage 和本节中生成的rootfs.tar 文件都拷贝到该目录下,新建一个目录rootfs ,将rootfs.tar  放进去解压得到如下的文件

(3)cd  ../

  退回上级目录,我们来写个运行的脚本文件,touch  qemu_arm_run.sh  ,加上可执行权限  sudo chmod 777 qemu_arm_run.sh,   vi  qemu_arm_run.sh

加入如下的内容:注意   9 行的目录一定是你QEMU 文件夹所在目录,可以进入QEMU目录 ,输入pwd 命令来查看 目录结构

(4)我们现在可以来试试了,sudo ./qemu_arm_run.sh 看到我们已经成功加载就u-boot,博主这里是 ip 地址的问题,所有没有成功加载内核,我们进入 u-boot 所在的目录,按照第一章中的相关的方法 修改 include/vexpress_commd.h中的ip 地址,改成我们现在所用的ip,重新编译u-boot 生成新的u-boot,在拷贝到当前目录,再次执行脚本命令,就可以成功加载内核了 

这里我们可以输入print  来打印环境变量信息:

我们修改完上面所说的新信息后,在执行运行脚本命令,这是激动的时刻出现了:

看到这一幕,是不是很熟悉呢

其实qemu  模拟arm  环境,还有一种方法,就是根文件也采用dd命令做成镜像,但这样我们就不能和主机里面的rootfs 目录同步,在arm 里面的操作,我们主机并不能接收到,采用  nfs   方式来挂载  根文件,我们模拟出来的arm环境和主机里面rootfs的内容是同步的,只要一个命目录中的内容改变,另一个目录里面的也随之改变,这是不是很方便呢,我们在 x86环境里写好测试程序,交叉编译成arm 版本的,就可以直接放到我们模拟出开的arm环境去运行了,并不需要开发板实物

好了,到这,里我们两节的内容就将完了,欢迎大家借鉴,希望可以尽早的帮助到您!

猜你喜欢

转载自blog.csdn.net/qq2399431200/article/details/94583121