一、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
这里写图片描述
推荐使用Ubuntu16.04
1、Ubuntu16.04是LTS(Long Term Support)长期Support版本
2、软件包丰富,可以默认安装arm-gcc编辑器
这里写图片描述


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

  
 
  • 1

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

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

  
 
  • 1
  • 2

保存文件,并刷新配置

apt update
  
 
  • 1

1.4、安装uboot-tools

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

 $ apt install u-boot-tools

  
 
  • 1

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

 apt install git apt install tree

  
 
  • 1
  • 2

初始化仓库: git init
git add name //上传
git status //看修改
git log
提交:先设置邮箱和名字
这里写图片描述


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
  
 
  • 1
  • 2
  • 3

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

  
 
  • 1
  • 2
  • 3
  • 4

• 下载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

  
 
  • 1

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
cprinstall/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
mkdirprootfs/dev/ m k d i r p r o o t f s / d e v / mknod –m 666 tty1 c 4 1
mknodm666tty2c42 m k n o d m 666 t t y 2 c 4 2 mknod –m 666 tty3 c 4 3
mknodm666tty4c44 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
• 将各种文件拷贝到文件系统镜像中:
mounttext3rootfs.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 make –j4

• 运行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是虚拟机传入的参数
  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

内核配置编译
• 使用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;chmod777tftpboot4tftp 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 /etc/init.d/tftpd-hpa restart

自动化引导
• 修改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 "
  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

内核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、在虚拟开发板上开发应用程序、驱动示例


文章来源: xuesong.blog.csdn.net,作者:内核笔记,版权归原作者所有,如需转载,请联系作者。

原文链接:xuesong.blog.csdn.net/article/details/80835793

(完)