一、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∙
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∙
mkdir rootfs/lib
• cp–rinstall/∗rootfs∙
cp -p /usr/arm-linux-gnueabi/lib/* rootfs/lib
• mkdir−prootfs/dev/∙
mknod –m 666 tty1 c 4 1
• mknod–m666tty2c42∙
mknod –m 666 tty3 c 4 3
• mknod–m666tty4c44∙
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∙
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∙编译:
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;chmod777tftpboot∙4)重启tftp服务:
/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∙
/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进程bootargsinit=…执行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
- 点赞
- 收藏
- 关注作者
评论(0)