UEFI开发探索49 – UEFI与网络1

(请保留-> 作者: 罗冰   https://blog.csdn.net/luobing4365)

UEFI提供了非常完整的TCP/IP网络协议栈,开发人员甚至可以在UEFI上开发自己的Web服务器。其网络协议栈如图1所示:

图1 UEFI的网络协议栈

1) 数据链路层:

ARP(Address Resolution Protocol):地址转换协议,将IP地址转换为物理的MAC地址;
MNP(Managed Network Protocol):提供异步数据包的I/O操作;
UNDI(Universal Network Device Interface):通用网络设备接口;
SNP(Simple Network Protocol):初始化和关闭网络接口,将网络数据帧交给网络接口传输到目的地址,从网络接口接收数据帧;
DPC(Deferred Procedure Call): 延迟过程调用,它用来解决UEFI网络栈中的TPL锁死问题;

2) 网络层:

IP(Internet Protocol): 用于点兑点的主机间传输数据;

3) 传输层:

UDP(User Datagram Protocol): 提供无连接的、不可靠的数据报投递服务;
TCP(Transmission Control Protocol): 面向连接的、可靠的数据传输协议;

4) 应用层:

MTFTP(Multicast Trivial File Transfer Protocol): 多播小型文件传输协议;
DHCP(Dynamic Host Configuration Protocol):动态主机配置协议,提供发现网络启动服务器的服务;
PXE(PreBoot eXecution Environment): 预启动执行环境,用来发现网络启动设备、下载启动文件;
iSCSI(Internet Small Computer System Interface): 网络小型计算机系统接口,把原来用于本机的SCSI协议透过TCP/IP网络发送,是一种基于因特网和SCSI-3协议的存储技术;

对要开发的应用程序,主要使用TCP、UDP等传输层协议,以及MTFTP、DHCP等应用层协议。使用之前,需要先配置好网络测试环境。

我们使用的网络测试环境,可以分为三种:一种是TinaoCore提供的Nt32模拟环境;第二种是运行在计算机上真实的UEFI环境;第三种是使用虚拟机搭建,比较常见的是使用VirtualBox或Qemu。

在Nt32模拟器中使用网络

配置网络之前,请确保Nt32的模拟器已经编译好了,具体编译方法如下:

C:\MyWorkspace> build -p Nt32Pkg\Nt32Pkg.dsc -a IA32

对于UEFI下的网络配置,Github上有官方的参考文档,网址为:

https://github.com/tianocore/tianocore.github.io/wiki/Network-io

根据文档介绍,Nt32网络设置可以参考《UEFI Network Stack for EDK Getting Started Guide》。不过,这篇文章有点老了,有些细节不大一样,现简略说明如下。

1) 下载并安装Winpcap

Winpcap是一款用于网络抓包的专业软件,是一个免费、公共的网络访问系统。它能为win32应用程序提供访问网络底层的能力,在模拟器中,相当于网卡的驱动。下载地址为:

https://www.winpcap.org/default.htm。

2) 下载SnpNt32Io源码并编译

代码可以从github上下载:https://github.com/tianocore/edk2-NetNt32Io。在C盘下建立文件夹NetNt32Io,并将源代码拷贝进去。

下载Winpcap的开发包WpdPack,下载地址:https://www.winpcap.org/devel.htm。下载后将WpdPack的压缩文件解压,复制到C:\NetNt32Io目录下。

打开Visual Studio的命令行(与编译UEFI代码的命令行相同),进入到源码目录,输入如下命令:

C:\NetNt32Io> nmake TARGET=RELEASE

NetNt32Io文件夹中会自动生成目录Release_IA32,将此目录下的SnpNt32Io.dll拷贝到UEFI模拟器的根目录下。

C:\NetNt32Io>copy /y c:\NetNt32IoRelease_IA32\SnpNt32Io.dll
c:\MyWorkspace\Build\NT32IA32\DEBUG_VS2015x86\IA32\

3) 启动Nt32模拟器。启动的方法很多,我比较习惯的是直接在目录下点击SecMain.exe执行文件,启动模拟器。

4) 进入UEFI Shell,加载网络协议。

Shell> fs0:
FS0:\> load SnpNt32Dxe.efi MnpDxe.efi ArpDxe.efi Ip4Dxe.efi VlanConfigDxe.efi Udp4Dxe.efi Dhcp4Dxe.efi Mtftp4Dxe.efi Tcp4Dxe.efi

5) 配置网卡

我所工作的环境是通过dhcp动态分配IP地址的,使用ifconfig命令设置:

FS0:\>ifconfig -s eth0 dhcp

也可通过以下命令设置为静态IP地址:

FS0:\>ifconfig -s eth0 static 192.168.1.188 255.255.255.0 192.168.1.1

也即设置静态的IP地址,子网掩码和网关的IP地址。当然,读者也可根据自己的网络情况自由配置,包括dns地址在内都可以指定,具体的用法可通过命令“ifconfig -? -b”查找。 IP地址是否分配成功,可通过命令“ifconfig -l eth0”查看。

图2 查看IP地址配置

6) 测试网络连接

通过ping命令可以测试网络连接情况,截图如下:

图3 Nt32模拟器中检查网络连接

真实UEFI环境下使用网络

在真实UEFI环境下使用网络,主要是加载网卡驱动和网络协议。我在几台机器上做了实验,有些环境的BIOS可能有问题,没有配置成功。以下的实验是在Intel的NUC6CAYH上完成的。

1) 下载UEFI下的网卡驱动

可在Intel的网站上,如下地址下载:
https://downloadcenter.intel.com/download/29137/Ethernet-Intel-Ethernet-Connections-Boot-Utility-Preboot-Images-and-EFI-Drivers

我下载的是PREBOOT.exe,版本为25.0。安装后(最好不要安装在C盘,直接安装在桌面上较好,用完删除即可),在目录/APPS/EIF/EFIx64中有相应的驱动。

驱动按照EnnnnXm的形式命名,nnnn为版本号,m分别指不同的网卡类型。比如,E9112X3.EFI表示PCI-E的千兆网口驱动,E7512X4.EFI表示10Gbit/s网口驱动。

我的实验平台需要的驱动是E9112X3.EFI,将其拷贝到UEFI启动盘中,准备接下来的实验。

2) 编译x64的网络协议驱动

EDK的网络协议驱动,Ipv4的源码在MdeModulePkg中,Ipv6的源码在NetworkPkg下。我们目前主要针对Ipv4进行实验,所以需要编译MdeModulePkg。Ipv6的操作差不多,就不重复说明了。

打开Visual Studio的命令行,按如下步骤进行编译:

C:\MyWorkspace> edksetup.bat;
C:\MyWorkspace> build -p MdeModulePkg\MdeModulePkg.dsc -a X64

编译完成后,在目录C:\MyWorkspace\Build\MdeModule\DEBUG_VS2015x86\X64中,将以下驱动拷贝到UEFI启动盘中:SnpDxe.efi,MnpDxe.efi, ArpDxe.efi, Ip4Dxe.efi ,VlanConfigDxe.efi ,Udp4Dxe.efi ,Dhcp4Dxe.efi ,Mtftp4Dxe.efi Tcp4Dxe.efi。

3) 加载网卡驱动和网络协议的驱动。

使用UEFI启动盘,进入UEFI shell测试环境。

Shell>fs0:
fs0:>load E9112X3.EFI
fs0:> load SnpDxe.efi MnpDxe.efi ArpDxe.efi Ip4Dxe.efi VlanConfigDxe.efi Udp4Dxe.efi Dhcp4Dxe.efi Mtftp4Dxe.efi Tcp4Dxe.efi

4) 配置网卡。

使用ifconfig命令设置:

fs0:\>ifconfig -s eth0 dhcp

这个步骤和上一节中Nt32模拟器配置网络的步骤5一样,相关的命令可以参考上节。

5) 测试网卡。

通过Ping命令测试网卡,如下图所示:

图4 真实UEFI环境中检查网络连接

至此,网络的测试环境搭建完毕,可以利用UEFI的网络协议栈开发网络应用了。

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 12
    评论
从BIOS到UEFI,是计算机引导程序的演进过程。 BIOS是基本输入输出系统(Basic Input/Output System)的简称,它是一组固化在计算机主板上的固件程序。BIOS的主要功能是在计算机开机时对硬件进行初始化,并将控制权转移给操作系统。然而,随着计算机硬件的不断进化和操作系统的更新,BIOS逐渐暴露出了一些局限性,比如启动速度较慢、内存限制等。 为了克服这些问题,UEFI(统一可扩展固件接口)应运而生。UEFI是一种现代的计算机固件接口规范,它取代了传统的BIOS。与BIOS相比,UEFI具有更多的优势。首先,UEFI支持更大的硬盘驱动器,允许操作系统和应用程序访问更多的存储空间。其次,UEFI还支持更加丰富和灵活的图形界面,使用户能够更方便地进行设置和操作。此外,UEFI还引入了许多新的功能,如网络启动、安全启动等,增强了计算机的性能和安全性。 从开发角度来看,BIOS和UEFI开发也有所不同。对于BIOS而言,开发人员主要需要熟悉硬件架构和编程语言,如汇编语言,以实现硬件初始化和操作系统加载。而对于UEFI开发人员则需要掌握C语言和面向对象编程,因为UEFI基于C语言进行开发,并且引入了面向对象的编程理念。此外,UEFI还需要开发和维护固件升级机制以及兼容性测试,以确保固件的稳定性和功能完整性。 总之,从BIOS到UEFI的发展是计算机引导程序的演进过程。UEFI作为一种现代的固件接口规范,解决了传统BIOS存在的一些问题,并且具备更多的扩展性和功能。从开发角度来看,UEFI需要掌握不同的编程语言和技术,以实现固件的开发和维护。
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

luobing4365

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值