在前面的实验中,我们都是直接运行Linux内核。而在实际的嵌入式系统中都是通过BootLoader加载Linux镜像,然后再去运行。
嵌入式BootLoader
下面将介绍QEMU从Ubuntu加载镜像然后启动。
一、U-BOOT编译
1、下载U-BOOT
<官网>下载,也可以从我的<网盘>直接下载,提取码:lrd6 。【建议下载网盘里的】
下载完毕拖曳到虚拟机目录./QEMU
中,并输入tar jxvf u-boot-2017.05.tar.bz2
进行解压!
2、修改Makfile
①、进入解压后的目录,修改Makefile文件,输入vi Makefile
和之前的一样,我们需要修改交叉编译器的相关变量值。在vi的一般模式下,输入/CORSS_COMPILE
进行查找。
我的
u-boot-2017.05
在249行添加内容CROSS_COMPILE ?= arm-linux-gnueabi-
,保存退出。
行号,可以在一般模式下,然后输入
:set nu
进行显示。
vim永久显示行号配置
要想每次都显示,可以进入输入
vi /etc/vim/vimrc
,然后再文件末尾添加set nu
,保存退出即可!
②、修改config.mk
,输入vi config.mk
修改25行为:ARCH := arm
3、修改配置文件
输入make vexpress_ca9x4_defconfig
4、编译
①、输入make -j4
输入qemu-system-arm -M vexpress-a9 -m 512M -nographic -kernel u-boot
注意:出现这个倒计时的时候按下任意键直接进入,不要让它自启动,我们还没有完全配置完成,让它自启动的话会出错的。
输入print ipaddr
,若成功打印IP地址,说明安装的没有问题。否则需要再找问题!
二、QEMU网络功能配置
一般来说QEMU可以通过NAT方式与虚拟机进行连接,但是虚拟机也是通过NAT与我们主机PC进行连接的,进而外网不能访问虚拟机。若开发板也采用这种方式,造成实际虚拟机访问不了QEMU。
1、安装依赖包,apt install uml-utilities bridge-utils
2、查看tun设备文件
输入ls /dev/net
,可看到Ubuntu16.04已经默认有一个tun
文件。
3、查看网络配置
我的对应网口是ens33
,IP地址是192.168.112.142
。
4、修改配置文件
①、输入vi /etc/network/interfaces
在其中添加如下内容
auto ens33
auto br0
iface br0 inet dhcp
bridge_ports ens33
②、在/etc
目录下添加qemu-ifup
和qemu-ifdown
qemu-ifup
内容如下
#!/bin/sh
echo sudo tunctl -u $(id -un) -t $1
sudo tunctl -u $(id -un) -t $1
echo sudo ifconfig $1 0.0.0.0 promisc up
sudo ifconfig $1 0.0.0.0 promisc up
echo sudo brctl addif br0 $1
sudo brctl addif br0 $1
echo brctl show
brctl show
sudo ifconfig br0 192.168.112.142
qemu-ifdown
内容如下
#!/bin/sh
echo sudo brctl delif br0 $1
sudo brctl delif br0 $1
echo sudo tunctl -d $1
sudo tunctl -d $1
echo brctl show
brctl show
③、上面两个修改和添加完成后,输入reboot
进行重启!
重启后输入ifconfig
,可发现已经生成虚拟网口br0
,这个就是以后的虚拟开发本与主机host通信接口。
三、使用U-boot引导内核镜像
前提
make LOADADDR=0x60003000 uImage -j4
1、进入linux内核所在目录,cd /home/clay/QEMU/linux-4.4.195/
2、指定U-boot加载内核地址
①、输入make LOADADDR=0x60003000 uImage -j4
②、查看uImage
是否生成,输入ls arch/arm/boot
四、TFTP工具安装
1、安装tftp工具:apt install tftp-hpa tftpd-hpa xinetd
2、修改配置文件,输入vi /etc/default/tftpd-hpa
修改文件内容如下所示:
# /etc/default/tftpd-hpa
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/home/clay/QEMU/tftpboot"
TFTP_ADDRESS="0.0.0.0:69"
TFTP_OPTIONS="-l -c -s"
3、在/home/clay/QEMU/
下,创建tftpboot
文件夹
然后设置其权限为最高权限,输入chmod 777 tftpboot
4、重启tftp服务
输入/etc/init.d/tftpd-hpa restart
5、拷贝文件到tftpboot文件夹
①、拷贝三个文件
cp -r /home/clay/QEMU/linux-4.4.195/arch/arm/boot/uImage .
cp -r /home/clay/QEMU/u-boot-2017.05/u-boot .
cp -r /home/clay/QEMU/linux-4.4.195/arch/arm/boot/dts/vexpress-v2p-ca9.dtb .
②、新建脚本boot-uboot.sh
,并添加可执行权限,然后写入代码如下。
qemu-system-arm \
-M vexpress-a9 \
-kernel u-boot \
-nographic \
-m 512M \
-net nic,vlan=0 -net tap,vlan=0,ifname=tap0 \
-sd a9rootfs.ext3