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

请保留-> 【原文:  https://blog.csdn.net/luobing4365http://yiiyee.cn/blog/author/luobing/】

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。

1 在Nt32模拟器中使用网络

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

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

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

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

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

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模拟器中检查网络连接

2 真实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的网络协议栈开发网络应用了。

5,319 total views, 11 views today

《UEFI开发探索49 – UEFI与网络1》有2个想法

    1. 确实如此。看下edk2中关于网络的package,作者都说了,这不是完整的协议栈,不能用来做web后台之类的

匿名进行回复 取消回复

电子邮件地址不会被公开。