我是穷人,可以不买开发板了吗?---QEMU 模拟arm系统

序言

  • 一直很佩服古人的那种豁达的情怀,就如《冒险雷探长》一集纪录片用作结束的一句话:“人人都是大忙人,忙着长大,弄丢了纯真;忙着赚钱,忽略了思想;忙着成功,错过了风景,岁月中的营养,匆忙间吃成了果腹的快餐。那些光阴中本该难忘的故事,就这样紧赶慢赶,没能抓住我们的影子。
  • 正如赵秉文《青杏儿》中的词句:
    “风雨替花愁。风雨罢,花也应休。劝君莫惜花前醉,今年花谢,明年花谢,白了人头。乘性两三瓯。捡溪山好处追游。但教有酒身无事,有花也好,无花也好,选甚春秋。”
  • 多想可以有这样找一个时间,放下手上的琐事,去记录下身边的风景,路走得太快,会变的浮躁,偶尔停下脚步,看一下周边的风景,去聆听陌生人的故事,体验百态人生,何尝不是一种收获
  • 于2019年末兮,遇疫情汹汹来势,遂开学无望,被迫困于家中;余犹念 Linux 驱动大道,未敢忘却一二;然则,开发板置于校,无途获于手;更有甚者,家贫,无良田、珠玉,遂无从致板以练;思绪万千,蓦然回首,QEMU 之途未尝不可试之。

准备工作

  • (1)Linux 内核:我选用的是 Linux-4.9.8 其他版本的 Linux 内核可以在此链接获取:https://www.kernel.org/
  • (2)U-Boot:我选用的是 u-boot-2017.07,其他版本的见如下链接:ftp://ftp.denx.de/pub/u-boot/
  • (3)构建根文件系统用的busybox:我使用的是 busybox-1.27.0 ,其他版本获取方法:https://busybox.net/downloads/

QEMU开始

Linux内核

  • (1)进入 Linux-4.9.8根目录,修改 Makefile 的架构和交叉编译器:
    在这里插入图片描述

  • (2)然后进入 arch/arm/configs/ 目录,可以看到有 vexpress_defconfig 配置,然后在Linux内核根目录下配置 .config 文件:执行:

make vexpress_defconfig
  • (3)执行 make menuconfig ,配置 linux 内核支持 NFS(网络文件系统),如下:
    在这里插入图片描述
    在这里插入图片描述
  • (4)配置完成后执行
make LOADADDR=0X60003000 uImage
make modules
make dtbs

分别生成 uImge 内核模块和 设备树文件,然后将 uImage 文件 vexpress-v2p-ca9.dtb 文件拷贝进 tftp 的目录中 (关于tftp服务器在Ubuntu下的安装及配置可百度哦,太多了,就不介绍了)

uImage在arch/arm/boot/ 目录下
vexpress-v2p-ca9.dtb 在arch/arm/boot/dts/ 目录下

至此,关于Linux 内核的编译就完成了。

U-boot 的修改及编译

  • (1)首先,修改Uboot根目录下的 Makefile 和 config.mk
    Makefile
    在这里插入图片描述
    config.mk
    在这里插入图片描述
    编译时候如果出现以下问题的话可以
cc1: error: bad value (‘armv5’) for-march=switch
cc1: note: valid arguments to ‘-march=switch are: nocona core2 nehalem corei7 westmere sandybridge corei7-avx ivybridge core-avx-i haswell core-avx2 broadwell skylake skylake-avx512 bonnell atom silvermont slm knl x86-64 eden-x2 nano nano-1000 nano-2000 nano-3000 nano-x2 eden-x4 nano-x4 k8 k8-sse3 opteron opteron-sse3 athlon64 athlon64-sse3 athlon-fx amdfam10 barcelona bdver1 bdver2 bdver3 bdver4 znver1 btver1 btver2

可以在Uboot根目录执行来解决:

export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabi-
  • (2)其次,在 include/configs/vexpress_common.h 中添加如下内容,配置uboot的内核镜像,设备树下载地址以及虚拟开发板 IP地址 和 tftp 服务器地址,nfs目录信息等:
    在这里插入图片描述
    具体 IP 地址可以自行根据自己配置的 tftp 服务器修改:
#define CONFIG_BOOTCOMMAND \
    "tftp 0x60003001 uImage;tftp 0x60500000 vexpress-v2p-ca9.dtb;setenv          bootargs 'root=/dev/nfs rw nfsroot=192.168.44.128:/home/zhangbin/miniTest/      rootfs init=/linuxrc ip=192.168.44.121 console=ttyAMA0';bootm 0x60003000 -      0x60500000;"

#define CONFIG_IPADDR 192.168.44.121
#define CONFIG_NETMASK 255.255.255.0
#define CONFIG_SERVERIP 192.168.44.128

  • (3)然后执行 make,进行编译 uboot 生成目标文件 u-boot
    在这里插入图片描述
    在这里插入图片描述
    同时将u-boot 拷贝到你自己随意定义的目录下

虽然,现在没有构建 根文件系统,但是,现在可以对内核,设备树以及uboot进行测试

  • (1) qemu安装:
sudo apt-get install qemu
  • (2)编写 qemu 的命令如下:
echo "start run system!!!" 
echo "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"

qemu-system-arm \
     -M vexpress-a9 \
     -kernel /home/zhangbin/miniTest/QEMU/u-boot \
     -nographic \
     -m 512M \
     -net nic,vlan=0 -net tap,vlan=0,ifname=tap0 \

  • (3)然后用sudo 执行此脚本
    在这里插入图片描述
    在这里插入图片描述
    证明uboot 和 uImage 以及设备树文件是好用的,后面就可以安心的构建 根文件系统了。

构建根文件系统

busybox配置安装

  • (1)进入 busybox-1.27.0,修改 Makefile
ARCH ?= arm
CROSS_COMPILE ?= arm-linux-gnueabi-
  • (2)然后执行图像化配置,make menuconfig
    修改如下:编译成静态库
    在这里插入图片描述
  • (3)配置完成后,执行 make 和 make install,完成后再_install 目录下有以下文件(夹)
    -在这里插入图片描述

制作根文件系统

  • 创建目录以及拷贝 busybox 生成的文件
  • 在这里插入图片描述
  • 然后可以创建
cd rootfs
mkdir etc
cd etc
mkdir init.d
cd init.d
touch rcS
chmod a+X rcS

可以在 rcS 文件中,写一些shell语句,用作启动提示

启动QEMU模拟arm开发板

启动脚本:

echo "start run system!!!"
echo "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"

qemu-system-arm \
      -M vexpress-a9 \
      -kernel /home/zhangbin/miniTest/QEMU/u-boot \
      -nographic \
      -m 512M \
      -net nic,vlan=0 -net tap,vlan=0,ifname=tap0

界面:
在这里插入图片描述
这是最简单的一个根文件系统,其他内容后续再配置。

出现的问题

  • 根文件系统挂载不上:VFS: Cannot open root device “nfs” or unknown-block(2,0): error -6 NFS
  • 解决:
    (1)修改 UBOOT 下的 vexpress_comman.h 文件中的 CONFIG_BOOTCOMMAND 参数:加上 V3
    在这里插入图片描述
#define CONFIG_BOOTCOMMAND \
   "tftp 0x60003000 uImage;tftp 0x60500000 vexpress-v2p-ca9.dtb;\
    setenv bootargs 'root=/dev/nfs rw \
    nfsroot=192.168.44.128:/home/zhangbin/miniTest/rootfs,v3 init=/linuxrc \
    ip=192.168.44.121 console=ttyAMA0';\     
     bootm 0x60003000 - 0x60500000;"

(2)在 /dev/ 目录下,创建nfs目录节点,并将根文件系统(rootfs)赋予全部权限

sudo mkdir /dev/nfs
sudo chmod 777 rootfs

结束语

  • 人一辈子如何,其实取决于几次重要的选择,人觉得累时,是因为在做自己不喜欢的事,但是喜欢的事做久了也会觉得累,那么此时就需要将喜欢的事变成一件伟大的事,做事也需要有所发展,不然做什么事最后都会不喜欢。
  • QEMU的探索还在继续,希望我们都可以找到属于我们的那一份可以坚持下去的梦想,LInux驱动之路很长,慢慢行走,慢慢积累,别让匆匆的生活使我们忘记初心。

猜你喜欢

转载自blog.csdn.net/qq_41782149/article/details/107012943