概述

UEFI中的网络框架大致如下:

其中最底下部分并不在UEFI代码中,它实际上代表的是网卡的驱动。它提供的接口可以与SNP对接。

而SNP是UEFI下操作网络的基本接口。

另外关于安全启动部分,在上图中也没有体现,它实际上讲也不属于网络栈的部分。

在edk2代码中,以下部分是属于网络的:

  ## Network Support#MdeModulePkg/Universal/Network/SnpDxe/SnpDxe.infMdeModulePkg/Universal/Network/DpcDxe/DpcDxe.infMdeModulePkg/Universal/Network/MnpDxe/MnpDxe.infMdeModulePkg/Universal/Network/VlanConfigDxe/VlanConfigDxe.infMdeModulePkg/Universal/Network/ArpDxe/ArpDxe.infMdeModulePkg/Universal/Network/Dhcp4Dxe/Dhcp4Dxe.infMdeModulePkg/Universal/Network/Ip4Dxe/Ip4Dxe.infMdeModulePkg/Universal/Network/Mtftp4Dxe/Mtftp4Dxe.infMdeModulePkg/Universal/Network/Udp4Dxe/Udp4Dxe.inf
!if $(NETWORK_IP6_ENABLE) == TRUENetworkPkg/Ip6Dxe/Ip6Dxe.infNetworkPkg/TcpDxe/TcpDxe.infNetworkPkg/Udp6Dxe/Udp6Dxe.infNetworkPkg/Dhcp6Dxe/Dhcp6Dxe.infNetworkPkg/Mtftp6Dxe/Mtftp6Dxe.infNetworkPkg/UefiPxeBcDxe/UefiPxeBcDxe.inf
!if $(SECURE_BOOT_ENABLE) == TRUENetworkPkg/IScsiDxe/IScsiDxe.inf
!elseMdeModulePkg/Universal/Network/IScsiDxe/IScsiDxe.inf
!endif
!elseMdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dxe.infMdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxeBcDxe.infMdeModulePkg/Universal/Network/IScsiDxe/IScsiDxe.inf
!endif
!if $(HTTP_BOOT_ENABLE) == TRUENetworkPkg/DnsDxe/DnsDxe.infNetworkPkg/HttpUtilitiesDxe/HttpUtilitiesDxe.infNetworkPkg/HttpDxe/HttpDxe.infNetworkPkg/HttpBootDxe/HttpBootDxe.inf
!endif

其中分为IPv4和IPv6两个部分。

以上的协议,按照UEFI的说明来分,属于UEFI Driver Model。它们都是通过在DXE阶段安装类似如下的结构:

//
// Simple Network Protocol Driver Global Variables
//
EFI_DRIVER_BINDING_PROTOCOL gSimpleNetworkDriverBinding = {SimpleNetworkDriverSupported,SimpleNetworkDriverStart,SimpleNetworkDriverStop,0xa,NULL,NULL
};

并在BDS阶段执行判断(xxxSupported)和执行具体实现(xxxStart)。

这种结构称为Driver  Binding Protocol。

UEFI下的网络框架测试

后续的文章中会陆续介绍各个模块,如UNDI、SNP、MNP等等。

并且会使用OVMF来测试和验证各个UEFI网络模块。

关于OVMF的使用请参考OVMF基础

下面是在UEFI shell下查看到的网路模块:

上面的打印是通过UEFI shell下的drivers命令打出来的。

可以看到安装了关于网络的驱动。

另外通过ifconfig命令还可以看到:

QEMU已经为我们模拟出一张网卡了,这也可以通过pci命令看到:

BDF为00/03/00的就是一个网卡,进一步可以看到它是一个Intel的网卡(VendorId是8086h):

这个网卡是QEMU默认使用的网卡。

UEFI shell下可以对它进行配置,具体命令如下:

ifconfig -s eth0 static 192.168.1.200 255.255.255.0 192.168.1.1

-s用来指定端口,这里只有一个eth0,static表示静态IP配置,后面跟的就是IP、MASK和Gateway。

配置完成后如图所示:

之后就可以通过ping来进行网路测试,不过目前是ping不通主机的。

还需要在主机上配置QEMU,具体可以参考qemu虚拟机与外部网络的通信

这边直接写了如下的脚本(也是来自上面的文章):

#!/bin/bashsudo ifconfig eth0 down                  # 先关闭eth0接口
sudo brctl addbr br0                     # 增加一个虚拟网桥br0
sudo brctl addif br0 eth0                # 在br0中添加一个接口eth0
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 eth0 0.0.0.0 promisc up    # 打开eth0接口
sudo dhclient br0                        # 从dhcp服务器获得br0的IP地址
sudo brctl show br0                      # 查看虚拟网桥列表
sudo brctl showstp br0                   # 查看br0的各接口信息sudo tunctl -t tap0 -u root              # 创建一个tap0接口,只允许root用户访问
sudo brctl addif br0 tap0                # 在虚拟网桥中增加一个tap0接口
sudo ifconfig tap0 0.0.0.0 promisc up    # 打开tap0接口
sudo brctl showstp br0                   # 显示br0的各个接口

执行完这个脚本之后,再执行下面的命令:

qemu-system-x86_64 -serial stdio -bios OVMF.fd -net nic -net tap,ifname=tap0

等到QEMU启动之后,最后会进入到UEFI shell,配置好网卡之后,就可以使用ping命令了,如下图所示:

顺便附上主机端的网络配置:

UEFI shell下使用的ping的IP就是这里br0的IP。

br0是一个桥,它连同了eth0和tap0,eth0实际上就是主机的网口,而tap0可以看成是UEFI端的网口。

通过br0连接后两者就可以ping通了。

后续可以使用它来测试UEFI的网络。

【UEFI基础】UEFI网络框架之概述相关推荐

  1. 【UEFI基础】UEFI事件介绍

    简述 在[UEFI基础]System Table和Architecture Protocols介绍Boot Service时提到有一部分与事件相关的接口,它们创建.触发.等待和关闭事件,来完成某些功能 ...

  2. BIOS/UEFI基础——Protocol介绍

    简要说明 Protocol是UEFI中的一个重要概念(事实上<UEFI SPEC>中有超过70%的内容都是在讲Protocol),下面简单说明下: 1. 首先,非常重要的一点,Protoc ...

  3. python 网络框架twisted基础学习及详细讲解

    twisted网络框架的三个基础模块:Protocol, ProtocolFactory, Transport.这三个模块是构成twisted服务器端与客户端程序的基本. Protocol:Proto ...

  4. 【UEFI基础】Device Path

    什么是Device Path 没有在UEFI SPEC中找到一个非常清晰的Device Path的定义. 关于Device Path,UEFI SPEC中有如下的描述: A Device Path i ...

  5. 【UEFI基础】Shell下的命令(一)

    什么是UEFI Shell UEFI Shell是一种特殊对待UEFI_APPLICATION.提供用户和UEFI系统之间的一个接口.它有很强大的功能,但是正常启动计算机系统时,不会用到UEFI Sh ...

  6. 跨平台基础网络框架Mars初探

    前言 对于新派单通知.订单时效变更通知等需要及时反馈给用户的消息,目前点我达骑手的解决方案是定时轮询并通过http请求的方式主动从服务器获取变更,这种方式存在一定的缺陷,如http方式轮询流量消耗较高 ...

  7. 【UEFI基础】ACPI基础

    什么是ACPI 高级配置和电源管理接口(Advanced Configuration and Power Management Interface). ACPI是一套协议标准,软硬件都需实现以配合使用 ...

  8. UEFI——UEFI 基础服务

    文章目录 前言 BootService Table gBS EFI_BOOT_SERVICES SystemTable EFI_SYSTEM_TABLE SystemTable mBootServic ...

  9. 零基础学--Python网络框架Django1:jango的基本搭建和配置

    Django简介:Django 是一个高级的 Python 网络框架,可以快速开发安全和可维护的网站. 由经验丰富的开发者构建,Django负责处理网站开发中麻烦的部分,因此你可以专注于编写应用程序, ...

最新文章

  1. python selenium --调用js
  2. python 获取当前时间 时间差
  3. UIPasteboard 粘贴板
  4. 传递类型为参数的方法
  5. javascript 中的各种width,height属性整理
  6. python中输出n开始的5个奇数_送你99道Python经典练习题,练完直接上手做项目,免费送了来拿吧...
  7. Effective C++学习第八天
  8. input file 上传图片时,文件格式限制
  9. 转化率模型之转化数据延迟
  10. nbu WIN平台下面(mtx/robtest/tar/nt_ttu)手动测试driver是否正常
  11. 智能SQL优化工具--SQL Optimizer for SQL Server(帮助提升数据库应用程序性能,最大程度地自动优化你的SQL语句 )...
  12. 安装VisualSVN Server时候,端口号冲突
  13. 数据库范式那些事[转]
  14. 故障转移群集 SQLSERVER解决方案
  15. LP3667B反激式开关电源5W(5V1A)输出电路
  16. ABB全新机器人伺服驱动3HAB8101-1DSQC345A 3E031704 3E031712 3E031785 3E032016 3E032176 3E032455 3E034013
  17. 李开复给中国大学生的第五封信—你有选择的权利
  18. Windows自带的【远程桌面连接】操作方法及常见问题
  19. 胡阳pyhton作业题--20150801
  20. STM32CubeMX 创建CustomHID设备

热门文章

  1. JavaFX调用虚拟键盘
  2. 使用:js 中 url 传参
  3. MPC5748G笔记 PWM pwm_pal
  4. 大数据开发是做什么的?怎样入门?
  5. 6.824:FaRM笔记
  6. 区域和检索 - 数组不可变(前缀和)
  7. Unable to instantiate Action错误的解决
  8. 《用C#制作PDF文件全攻略》
  9. 计算机网络(六)——因特网中的电子邮件
  10. 爬虫学习笔记,从基础到部署。