1.下载、编译u-boot (u-boot用于嵌入式Linux系统的内核引导)
解压、进入文件夹
编译:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- vexpress_ca9x4_defconfigmake ARCH=arm CROSS_COMPILE=arm-linux-gnueabi-
2.使用qume测试
qemu-system-arm -M vexpress-a9 \ -kernel u-boot-2017-11\u-boot \ -nographic \ -m 512M
显示没有找到Image(镜像)是正常的,还未配置uImage
3.配置qemu网络功能
qemu支持多种网络连接方式,其中最常用的是桥接(bridge)。这需要依赖内核的tun/tap模块的支持
下载必要的工具包:
sudo apt-get install uml-utilities
sudo apt-get install bridge-utils
查看 /dev/net/tun文件, 若存在,则表明内核已经开启了tun支持(ubuntu-12.04以及之后的版本默认开启了该功能)
ls -l /dev/net/tun
查看本地连接的名称以及ip地址(这里因为用的是虚拟机,所以是虚拟机的ip地址,与mac的ip地址不同)
ifconfig
输入上述命令,可以看到 enp0s5 即为本地连接的名称,其中inet addr后面的地址即为虚拟机的ip地址
修改本地网络配置文件 添加桥接方式
vim /etc/network/interfaces
可以看到默认的配置文件已经有两行内容,在末尾添加如下配置:
auto br0
iface br0 inet dhcp
bridge_ports enp5s0
重启网络配置
sudo /etc/init.d/networking restart
qemu使用tap设备时,会执行 /etc/qemu-ifup 和 /etc/qemu-ifdown脚本,新版本的qemu已经自带了这两个脚本
4.开启tftp功能(tftp是一个在客户端与服务器之前传输文件的简单协议)
使用u-boot引导内核需要通过tftp协议来传输uImage和dtb文件
下载客户端程序:
sudo apt-get install tftp-hpa
下载服务器程序:
sudo apt-get install tftpd-hpa
修改配置文件 添加tftp的工作目录:
sudo vim /etc/default/tftpd-hpa
修改 "TFTP_DIRECTORY"后面的文件路径,在我的虚拟机中,我将tftpboot放在了/home/parallels/linux-rtthread/tftpboot
因此我将该路径作为 "TFTP_DIRECTORY" 的值
修改tftpboot工作目录的权限(777,最松的权限,允许写和传):
chmod 777 /home/parallels/linux-rtthread/tftpboot
重启服务:
service tftpd-hpa restart
测试tftp:
在tftpboot文件夹下创建一个文件test:
cd /home/parallels/linux-rtthread/tftpboot
touch test
切换一个目录,在该目录下执行(10.211.55.4为虚拟机的ip地址):
tftp 10.211.55.4
>get test
在该目录下发现有了test文件,说明tftp正常工作
5.修改U-boot的配置
cd u-boot-2017-11
vim /include/configs/vexpress_common.h
找到 "CONFIG_BOOTCOMMAND"大约在80%左右的位置,进行如下修改:
#define CONFIG_BOOTCOMMAND \
"run distro_bootcmd; " \
"run bootflash; " \
"setenv serverip 10.211.55.4; " \
"tftp 0x60003000 uImage; " \
"tftp 0x60500000 vexpress-v2p-ca9.dtb; " \
"setenv bootargs 'init=/linuxrc root=/dev/mmcblk0 rw; " \
"bootm 0x60003000 - 0x60500000; "
这一段脚本会在启动时自动执行,其中setenv serverip 为设置服务器的ip地址,setenv bootargs为设置qemu窗口的参数
6.将zImage转换成uImage(使用u-boot提供的工具)
cd u-boot-2017-11/tools
./mkimage -n 'Cortex-A9' -A arm -O linux -T kernel -C none -a 0x60003000 -e 0x60003000 -d ../../extra_folder/zImage uImage
将生成的uImage和之前编译内核生成的vexpress-v2p-ca9.dtb放到tftpboot文件夹下
7.启动
qemu-system-arm -M vexpress-a9 -serial stdio -kernel u-boot-2017.11/u-boot -sd a9rootfs.ext3