请保留-> 【原文: https://blog.csdn.net/luobing4365 和 http://yiiyee.cn/blog/author/luobing/】
UEFI提供了非常完整的TCP/IP网络协议栈,开发人员甚至可以在UEFI上开发自己的Web服务器。其网络协议栈如图1所示:
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”查看。
6) 测试网络连接
通过ping命令可以测试网络连接情况,截图如下:
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命令测试网卡,如下图所示:
至此,网络的测试环境搭建完毕,可以利用UEFI的网络协议栈开发网络应用了。
6,580 total views, 8 views today
真实环境要复杂多倍,而且不是每个协议都能load上去。我有些设备 死活load MnpDxe.efi 出问题
确实如此。看下edk2中关于网络的package,作者都说了,这不是完整的协议栈,不能用来做web后台之类的