“100ask imx6ul qemu”的版本间的差异
Weidongshan(讨论 | 贡献) |
|||
(未显示2个用户的16个中间版本) | |||
第40行: | 第40行: | ||
=qemu简介= | =qemu简介= | ||
− | + | QEMU的英文单词是:Quick Emulator,它是一个精巧的模拟器。<br> | |
+ | 还有很多模拟器,比如VMWare、Virtual Box等。但是VMWare、Virtual Box只能模拟x86、AMD64/Intel64等PC系统;<br> | ||
+ | 而QEMU可以模拟更多硬件:ARM、MIPS、PPC、x86、AMD64/Intel64。<br> | ||
+ | QEMU用途广泛,比如Xen、Android模拟器等都是基于QEMU的。<br> | ||
+ | 在嵌入式领域,很多人使用QEMU来深研Linux,比如研究文件系统、优化等等。<br> | ||
+ | QEMU有两种模式:<br> | ||
+ | <br> | ||
+ | ==用户模式(User Mode)== | ||
+ | 简单地说,一个使用arm-xxx-gcc编译出来的程序,是给ARM板子使用的,它无法在PC机上运行,只能放到ARM板子上去运行。<br> | ||
+ | 但是使用qemu,可以在PC机上运行这个程序。比如:<br> | ||
+ | <syntaxhighlight lang="bash"> | ||
+ | $ gcc -o hello hello.c -static | ||
+ | $ ./hello // 这个hello程序是使用gcc给PC机编译的,可以直接运行 | ||
+ | Hello, world! | ||
+ | $ arm-linux-gnueabihf-gcc -o hello hello.c -static // 它是给ARM板子编译的 | ||
+ | $ ./hello // 所以无法在PC上运行 | ||
+ | bash: ./hello: cannot execute binary file: Exec format error | ||
+ | $ ./qemu-arm ./hello // 我们可以用QEMU在PC上运行它 | ||
+ | Hello, world! | ||
+ | </syntaxhighlight> | ||
+ | ==系统模式(System Mode)== | ||
+ | 很多时候我们并不满足于在PC上运行单个ARM程序,我们想模拟出整个ARM单板:<br> | ||
+ | 在这个模拟出来的虚拟ARM单板上,运行Linux系统,在其中运行各种APP。<br> | ||
+ | 这时候需要使用QEMU的系统模式。<br> | ||
+ | 我们就是使用QEMU的系统模式来模拟IMX6ULL开发板,具体的使用请看下章。<br> | ||
+ | <br> | ||
− | + | ==我们做的改进== | |
+ | QEMU可以模拟x86,也可以模拟各种ARM板子,还可以模拟各种外设。<br> | ||
百问网对QEMU做了很多改进,支持更多硬件,支持更多GUI现实,支持更方便的调试<br> | 百问网对QEMU做了很多改进,支持更多硬件,支持更多GUI现实,支持更方便的调试<br> | ||
*100ask-qemu特点 | *100ask-qemu特点 | ||
第60行: | 第86行: | ||
=快速使用= | =快速使用= | ||
+ | 使用apt-get当然也可以安装QEMU,但是它版本太低,也不支持IMX6ULL。<br> | ||
+ | 我们修改了QEMU的源码,新版本已经支持IMX6ULL,我们在此基础上添加了更多功能,也修改了一些BUG。<br> | ||
+ | 所以,请参考本文安装我们定制的QEMU。<br> | ||
+ | <br> | ||
==准备工作== | ==准备工作== | ||
*'''必须''' | *'''必须''' | ||
第80行: | 第110行: | ||
$ tar -xvf weidongshan-ubuntu-16.04_imx6ul_qemu_system-release.tgz | $ tar -xvf weidongshan-ubuntu-16.04_imx6ul_qemu_system-release.tgz | ||
− | 然后进入<code>ubuntu-16.04_imx6ul_qemu_system</code> | + | 然后进入<code>ubuntu-16.04_imx6ul_qemu_system</code>目录执行后文介绍的命令 |
<span style=" font-size:1.0rem; ">'''ubuntu-18.04解压操作步骤'''<br></span> | <span style=" font-size:1.0rem; ">'''ubuntu-18.04解压操作步骤'''<br></span> | ||
$ tar -xvf weidongshan-ubuntu-18.04_imx6ul_qemu_system-release.tgz | $ tar -xvf weidongshan-ubuntu-18.04_imx6ul_qemu_system-release.tgz | ||
− | 然后进入<code>ubuntu-18.04_imx6ul_qemu_system</code> | + | 然后进入<code>ubuntu-18.04_imx6ul_qemu_system</code>目录执行后文介绍的命令 |
+ | |||
− | |||
==运行qemu系统== | ==运行qemu系统== | ||
第103行: | 第133行: | ||
:2.1 模拟百问网imx6ul-qemu开发板: | :2.1 模拟百问网imx6ul-qemu开发板: | ||
$ ./qemu-imx6ul-gui.sh // 启动后,登录名是root,无需密码 | $ ./qemu-imx6ul-gui.sh // 启动后,登录名是root,无需密码 | ||
− | |||
− | |||
:2.2 模拟野火imx6ul-pro开发板: | :2.2 模拟野火imx6ul-pro开发板: | ||
第173行: | 第201行: | ||
|linux kernel ||https://github.com/100askTeam/qemu_imx6ull_kernel.git || https://git.dev.tencent.com/weidongshan/qemu_imx6ull_kernel.git | |linux kernel ||https://github.com/100askTeam/qemu_imx6ull_kernel.git || https://git.dev.tencent.com/weidongshan/qemu_imx6ull_kernel.git | ||
|- | |- | ||
− | |qemu 源码 || https://github.com/100askTeam/qemu.git || https://gitee.com/weidongshan/qemu | + | |qemu 源码 || https://github.com/100askTeam/qemu.git || https://gitee.com/weidongshan/qemu.git |
|- | |- | ||
|buildroot || ||https://git.dev.tencent.com/weidongshan/imx6ul_buildroot.git | |buildroot || ||https://git.dev.tencent.com/weidongshan/imx6ul_buildroot.git | ||
第183行: | 第211行: | ||
book@100ask:~$ git config --global user.name "Your Name" | book@100ask:~$ git config --global user.name "Your Name" | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | + | 初次使用GIT时,需要配置邮箱帐号和用户名,可以随意指定。 | |
考虑到代码仓库过多,特使用repo工具管理代码<br> | 考虑到代码仓库过多,特使用repo工具管理代码<br> | ||
第193行: | 第221行: | ||
book@100ask:~/100ask_imx6ull-qemu$ ../repo/repo sync -j4 | book@100ask:~/100ask_imx6ull-qemu$ ../repo/repo sync -j4 | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | + | 上面使用的repo管理的是国内coding仓库,从国内仓库下载会快很多。 | |
==设置工具链== | ==设置工具链== | ||
− | + | 交叉编译工具链主要是用于在ubuntu主机上编译可以在其它平台上运行的系统,比如在PC上为ARM板子编译程序。<br> | |
+ | 设置交叉编译工具主要是设置PATH, ARCH和CROSS_COMPILE三个环境变量,下面介绍具体设置方法。 | ||
* 永久生效 | * 永久生效 | ||
第222行: | 第251行: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | == | + | ==编译内核及设备树== |
− | + | *编译百问网imx6ull-qemu开发板内核 | |
− | + | <syntaxhighlight lang="bash"> | |
− | + | book@100ask:~/100ask_imx6ull-qemu$ cd linux-4.9.88 | |
− | + | book@100ask:~/100ask_imx6ull-qemu/linux-4.9.88$ make mrproper | |
− | + | book@100ask:~/100ask_imx6ull-qemu/linux-4.9.88$ make 100ask_imx6ul_qemu_defconfig | |
− | + | book@100ask:~/100ask_imx6ull-qemu/linux-4.9.88$ make zImage -jN //编译zImage 内核镜像,其中N参数可以根据CPU个数,来加速编译系统。 | |
+ | book@100ask:~/100ask_imx6ull-qemu/linux-4.9.88$ make dtbs //编译设备树文件 | ||
+ | </syntaxhighlight> | ||
+ | *编译内核模块 | ||
+ | |||
+ | <syntaxhighlight lang="bash"> | ||
+ | book@100ask:~/100ask_imx6ull-qemu/linux-4.9.88$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- modules | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | *安装内核模块到相应的nfs目录,以便后面挂载使用。 | ||
+ | <syntaxhighlight lang="bash"> | ||
+ | book@100ask:~/100ask_imx6ull-qemu/linux-4.9.88$ sudo make ARCH=arm INSTALL_MOD_PATH=<nfs目录> modules_install | ||
+ | </syntaxhighlight> | ||
− | == | + | : 将编译成功的'''zImage'''文件和设备树'''100ask_imx6ul_qemu.dtb'''文件拷贝到相应的目录 以便启动使用。 |
+ | |||
+ | ==修改文件系统== | ||
+ | {{Redtext| 注意 文件系统使用我们提供的 rootfs.img 文件即可,如下是修改文件系统方法}} | ||
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
$ dd if=/dev/zero of=rootfs.img bs=1M count=300 | $ dd if=/dev/zero of=rootfs.img bs=1M count=300 | ||
第239行: | 第283行: | ||
拷贝源码到挂载的tmp目录下,等待拷贝完成 | 拷贝源码到挂载的tmp目录下,等待拷贝完成 | ||
− | 执行 sync | + | 执行 sync 同步更新,让后取消挂载,即可使用此文件系统镜像启动。 |
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
$ umount ./tmp | $ umount ./tmp | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
=其它相关= | =其它相关= |
2019年11月30日 (六) 18:28的最新版本
imx6ul-qemu交流群 QQ群号:542662930
大家对qemu有任何好的建议或者问题欢迎在Github上提交 issuse https://github.com/100askTeam/qemu/issues
目录
百问网QEMU路线图
增加设备管理器
- 我们的目的是给每个外设添加GUI显示,
- 估计有近百个外设,
- 怎么管理这近百个GUI?
- 使用一个
设备管理器
,
- 在里面可以打开、关闭某个设备的GUI。
- 完成时间:2019.11.10之前
公开源码
- 完成
设备管理器
的功能后,
- 我们改造的QEMU源码将全部公开
- 公开时间:2019.11.10
编写文档
- 编写这几个文档:
- QEMU架构
- QEMU中如何模拟设备
- QEMU中的GUI操作
- QEMU如何处理鼠标键盘事件
- 如何编写IMX6ULL裸机程序操作模拟的硬件
- 如何编写IMX6ULL Linux驱动程序操作模拟的硬件
- 这几个文档可以让你深入理解QEMU,掌握模拟外设的原理
- 如果你编程能力可以,那就能模拟出一些简单设备:单线的传感器、I2C/SPI设备、定时器、LCD、触摸屏等
发布有偿项目
- 对于每个外设,都会涉及两方面: QEMU中对它的模拟,你写的裸机/驱动/app对它的操作。
- 我们会发布近百个外设的项目, 比如有红外传感器、ADC、DAC等等
- 你可以选择你擅长的,完成某个即可获得酬劳
- 你可以找人合作,比如你擅长写裸机,别人擅长写QEMU的GUI,你们一起合作就可以实现对某个外设的模拟。
qemu简介
QEMU的英文单词是:Quick Emulator,它是一个精巧的模拟器。
还有很多模拟器,比如VMWare、Virtual Box等。但是VMWare、Virtual Box只能模拟x86、AMD64/Intel64等PC系统;
而QEMU可以模拟更多硬件:ARM、MIPS、PPC、x86、AMD64/Intel64。
QEMU用途广泛,比如Xen、Android模拟器等都是基于QEMU的。
在嵌入式领域,很多人使用QEMU来深研Linux,比如研究文件系统、优化等等。
QEMU有两种模式:
用户模式(User Mode)
简单地说,一个使用arm-xxx-gcc编译出来的程序,是给ARM板子使用的,它无法在PC机上运行,只能放到ARM板子上去运行。
但是使用qemu,可以在PC机上运行这个程序。比如:
$ gcc -o hello hello.c -static
$ ./hello // 这个hello程序是使用gcc给PC机编译的,可以直接运行
Hello, world!
$ arm-linux-gnueabihf-gcc -o hello hello.c -static // 它是给ARM板子编译的
$ ./hello // 所以无法在PC上运行
bash: ./hello: cannot execute binary file: Exec format error
$ ./qemu-arm ./hello // 我们可以用QEMU在PC上运行它
Hello, world!
系统模式(System Mode)
很多时候我们并不满足于在PC上运行单个ARM程序,我们想模拟出整个ARM单板:
在这个模拟出来的虚拟ARM单板上,运行Linux系统,在其中运行各种APP。
这时候需要使用QEMU的系统模式。
我们就是使用QEMU的系统模式来模拟IMX6ULL开发板,具体的使用请看下章。
我们做的改进
QEMU可以模拟x86,也可以模拟各种ARM板子,还可以模拟各种外设。
百问网对QEMU做了很多改进,支持更多硬件,支持更多GUI现实,支持更方便的调试
- 100ask-qemu特点
- 模拟网卡
- 模拟LCD显示功能
- 模拟增加led灯
- 模拟at24cxx i2c存储芯片,直接可以通过用户态操作看到效果
- 增加逻辑分析仪显示功能
- 后续会逐渐增加更多的模拟硬件模块
- 6.1 温湿度传感器
- 6.2 红外
- 6.3 超声波模块
- 6.4 ADC,DAC模块
- 6.5 I2C接口的传感器
- 6.6 SPI接口的OLED
- 6.7 你想加啥,跟我们说
快速使用
使用apt-get当然也可以安装QEMU,但是它版本太低,也不支持IMX6ULL。
我们修改了QEMU的源码,新版本已经支持IMX6ULL,我们在此基础上添加了更多功能,也修改了一些BUG。
所以,请参考本文安装我们定制的QEMU。
准备工作
-
必须
- 一台可以上网的windows电脑
- 一个可以正常使用Ubuntu虚拟机系统
-
可选(注意,如果想要有更快效果,ubuntu下可以安装KVM)
- 安装kvm加速qemu运行,在终端下执行如下命令
$ sudo apt update $ sudo apt install qemu qemu-kvm libvirt-bin bridge-utils virt-manager
获取镜像
点击如下链接下载
ubuntu-18.04开发环境下qemu imx6ul系统镜像下载页面
ubuntu-16.04开发环境下qemu imx6ul系统镜像下载页面
下载完成后上传到Ubuntu虚拟机中,执行如下命令进行解压缩操作。
ubuntu-16.04解压操作步骤
$ tar -xvf weidongshan-ubuntu-16.04_imx6ul_qemu_system-release.tgz
然后进入ubuntu-16.04_imx6ul_qemu_system
目录执行后文介绍的命令
ubuntu-18.04解压操作步骤
$ tar -xvf weidongshan-ubuntu-18.04_imx6ul_qemu_system-release.tgz
然后进入ubuntu-18.04_imx6ul_qemu_system
目录执行后文介绍的命令
运行qemu系统
运行qemu系统前需先按照上一步下载镜像文件
打开终端,在解压后的当前目录下执行如下命令
1.首次运行需要安装SDL环境以及解压文件系统镜像:
- 使用脚本自动解压安装
$ ./install_sdl.sh // 提示输入用户密码,等待安装完成
注意qemu系统默认登录用户名为root 无密码
2.运行带GUI的imx6ul模拟器
- 2.1 模拟百问网imx6ul-qemu开发板:
$ ./qemu-imx6ul-gui.sh // 启动后,登录名是root,无需密码
- 2.2 模拟野火imx6ul-pro开发板:
$ ./qemu-imx6ul-gui.sh fire // 启动后,登录名是root,无需密码
- 2.3 模拟正点原子imx6ul-alpha开发板:
$ ./qemu-imx6ul-gui.sh atk // 启动后,登录名是root,无需密码
3.运行不带GUI的imx6ul模拟器
$ ./qemu-imx6ul-nogui.sh // 启动后,登录名是root,无需密码
4.如何退出qemu模拟器
- 在终端下按住
Ctrl
和a
键的同时按c
即进入 qemu monitor模式, 再输入q
命令即可退出QEMU
5.如何退出qemu的GUI窗口
Ctrl + Alt + G
参数讲解
-M mcimx6ul-evk
指定需要模拟的单板型号。-m 512M
指定模拟使用的内存大小。-kernel zImage
指定使用的内核镜像文件。-dtb
指定使用的设备树文件。-display sdl
指定使用那种显示输出。-serial mon:stdio
指定串口信息输出。-drive file=rootfs.img,format=raw,id=mysdcard -device sd-card,drive=mysdcard \
-append "console=ttymxc0,115200 rootfstype=ext4 root=/dev/mmcblk1 rw rootwait init=/sbin/init loglevel=8" \
-nic user
指定使用NAT共享主机网络方式上网。
操作示例
获取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开发板,可以去访问10.0.2.2,比如使用NFS挂载:
mount -t nfs -o nolock,vers=3 10.0.2.2:/home/book/nfs_rootfs /mnt
测试lcd显示
- 画同心圆
myfb-test /dev/fb0
- 测试LCD
fb-test
- 显示文字
show_font
编写并测试led驱动
- 安装编译好的led模块驱动
insmod 100ask_led.ko
- 打开并关闭led显示
ledtest /dev/100ask_led0 on ledtest /dev/100ask_led0 off
测试i2c驱动
- 不需要写I2C驱动,可以通过用户态使用内核里自带的I2C接口访问外设:
- 假设I2C存储芯片AT24C02接在IMX6UL的I2C0总线上,AT24C02的地址是0x50,
- 可以执行下面的命令写AT24C02的0地址,读其0地址:
i2c_usr_test /dev/i2c-0 0x50 w 0 0x12 i2c_usr_test /dev/i2c-0 0x50 r 0
高级玩法
获取源码
大家有发现问题或者有好的建议,欢迎在git相关仓库提 Issues
git邮箱账号和用户名配置
book@100ask:~$ git config --global user.email "you@example.com"
book@100ask:~$ git config --global user.name "Your Name"
初次使用GIT时,需要配置邮箱帐号和用户名,可以随意指定。
考虑到代码仓库过多,特使用repo工具管理代码
- repo工具获取sdk
book@100ask:~$ git clone https://git.dev.tencent.com/codebug8/repo.git
book@100ask:~$ mkdir -p 100ask_imx6ull-qemu && cd 100ask_imx6ull-qemu
book@100ask:~/100ask_imx6ull-qemu$ ../repo/repo init -u https://dev.tencent.com/u/weidongshan/p/manifests/git -b linux-sdk -m imx6ull/100ask-imx6ull_qemu_release_v1.0.xml --no-repo-verify
book@100ask:~/100ask_imx6ull-qemu$ ../repo/repo sync -j4
上面使用的repo管理的是国内coding仓库,从国内仓库下载会快很多。
设置工具链
交叉编译工具链主要是用于在ubuntu主机上编译可以在其它平台上运行的系统,比如在PC上为ARM板子编译程序。
设置交叉编译工具主要是设置PATH, ARCH和CROSS_COMPILE三个环境变量,下面介绍具体设置方法。
- 永久生效
如需永久修改,请修改用户配置文件, Ubuntu系统下,修改如下:
vim ~/.bashrc
在行尾添加或修改:
export ARCH=arm export CROSS_COMPILE=arm-linux-gnueabihf- export PATH=$PATH:/home/book/100ask_imx6ull-qemu/ToolChain/gcc-linaro-6.2.1-2016.11-x86_64_arm-linux-gnueabihf/bin
- 临时生效
执行完“export”命令后,该设置只对当前终端有效
book@100ask:~$ export PATH=$PATH:/home/book/100ask_imx6ull-qemu/ToolChain/gcc-linaro-6.2.1-2016.11-x86_64_arm-linux-gnueabihf/bin
book@100ask:~$ export ARCH=arm
book@100ask:~$ export CROSS_COMPILE=arm-linux-gnueabihf-
- 手动指定
Make编译时指定ARCH架构 CROSS_COMPILE交叉编译工具链
book@100ask:~$ export PATH=$PATH:/home/book/100ask_imx6ull-qemu/ToolChain/gcc-linaro-6.2.1-2016.11-x86_64_arm-linux-gnueabihf/bin
book@100ask:~$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
编译内核及设备树
- 编译百问网imx6ull-qemu开发板内核
book@100ask:~/100ask_imx6ull-qemu$ cd linux-4.9.88
book@100ask:~/100ask_imx6ull-qemu/linux-4.9.88$ make mrproper
book@100ask:~/100ask_imx6ull-qemu/linux-4.9.88$ make 100ask_imx6ul_qemu_defconfig
book@100ask:~/100ask_imx6ull-qemu/linux-4.9.88$ make zImage -jN //编译zImage 内核镜像,其中N参数可以根据CPU个数,来加速编译系统。
book@100ask:~/100ask_imx6ull-qemu/linux-4.9.88$ make dtbs //编译设备树文件
- 编译内核模块
book@100ask:~/100ask_imx6ull-qemu/linux-4.9.88$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- modules
- 安装内核模块到相应的nfs目录,以便后面挂载使用。
book@100ask:~/100ask_imx6ull-qemu/linux-4.9.88$ sudo make ARCH=arm INSTALL_MOD_PATH=<nfs目录> modules_install
- 将编译成功的zImage文件和设备树100ask_imx6ul_qemu.dtb文件拷贝到相应的目录 以便启动使用。
修改文件系统
注意 文件系统使用我们提供的 rootfs.img 文件即可,如下是修改文件系统方法
$ dd if=/dev/zero of=rootfs.img bs=1M count=300
$ mkfs.ext4 rootfs.img
$ mkdir ./tmp
$ sudo mount -o loop rootfs.img ./tmp
拷贝源码到挂载的tmp目录下,等待拷贝完成
执行 sync 同步更新,让后取消挂载,即可使用此文件系统镜像启动。
$ umount ./tmp
其它相关
- 参考资料
-
QEMU user manual
https://qemu.weilnetz.de/doc/qemu-doc.html -
QEMU
https://wiki.archlinux.org/index.php/QEMU
-