基于QEMU的IMX6ULL虚拟开发环境搭建

姓名:顿皓 学号:19020100178 学院:丁香2号书院

转自:https://blog.csdn.net/ReCclay/article/details/104971182

【嵌牛导读】Linux 下的驱动开发是一个合格的全栈工程师必备技能,无论做项目产品还是自己DIY小玩意儿,掌握驱动开发的思路与流程都大有裨益。本系列专栏将使用qemu模拟器,虚拟出一个I.MX6ULL芯片,搭载Cortex-A7内核来运行Linux系统,进而在其基础上来学习驱动开发。在该专栏中,将为读者呈现三类常用驱动的开发流程,分别是字符设备驱动、块设备驱动以及网络设备驱动。如果读者之前有学习过单片机、RTOS等相关知识,将可以通过本专栏达到快速入门的效果。

【嵌牛鼻子】Linux QEMU IMX6ULL 开发环境搭建

【嵌牛提问】如何搭建I.MX6ULL虚拟开发板的开发环境?

【嵌牛正文】

市面上一块可以运行Linux的开发板动辄都要上千元了,对于在校的大部分学生来讲还是一笔不小的开销。那么有没有一种方法“站着还可以把钱挣了呢”?毫无疑问,必须滴!通俗来讲就是开个模拟器或者仿真器嘛,类似单片机开发中的Proteus。在Linux驱动开发中那就是Qemu了。关于Qemu的知识还是蛮复杂的,这里我们主要是学习驱动开发,不进行Qemu的过多介绍,不然就本末倒置了不是么?

本节将基于Qemu搭建I.MX6ULL虚拟开发板的开发环境,该虚拟开发环境的一切原料都有开源大神为我们做好了,我们要做的就是将这些原料按合理的逻辑勾兑到一起。

需要提醒的是,本篇搭建教程仅支持Ubuntu16.04和Ubuntu18.04两个版本,并且注意文章中部分命令在这两个版本系统下也会有区分。还有就是在搭建过程中需要在合适的路径输入相应的命令,特别注意区别用户名

一、安装qemu

更新和修复软件

sudo apt-get update

sudo apt-get upgrade

sudo apt-get -f install

安装KVM,加速qemu运行。

sudo apt-get install qemu qemu-kvm libvirt-bin bridge-utils virt-manager

安装git,方便下载qemu

sudo apt-get install git

安装qemu系统镜像(适用ubuntu-16.04开发环境)

cd ~

git  clone  https://e.coding.net/weidongshan/ubuntu-16.04_imx6ul_qemu_system.git

适用ubuntu-18.04开发环境命令如下:

git clone https://e.coding.net/weidongshan/ubuntu-18.04_imx6ul_qemu_system.git

镜像目录结构及说明如下,尤其要注意红框中的部分,在后期的嵌入式驱动开发中要进行替换! 

二、运行qemu

进入qemu安装路径

cd ~/ubuntu-16.04_imx6ul_qemu_system

首次运行需要安装SDL环境,运行下面的脚本自动解压安装

./install_sdl.sh // 提示输入用户密码,等待安装完成

:如果安装过程中遇到依赖关系报错( dependency problems),输入sudo apt-get install -f 即可自动修复依赖关系。

运行带GUI的imx6ul模拟器(注意:启动后便进入了qemu的终端,而下面的操作仍然是在ubuntu终端进行的,需要再开一个终端进行下面的操作。)

./qemu-imx6ull-gui.sh // 启动后,登录名是root,无需密码

终端退出qemu的方法:输入 ctrl+a 抬起后,再输入 x。

三、下载源码

  完整的嵌入式Linux系统包含:bootloader、Linux内核、设备树、根文件系统。QEMU可以略过bootloader而直接启动内核,这给开发带来了便利。

设置git邮箱账号和用户名

git config --global user.email "[email protected]"

git config --global user.name "recclay"

下载源码到/home/clay目录

考虑到代码仓库过多,特使用repo工具管理代码。先用git clone下载repo工具,再用repo工具下载源码:

:在通过repo下载源码的过程中,可能会提示python版本过低,要求3.6+以上,实测不影响最后的代码,如果不放心可以通过安装Miniconda环境来安装高版本的python。

cd ~

git clone https://e.coding.net/codebug8/repo.git

mkdir -p 100ask_imx6ull-qemu && cd 100ask_imx6ull-qemu

../repo/repo init -u https://e.coding.net/weidongshan/manifests.git -b linux-sdk -m  imx6ull/100ask-imx6ull_qemu_release_v1.0.xml --no-repo-verify

../repo/repo sync -j4

在/home/clay目录下的100ask_imx6ull-qemu文件夹里,便是对应的源码!

其中交叉编译工具,就在其中的ToolChain目录下,接下来配置交叉编译工具需要用到!

四、更新内核和设备树

设置交叉编译工具链

在终端输入vi ~/.bashrc

在文件的末尾加上下列代码,然后重启系统或输入source ~/.bashrc即可生效!

export ARCH=arm

export CROSS_COMPILE=arm-linux-gnueabihf-

export PATH=$PATH:/home/clay/100ask_imx6ull-qemu/ToolChain/gcc-linaro-6.2.1-2016.11-x86_64_arm-linux-gnueabihf/bin

注:上述在.bashrc中设置交叉编译工具链参数是永久生效的,若要仅对当前终端生效,直接在终端中敲入上述三行代码即可!

编译内核及设备树

cd /home/clay/100ask_imx6ull-qemu/linux-4.9.88

make mrproper

make 100ask_imx6ull_qemu_defconfig

make zImage -j4

make dtbs

编译内核时可能会因为缺少lzop报错,安装lzop即可解决:sudo apt-get install lzop。

更新内核和设备树

编译成功后,可在./arch/arm/boot/zImage目录下得到内核文件,在./arch/arm/boot/dts/100ask_imx6ull_qemu.dtb得到设备树文件

用上述2个文件去替换qemu中的zImage和100ask_imx6ull_qemu.dtb即可达到更新内核和设备树的目的。

qemu的内核和设备树文件在其安装目录下的./imx6ull-system-image文件夹下。

五、更新根文件系统

imx6ull-system-image目录下名为rootfs.img的文件,就是根文件系统。

进入根文件系统所在目录

cd ~/imx6ull-system-image

挂载根文件系统

sudo mount-o loop rootfs.img /mnt

更新根文件系统

挂载成功后可以通过/mnt目录访问根文件系统,进而也可以对其中的内容进行修改

修改完毕后,取消挂载

sudo umount /mnt

六、配置NFS

启动qemu虚拟开发板

./qemu-imx6ull-gui.sh

注意:启动后便进入了qemu的终端,而下面的操作仍然是在ubuntu终端进行的,需要再开一个终端输入下面的命令。

在Ubuntu中安装、配置NFS服务

sudo apt-get install nfs-kernel-server

打开配置文件

sudo vim/etc/exports

在文件末尾,添加类似以下的内容

下面的例子里允许开发板通过NFS访问Ubuntu的/home/clay目录,当然你可以加其他目录。

/home/clay *(rw,nohide,insecure,no_subtree_check,async,no_root_squash)

重启NFS服务

sudo /etc/init.d/nfs-kernel-server restart

在Ubuntu上通过NFS挂载自己,测试NFS是否可用。

sudo mount -t nfs -o nolock,vers=3 127.0.0.1:/home/clay /mnt

输入ls /mnt,看看是否和/home/clay下的内容一致,一致则说明挂载成功!

注意:测试完毕后别忘了sudo umount /mnt卸载哦。

七、qemu通过NFS访问Ubuntu

需要注意的是,以下配置qemu的NFS,应该在qemu打开的模拟板子终端输入命令!

开发板获取IP地址

QEMU运行时,Ubuntu是Host即宿主机,QEMU给它分配的IP是10.0.2.2。

QEMU模拟的imx6ull板子是Guest即客户机,它会自动获取IP,也可以自己设置。

Guest可以通过10.0.2.2访问Host,Host不能访问Guest

Guest中可以使用ifconfig命令查看IP,如果没有IP,可以进行如下设置:

:该命令在板子模拟终端输入!

ifconfig eth0 10.0.2.15

挂载主机NFS目录

QEMU模拟的imx6ull开发板,可以NFS挂载访问10.0.2.2(Ubuntu主机)

:该命令在板子模拟终端输入!

mount -t nfs -o nolock,vers=3 10.0.2.2:/home/clay /mnt

如果一切正常,在开发板上就可以通过/mnt目录访问Ubuntu的/home/clay目录了。

你可能感兴趣的:(基于QEMU的IMX6ULL虚拟开发环境搭建)