UEFI开发探索50 – UEFI与网络2
(请保留-> 作者: 罗冰 https://blog.csdn.net/luobing4365)
3 在VirtualBox中使用网络
在UEFI开发探索系列博客的第48篇中,我介绍了如何在VirtualBox中搭建UEFI Shell。本节就在这篇博客的基础上,让VirtualBox下的UEFI Shell有访问网络的功能。
1) 安装网络驱动和网络协议驱动
我使用的是VirtualBox6.1.4,其虚拟网卡为Intel Pro/1000MT Desktop。网卡驱动下载地址为:
https://downloadcenter.intel.com/download/27539/Ethernet-Intel-Ethernet-Connections-Boot-Utility-Preboot-Images-and-EFI-Drivers
下载版本为22.10的PREBOOT.exe,双击安装。将目录/APPS/EIF/EFIx64下的驱动E3522X2.EFI拷贝到虚拟机的硬盘中。同时,将之前编译好x64的Ipv4网络协议驱动(MdeModulePkg)也拷贝到虚拟机的硬盘中。
启动虚拟机,进入UEFI Shell,执行如下命令,加载网卡驱动和网络协议驱动:
Shell>fs0:
fs0:>load E3522X2.EFI
fs0:> load SnpDxe.efi MnpDxe.efi ArpDxe.efi Ip4Dxe.efi VlanConfigDxe.efi Udp4Dxe.efi Dhcp4Dxe.efi Mtftp4Dxe.efi Tcp4Dxe.efi
2) 配置网卡。
使用ifconfig命令设置:
fs0:\>ifconfig -s eth0 dhcp
检查网络配置情况:
图1 VirtualBox的UEFI Shell中查看IP
3) 测试网络连接
我的主机IP地址为192.168.1.42,VirtualBox虚拟机通过NAT方式与主机相连的。测试情况如下:
图2 VirtualBox的UEFI shell中网络连接测试
4 在Qemu中使用网络
以下的实验,OVMF的镜像在VS2015+UDK2018下编译,Qemu的网络实验在Ubuntu16.04 LTS下进行。
官方的文档中,OVMF的实验一直都是以Qemu为例的。Qemu的功能很强大,也非常灵活,带来的问题是配置相对复杂。因此,除了需要进行源码级调试时,我也很少使用。
在Qemu中搭建网络测试环境,可按照如下步骤进行:
1) 编译OVMF镜像。
在Intel网站上下载E3522X2.EFI,这是网卡E1000的驱动,上一节中已经给出了下载地址。进入UEFI的编译目录,新建目录Intel3.5/EFIX64,将E3522X2.EFI拷贝到这个目录下。
编译OVMF镜像,编译命令为:
C:\Myworkspace> build -p OvmfPkg/OvmfPkgX64.dsc -a X64 -D E1000_ENABLE -D DEBUG_ON_SERIAL_PORT
同时按照之前的方法编译UEFI下64位Ipv4的网络协议,将编译好的镜像OVMF.fd和网络协议驱动拷贝出来,准备下面的步骤。
2) 安装Qemu和必要的网络工具
使用apt-get 安装,命令为:
$ sudo apt-get install qemu
$ sudo apt-get install bridge-utils #虚拟网桥设置工具
$ sudo apt-get install uml-utilities #UML(User-mod linux)工具
3) 搭建Qemu的网络通道
在之前的编译中,已经将网卡驱动包含在VOMF镜像所启动的UEFI shell中了。如果不指定任何网络设置,Qemu将使用带有内置DHCP服务器的用户模式(user)网络。当虚拟机运行时,可设定为DHCP模式,它能够通过QEMU伪装的IP来访问物理主机的网络。
不过,这种情况下,能通信的仅限于TCP和UDP协议,因此ICMP协议(包括ping)将不起作用。因此,我们准备采用tap模式,使用桥接的方法,让虚拟机和外部通信起来。
首先用命令ifconfig获取本机的网络接口:
图3 获取网络接口
然后按照如下步骤操作,当然,也可以写个sh文件,批量处理:
$sudo ifconfig ens33 down # 先关闭ens33接口
$sudo brctl addbr br0 # 增加一个虚拟网桥br0
$sudo brctl addif br0 ens33 # 在br0中添加一个接口ens33
$sudo brctl stp br0 off # 只有一个网桥,所以关闭生成树协议
$sudo brctl setfd br0 1 # 设置br0的转发延迟
$sudo brctl sethello br0 1 # 设置br0的hello时间
$sudo ifconfig br0 0.0.0.0 promisc up # 打开br0接口
$sudo ifconfig ens33 0.0.0.0 promisc up # 打开ens33接口
$sudo dhclient br0 # 从dhcp服务器获得br0的IP地址
$sudo tunctl -t tap0 -u root # 创建一个tap0接口,只允许root用户访问
$sudo brctl addif br0 tap0 # 在虚拟网桥中增加一个tap0接口
$sudo ifconfig tap0 0.0.0.0 promisc up # 打开tap0接口
其作用为创建虚拟网桥br0和虚拟网卡接口tap0,并将tap0和宿主机的网络接口(ens33)作为网桥的两个接口。这样,宿主机的接口作为网桥接口,与外部网络连接;TAP设备作为网桥的另一个接口,与Qemu虚拟机中的Vlan连接。
4 配置虚拟机内UEFI网卡
将之前的Ipv4的64位驱动文件,拷贝到hda.img中,拷贝的方法在之前的博客《UEFI开发探索39》中已经详细描述过。
启动虚拟机:
$sudo qemu-system-x86_64 -bios OVMF.fd -hdd hda.img -net nic -net tap,ifname=tap0 -serial stdio
进入UEFI shell后,设置网卡的IP地址,注意要与宿主机的网卡地址同一网段。
FS0:\> ifconfig -s eth0 static 192.168.171.111 255.255.255.0 192.168.171.141
至此,完成了所有的配置过程,虚拟机的网卡和宿主机网卡连通完毕。可以按照之前介绍的方法,加载Ipv4相关的网络协议驱动,以备后续的实验。
5) 测试网络连接
从宿主机ping虚拟机,以及从虚拟机中ping宿主机,情况如下:
图4 Qemu虚拟机与宿主机的网络连接测试
用了两篇博客的篇幅,尝试了三类不同的UEFI网络的搭建方法。对平常的编程来说,可能用得最多的还是Nt32的模拟环境。
从下篇开始,尝试UEFI下的TCP和UDP编程。
UEFI开发探索50 – UEFI与网络2相关推荐
- UEFI开发探索99 – UEFI Shell下截屏工具
(请保留-> 作者: 罗冰 https://blog.csdn.net/luobing4365) UEFI Shell下截屏工具 1 PrintScreenLogger的代码结构 1)Print ...
- UEFI开发探索97 – EDK2模拟器搭建网络环境
(请保留-> 作者: 罗冰 https://blog.csdn.net/luobing4365) EDK2模拟器搭建网络环境 1 搭建EDK2开发环境 1)工具安装 2)下载代码库 3)更新子模 ...
- UEFI开发探索QA – 问题辑录(持续更新)
最近正在尝试在Unbutu16上搭建开发和调试环境,其中过程一言难尽,到现在也没完成到符合我要求的程度. 正是因为遇到障碍,我今天早上回到Win10+UDK2018的环境下,想重新编译下AppPkg, ...
- UEFI开发探索95 – 弹跳小游戏
(请保留-> 作者: 罗冰 https://blog.csdn.net/luobing4365) UEFI下的弹跳小游戏 1 Bounce游戏 1.1 游戏架构 1.2 移植和编写代码 1)编写 ...
- UEFI开发探索85- YIE002USB开发板(08 制作HID设备)
(请保留-> 作者: 罗冰 https://blog.csdn.net/luobing4365) YIE002USB开发板之制作HID设备-编程 1 YIE002-STM32的USB编程 2 调 ...
- UEFI开发探索02 – 环境搭建1
(请保留->作者:罗冰 ) 开发初期的目的就是做出可以在pci rom上跑的Oprom,当然是在uefi bios下.我的计划大致如下: 1 搭建完整的编译环境,了解使用哪些库进行编译: 2 我 ...
- UEFI开发探索94 – 迷宫小游戏
(请保留-> 作者: 罗冰 https://blog.csdn.net/luobing4365) UEFI下的迷宫小游戏 1 Maze程序结构分析 1)定义全局变量 2)设置迷宫 3) 游戏控制 ...
- UEFI开发探索100 – 《UEFI编程实践》发布啦
(请保留-> 作者: 罗冰 https://blog.csdn.net/luobing4365) <UEFI编程实践>发布 1 内容简介 第一部分 UEFI环境搭建及UEFI应用构建 ...
- UEFI开发探索81- YIE002USB开发板(04 制作HID设备)
(请保留-> 作者: 罗冰 https://blog.csdn.net/luobing4365) YIE002USB开发板之制作HID设备-USB系统概述 1 USB规范简介 2 软件工程师眼中 ...
- UEFI开发探索74- YIE002USB开发板(03 Windows编程)
(请保留-> 作者: 罗冰 https://blog.csdn.net/luobing4365) YIE002USB开发板之Windows编程 1 添加库文件 2 枚举HID设备 2.1 Set ...
最新文章
- python怎么避免浅拷贝_详谈Python中的深拷贝和浅拷贝
- 大话中文文本分类之fastText
- [原]Oracle数据文件损坏的模拟和修复(一) |ORA-01578 data block corrupted|
- 写 Python 爬虫 5 年,复制粘贴一直是我赖以生存的核心技能,直到我看到这些腾讯阿里大佬们的技术公众号,太强了...
- Bootstrap table 行编辑导航
- mysql5.5表的创建源码_mysql5.5 源码安装
- LeetCode 1382. 将二叉搜索树变平衡(中序遍历+二分递归)
- 计算机四级计算机组成与接口总结,计算机等级测验四级计算机组成与接口.docx...
- 我的三年研究生(CS)学习与工作经历(ZT)
- [HAOI2010]软件安装(树形背包,tarjan缩点)
- 计算机工程学院运动会方阵口号,运动会方阵口号(精选多篇)
- 八大排序算法总结以及python实现
- 15个顶级多线程面试题及答案
- java计算器功能_java实现简易计算器功能
- Android 手机锁屏解锁后Activity走了onDestroy
- MySQL学习宝典之最全的常用语法语句
- 公司给你调岗降薪,逼你主动辞职如何应对?
- excel矩阵小tips
- 在java中 以下关于集合框架_在Java中LinkedList类和ArrayList类同属于集合框架类,下列...
- 【建议收藏】数据结构和算法面试题
热门文章
- 互联网+时代的7个引爆点(读书笔记)
- 兰州理工大学计算机考研好考吗,兰州理工大学考研难吗
- Plist图集批量拆解工具大全
- Codeforces 1194D
- 熊出没机器人光头强_《熊出没》中的这个小细节你注意到了吗?光头强或许只是诱饵...
- 使用版本控制软件TortoiseSVN对程序和文档进行控制的说明
- 智能时代“无人区”的开拓者,国防科大智能科学学院推免生源大起底
- 1.42 财务测量指标——静态评价法(投资回报率+投资回收期)
- ORA-20011(外部表收集统计信息异常报错)
- python中空格怎么打_191012 python3关于空格打印、赋值、+=符号的小坑