0
点赞
收藏
分享

微信扫一扫

一、QEMU环境配置


一、QEMU环境配置

• 1、搭建嵌入式开发基本环境
• 2、QEMU安装及A9开发板配置介绍
• 3、编译、运行Linux内核
• 4、使用BusyBox制作根文件系统
• 5、使用U-boot引导启动Linux内核
• 6、挂载NFS文件系统
• 7、在虚拟开发板上开发应用程序、驱动示例

1、搭建嵌入式开发基本环境

• 1.1、Vmware+Ubuntu16.04
• 1.2、Vmwaretools
• 1.3、更新软件源
• 1.4、安装uboot-tools
• 1.5、代码编辑管理工具:Git/vim
• 1.6、交叉编译器:gcc-arm-linux-gnueabi
• 1.7、其他

1.1、Vmware+Ubuntu16.04

虚拟机使用vmware player

一、QEMU环境配置_git


推荐使用Ubuntu16.04

1、Ubuntu16.04是LTS(Long Term Support)长期Support版本

2、软件包丰富,可以默认安装arm-gcc编辑器

一、QEMU环境配置_git_02

1.2、Vmware-tools

安装vmware-tools:跟主机之间拷贝文件

安装
1、直接把WMwareTools拷贝出来到桌面吧
2、然后打开终端解压 命令:tar -xzvf VMwareTools-10.0.6-3595377.tar.gz
3、进入解压后的目录,执行:sudo ./wmware-install.pl 然后就一直回车了。

1.3、更新软件源

1.3.1、什么是软件源?

• Ubuntu采用集中式的软件仓库机制,将软件包分类存在软件仓
库中,进行管理。软件仓库放置在各种镜像服务器中,对于用
户来说,当使用apt-get install安装软件包时,会从这些服务器
下载软件包,这些镜像服务器就是 软件源(Reposity).

1.3.2、工作原理

• 执行apt update,程序分析/etc/apt/source.list
• 自动联网寻找list中对应的Packages/Sources/Release列表文件,
如果有更新则重新下载之,存入存入/var/lib/apt/lists/目录
• 然后apt install相应的包,下载到本地并进行安装
• /var/lib/dpkg/available:软件包的描述信息,软件源中所有软
件包中的信息,包括安装和未安装的软件包
• /var/cache/apt/archives:当apt install安装软件包的临时存放路

• /etc/apt/sources.list:文件里是软件源站点,apt install时,
Ubuntu会从这些站点下载软件包到本地并进行安装
• /var/lib/apt/lists:使用apt update命令会从/etc/apt/sources.list
中下载软件包列表索引,并保存到该目录

1.3.3、软件源的更换

备份系统本身源文件

cp /etc/apt/sources.list /etc/apt/sources.list.backup

修改源文件内容,将新的源地址写入该文件中

//先安装vim:apt-get insatll vim
vim /etc/apt/sources.list

保存文件,并刷新配置

apt update

1.4、安装uboot-tools

• 工具介绍
• 用来生成适应U-boot引导的镜像文件格式

$ apt install u-boot-tools

1.5、代码编辑管理工具:Git/vim

apt install git
apt install tree

初始化仓库: git init

git add name //上传

git status //看修改

git log

提交:先设置邮箱和名字

一、QEMU环境配置_环境配置_03

1.6、交叉编译器:gcc-arm-linux-gnueabi

什么是交叉编译?
• 在一种计算机环境中编译程序,在另外一种环境下运行。或者说在一个平台上编译生成在另一个平台上运行的可执行代码。

什么是ABI和EABI
• ABI: 二进制应用程序接口(Application Binary Interface (ABI) for the ARM Architecture) 在计算机中,应用二进制接口描述了应用程序(或者其他类型)和操作系统之间或其他应用程序的低级接口. 涵盖了数据类型的大小、布局和对齐,调用约定

• EABI: 嵌入式ABI
嵌入式应用二进制接口指定了文件格式、数据类型、寄存器使用、堆积组织优化和在一个嵌入式软件中的参数的标准约定。
• Arm-none-gnueabi-linux比arm-linux-gcc要好,在可移植性、兼容性上面
• 早期u-boot和Linux编译可能使用的都不是一个arm-linux-gcc版本

安装
• $ apt install gcc-arm-linux-gnueabi

• $ apt install g++-arm-linux-gnueabi

1.7、其他

1、curses库–libncurses5-dev–游标移动及屏幕的显示

2、我们在ubuntu上编译程序,不是说有了gcc就行了,需要先apt-get install build-essential,
这个包提供了很多编译相关的软件包,里面有:

dpkg-dev fakeroot g++ g++-4.6 libalgorithm-diff-perl
libalgorithm-diff-xs-perl libalgorithm-merge-perl
libdpkg-perl libstdc++6-4.6-dev libtimedate-perl

3、(工具链:一般由编译器、连接器、解释器和调试器组成)
gcc-arm-none-eabi是GNU项目下的软件,是一个面向裸机arm的编译器

2、QEMU安装及A9开发板配置介绍

• 自动安装

• $ apt install qemu

• 手动编译安装

• 首先安装QEMU编译依赖的包

– apt install zlib1g-dev
– apt install libglib2.0-0 libglib2.0-dev
– apt install libsdl1.2-dev
– apt install libpixman-1-dev libfdt-dev

• 下载QEMU源码:git clone git://git.qemu-project.org/qemu.git
git branch -a

分支 git checkout remotes/origin/stable-2.8 -b stable-2.8

标签 git tag

• 切换到一个稳定版本:git checkout v2.7.0

• 编译配置:./configure –target-list=arm-softmmu –audio-drv-list=

• 编译安装:make ; make install

使用

查看qemu 支持的开发板子

qemu-system-arm -M  help

3、编译、运行Linux内核

• 下载Linux内核

– www.kernel.org
– git clone
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git/

• 修改Makefile

• ARCH=arm CROSS_COMPILE=arm-linux-gnueabi-
• 编译内核、模块、dtb文件
• makevexpressdefconfig;makezImage∙ m a k e v e x p r e s s d e f c o n f i g ; m a k e z I m a g e • make modules; make dtbs

• 运行内核

qemu-system-arm -M vexpress-a9 -m 512M -kernel arch/arm/boot/zImage -dtb arch/arm/boot/dts/vexpress-v2p-ca9.dtb -nographic -append “console=ttyAMA0”

qemu-system-arm -nographic -M vexpress-a9 -m 1024M -kernel arch/arm/boot/zImage -append “rdinit=/linuxrc console=ttyAMA0 loglevel=8” -dtb arch/arm/boot/dts/vexpress-v2p-ca9.dtb

4、使用busybox制作根文件系统

什么是根文件系统?

• 文件系统
• 对存储设备上的数据进行组织的机制

为什么要使用文件系统

• Linux的哲学:一切皆文件
• 用户与操作系统进行交互的主要工具:文件系统调用
• 用户和底层存储的接口

根文件系统

• Linux内核启动后第一个挂载的文件系统
• 主要由基本的shell命令、各种库、字符设备、配置脚本组成
• 提供了根目录/
• RFS可以放在:nor/nand flash、SD卡、磁盘、网络空间上

编译安装

• 下载源代码:​​http://www.busybox.net/downloads/​​​
• 修改Makefile:ARCH=arm CROSS_COMPILE=arm-linux-gnueabi-
• 配置:make defconfig ; make menuconfig
• 编译:make
• 安装:make install

制作根文件系统

• mkdirrootfs∙ m k d i r r o o t f s • mkdir rootfs/lib
• cp–rinstall/∗rootfs∙ c p – r i n s t a l l / ∗ r o o t f s • cp -p /usr/arm-linux-gnueabi/lib/* rootfs/lib
• mkdir−prootfs/dev/∙ m k d i r − p r o o t f s / d e v / • mknod –m 666 tty1 c 4 1
• mknod–m666tty2c42∙ m k n o d – m 666 t t y 2 c 4 2 • mknod –m 666 tty3 c 4 3
• mknod–m666tty4c44∙ m k n o d – m 666 t t y 4 c 4 4 • mknod –m 666 console c 5 1
• $ mknod –m 666 null c 1 3

制作SD卡文件系统镜像

• 生成镜像:dd if=/dev/zero of=rootfs.ext3 bs=1M count=32
• 格式化为exts文件系统:mkfs.ext3 rootfs.ext3
• 将各种文件拷贝到文件系统镜像中:
• mount−text3rootfs.ext3/mnt/−oloop∙ m o u n t − t e x t 3 r o o t f s . e x t 3 / m n t / − o l o o p • cp -r rootfs/* /mnt
• $ umount /mnt

• 启动内核,挂载rootfs

• $ qemu-system-arm -M vexpress-a9 -m 512M -dtb ./vexpress-
v2p-ca9.dtb -kernel ./zImage -nographic -append
“root=/dev/mmcblk0 rw console=ttyAMA0” -sd rootfs.ext3

• 图形化启动内核

• $ qemu-system-arm -M vexpress-a9 -m 512M -dtb ./vexpress-
v2p-ca9.dtb -kernel ./zImage -append “root=/dev/mmcblk0 rw
console=tty0” -sd rootfs.ext3

mkdir etc/init.d
touch etc/init.d/rcS
chmod a+x rcS
vi rcS

5、使用u-boot加载Linux内核

• 5.1、嵌入式启动概述
• 5.2、U-boot编译
• 5.3、QEMU网络功能设置
• 5.4、内核配置编译
• 5.5、主机TFTP工具安装
• 5.6、启动测试
• 5.7、自动化引导

5.1、嵌入式启动概述

嵌入式bootloader
• 功能类似于PC的BIOS、硬件检测是否正常
• 加载操作系统镜像到RAM
• 设置不同的启动方式

常见的启动方式
• NOR/NAND flash启动
• 从SD卡启动
• Bootloader从网络加载Linux内核启动

5.2、U-boot编译

• 功能类似于Windows的BIOS
• 编译u-boot
• 下载: ​​​http://ftp.denx.de/pub/u-boot/​​​
• 修改Makefile:ARCH=arm CROSS_COMPILE=arm-linux-gnueabi-
• 配置:makevexpressca9x4defconfig∙编译: m a k e v e x p r e s s c a 9 x 4 d e f c o n f i g • 编 译 :

• 运行u-boot
• qemu-system-arm -M vexpress-a9 \
-kernel u-boot \
-nographic \
-m 512M

QEMU网络功能设置
• 配置QEMU与主机的网络连接
• 采用桥接(bridge)的网络连接与Host通信
• 需要主机内核tun/tap模块支持
• 配置
• 主机安装工具包: apt install uml-utilities bridge-utils
• 创建tun设备文件:/dev/net/tun
• 修改/etc/network/interfaces文件,重启生效:
• # interfaces(5) file used by ifup(8) and ifdown(8)
auto lo
iface lo inet loopback
auto ens33
auto br0
iface br0 inet dhcp
bridge_ports ens33
• 配置/etc/qemu-ifup、/etc/qemu-ifdown脚本

/etc/qemu-ifup与/etc/qemu-ifdown,是kvm启动后将网卡在宿主主机上配置的脚本文件,我的archlinux没有这个脚本自己写了一个,直接上代码
/etc/qemu-ifup:
#! /bin/sh
switch=br0
ifconfig $1 up
#ip link set $1 up
brctl addif ${switch} $1

/etc/qemu-ifdown:
#! /bin/sh
switch=br0
brctl delif ${switch} $1
ifconfig $1 down
#ip link set $1 down
#tunctl -d $1
其中$1是虚拟机传入的参数

内核配置编译
• 使用U-boot引导内核镜像
• 需要将内核编译为uImage格式
• 需要指定uImage的加载地址
• 编译时指定:$ make LOADADDR=0x60003000 uImage -j4

主机TFTP工具安装
• 安装主机Host的TFTP
• 1)安装tftp工具:$ apt-get install tftp-hpa tftpd-hpa xinetd

• 2)修改配置文件: /etc/default/tftpd-hpa
TFTP_USERNAME=”tftp”
TFTP_DIRECTORY=”/home/tftpboot”
TFTP_ADDRESS=”0.0.0.0:69”
TFTP_OPTIONS=”-l -c -s”
• 3)创建tftp目录:mkdir/home/tftpboot;chmod777tftpboot∙4)重启tftp服务: m k d i r / h o m e / t f t p b o o t ; c h m o d 777 t f t p b o o t • 4 ) 重 启 t f t p 服 务 :

自动化引导
• 修改include/configs/vexpress_common.h
• #define CONFIG_BOOTCOMMAND \
“tftp 0x60003000 uImage;tftp 0x60500000 vexpress-v2p-ca9.dtb; \
setenv bootargs ‘root=/dev/mmcblk0 console=tty0’; \
bootm 0x60003000 - 0x60500000; ”
• 配置开发板、主机IP地址
/Netmask/
196 #define CONFIG_IPADDR 192.168.244.128
197 #define CONFIG_NETMASK 255.255.255.0
198 #define CONFIG_SERVERIP 192.168.244.129

6、挂载NFS文件系统

• 主机HOST支持NFS服务
• 修改bootargs启动参数
• • • 设置NFS为根文件系统
• • • 设置主机NFS文件系统的地址
• 内核支持挂载NFS文件系统

安装
​​​$ apt install nfs-kernel-server​

配置NFS
• 在/etc/exports文件中添加:

​/work *(rw,sync,no_root_squash,no_subtree_check)​

开启NFS服务
• /etc/init.d/rpcbindrestart∙ / e t c / i n i t . d / r p c b i n d r e s t a r t • /etc/init.d/nfs-kernel-server restart

安装FTP:
​​​sudo apt-get install vsftpd openssh-server nfs-kernel-server portmap​

配置 FTP 服务
修改 vsftpd 的配置文件/etc/vsftpd.conf,将下面两行前面的“#”号去掉。

​#local_enable=YES​​​
​​​#write_enable=YES​

上面第一行表示是否允许本地用户登录,第二行表示是否允许上传文件。
修改完华之后,执行以下命令重启 ftp 服务:

​sudo /etc/init.d/vsftpd restart​

修改bootargs启动参数:
修改BOOTCOMMAND(hhbf.h中)

#define CONFIG_BOOTCOND \
"tftp 0x60003000 uImage;tftp 0x60500000 vexpress-v2p-ca9.dtb;\
setenv bootargs
'root=/dev/nfs rw\
nfsroot=192.168.244.129:/homg/rootfs init=/linuxrc \
ip=192.168.244.128 console=ttyAMA0';\
bootm 0x60003000 - 0x60500000

"

内核make menuconfig
配置内核支持挂载NFS文件系统

File systems –>

完善根文件系统:

• 增加内核的各种用户接口
• 重启reboot功能

步骤:

• 新建etc目录
• • • 添加inittab、 init.d/rcS、 fstab、 profile
• 新建tmp、 sys、 var、 proc目录
• 启动Linux,挂载NFS文件系统

四个文件的启动流程

• Linux内核启动之后,挂载NFS根文件系统
• 开启Linux的第一个用户进程: init
• init进程bootargsinit=…执行inittab脚

• inittab脚本首先会执行init.d/rcS脚本
• rcS脚本:执行mount –a 读取fstab挂载各种
文件系统
• inittab:接着会启动console
• • • 启动shell: /bin/sh
• • • 在启动/bin/sh之前先执行profile文件

7、在虚拟开发板上开发应用程序、驱动示例


举报

相关推荐

0 条评论