一、QEMU环境配置

网友投稿 1029 2022-05-29

一、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、其他

虚拟机使用vmware player

推荐使用Ubuntu16.04

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

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

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

安装

1、直接把WMwareTools拷贝出来到桌面吧

2、然后打开终端解压 命令:tar -xzvf VMwareTools-10.0.6-3595377.tar.gz

3、进入解压后的目录,执行:sudo ./wmware-install.pl 然后就一直回车了。

• Ubuntu采用集中式的软件仓库机制,将软件包分类存在软件仓

库中,进行管理。软件仓库放置在各种镜像服务器中,对于用

户来说,当使用apt-get install安装软件包时,会从这些服务器

下载软件包,这些镜像服务器就是 软件源(Reposity).

• 执行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

中下载软件包列表索引,并保存到该目录

备份系统本身源文件

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

• 工具介绍

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

$ apt install u-boot-tools

1

apt install git apt install tree

1

2

初始化仓库: git init

git add name //上传

git status //看修改

git log

提交:先设置邮箱和名字

什么是交叉编译?

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

什么是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、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内核

– www.kernel.org

– git clone

git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git/

• 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

• 生成镜像: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

• $ 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、自动化引导

嵌入式bootloader

• 功能类似于PC的BIOS、硬件检测是否正常

• 加载操作系统镜像到RAM

• 设置不同的启动方式

常见的启动方式

• NOR/NAND flash启动

• 从SD卡启动

• Bootloader从网络加载Linux内核启动

• 功能类似于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 up #ip link set up brctl addif ${switch} /etc/qemu-ifdown: #! /bin/sh switch=br0 brctl delif ${switch} ifconfig down #ip link set down #tunctl -d 其中是虚拟机传入的参数

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

一、QEMU环境配置

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

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

Linux 镜像服务

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:基于CNN和MFCC的语音情感识别
下一篇:几分钟带你快速开“玩”华为防火墙
相关文章