一,前言
之前拿出10年前的TQ2440折腾了2周的主要目的就是因为我怀疑OLED屏不支持的原因是电流太小。也就是硬件不支持。而TQ2440自带LCD屏幕的,虽然线很多都断了,但是我家有电烙铁,可以焊接,这个不是问题。但是TQ2440文件系统无法挂载,导致我只能另觅方案了,qemu之前也玩过的,但是我记得是无法联网的。这样的话我添加模块或者添加APP都不方便,网上搜索了下其实是可以通过为qemu添加网桥来支持网络的。就是qemu就等于vmware虚拟机。
二,ubuntu18.04配置网桥
配置网桥的目的是qemu虚拟机的时候可以使用网桥来挂载主机的nfs文件系统
ubuntu设置网桥,我一开始我网上搜索很多资料尝试配置后,有2处不对,一个是开机变慢很多,另外一个是bridge_ports没有显示出来。后来无意中发现ubuntu从17开始就用yaml配置了。不是修改/etc/network/interfaces,因为它并不一定起作用的。
1.查看网卡名
sudo ls /proc/sys/net/ipv4/conf
2.设置网桥
我看到被人用ens33等,我的网卡名称为eno1
我看别人是修改/etc/netplan/50-cloud-init.yaml。我在/etc/netplan下面只有一个01-network-manager-all.yaml
所以我就修改此文件,内容如下,格式需要保持对齐
network:
version: 2
renderer: networkd #NetworkManager
ethernets:
eno1:
dhcp4: no
dhcp6: no
bridges:
br0:
interfaces: [eno1]
dhcp4: no
addresses: [192.168.0.110/24]
gateway4: 192.168.0.254
nameservers:
addresses: [114.114.114.114,8.8.8.8]
启动命令
netplan apply
如果想看到日志
netplan --debug apply
运行命令ifconfig可以看到网桥br0和eno1网卡。
编辑在etc文件夹下创建qemu-up,其实就是创建tap0虚拟网卡。
#!/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.0.110
三,qemu模拟开发板通过uboot挂载文件系统(失败)
通过uboot启动来挂载失败
仿真Vexpress V9开发板,uboot的cmd等修改重新编译下。
qemu-system-arm -M vexpress-a9 -m 512M -kernel u-boot -nographic -net nic -net tap,ifname=tap0
运行qemu虚拟机,可是smc911x依然无法模拟,No ethernet found奇怪。
root@applecaiHP:/home/applecai/myuboot/u-boot-2020.10-rc4_qemu# qemu-system-arm -M vexpress-a9 -m 512M -kernel u-boot -nographic -net nic -net tap,ifname=tap0
sudo tunctl -u root -t tap0
TUNSETIFF: Device or resource busy
sudo ifconfig tap0 0.0.0.0 promisc up
sudo brctl addif br0 tap0
brctl show
bridge name bridge id STP enabled interfaces
br0 8000.a2da0d604a2a no eno1
tap0
U-Boot 2020.10-rc4 (Jan 09 2021 - 21:40:04 +0800)
DRAM: 512 MiB
WARNING: Caches not enabled
Flash: 128 MiB
MMC: MMC: 0
*** Warning - bad CRC, using default environment
In: serial
Out: serial
Err: serial
Net: smc911x: Invalid chip endian 0x00004321
No ethernet found.
Hit any key to stop autoboot: 0
No ethernet found.
No ethernet found.
Wrong Image Format for bootm command
ERROR: can't get kernel image!
四,我换种方法,直接先进入文件系统后使用nfs(成功)
我在之前能成功启动图形界面中添加-net nic -net tap,ifname=tap0,这是新的qemu网络命令,我从官网help找到的方法,qemu旧版本的方法你们网上搜索吧,很多。
qemu-system-arm -M vexpress-a9 -m 512M -kernel /home/applecai/mykernel/qemu/linux-5.4.61/arch/arm/boot/zImage -dtb /home/applecai/mykernel/qemu/linux-5.4.61/arch/arm/boot/dts/vexpress-v2p-ca9.dtb -append "root=/dev/mmcblk0 console=tty0" -sd a9rootfs.ext3 -net nic -net tap,ifname=tap0
运行后成功启动,当然前提是我已经配置了网桥,ifconfig能看到br0和eno1了,而tap0是在qemu启动脚本中添加后会运行/etc/qeme-ifup脚本。
image.png
从上截图可以看出,我配置了eth0的ip为192.168.0.112然后可以ping通主机网桥地址192.168.0.110。然后我进行nfs挂载。
五,qemu访问nfs运行framebuffer的应用程序成功
接下来就都是一样了。在nfs挂载的文件系统中我添加了/work文件夹,在里面编译了framebuffer的应用层程序,在qemu中运行成功。这意味着我可以方便的在kernel中添加调试信息,通过qemu模拟开发板启动,调试framebuffer咯。
image.png