BIOS/UEFI基础——UEFI网络框架之概述
来源:互联网 发布:泉州会计网络继续教育 编辑:程序博客网 时间:2024/05/01 23:32
概述
UEFI中的网络框架大致如下:
其中最底下部分并不在UEFI代码中,它实际上代表的是网卡的驱动。它提供的接口可以与SNP对接。
而SNP是UEFI下操作网络的基本接口。
另外关于安全启动部分,在上图中也没有体现,它实际上讲也不属于网络栈的部分。
在edk2代码中,以下部分是属于网络的:
# # Network Support # MdeModulePkg/Universal/Network/SnpDxe/SnpDxe.inf MdeModulePkg/Universal/Network/DpcDxe/DpcDxe.inf MdeModulePkg/Universal/Network/MnpDxe/MnpDxe.inf MdeModulePkg/Universal/Network/VlanConfigDxe/VlanConfigDxe.inf MdeModulePkg/Universal/Network/ArpDxe/ArpDxe.inf MdeModulePkg/Universal/Network/Dhcp4Dxe/Dhcp4Dxe.inf MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Dxe.inf MdeModulePkg/Universal/Network/Mtftp4Dxe/Mtftp4Dxe.inf MdeModulePkg/Universal/Network/Udp4Dxe/Udp4Dxe.inf!if $(NETWORK_IP6_ENABLE) == TRUE NetworkPkg/Ip6Dxe/Ip6Dxe.inf NetworkPkg/TcpDxe/TcpDxe.inf NetworkPkg/Udp6Dxe/Udp6Dxe.inf NetworkPkg/Dhcp6Dxe/Dhcp6Dxe.inf NetworkPkg/Mtftp6Dxe/Mtftp6Dxe.inf NetworkPkg/UefiPxeBcDxe/UefiPxeBcDxe.inf!if $(SECURE_BOOT_ENABLE) == TRUE NetworkPkg/IScsiDxe/IScsiDxe.inf!else MdeModulePkg/Universal/Network/IScsiDxe/IScsiDxe.inf!endif!else MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dxe.inf MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxeBcDxe.inf MdeModulePkg/Universal/Network/IScsiDxe/IScsiDxe.inf!endif!if $(HTTP_BOOT_ENABLE) == TRUE NetworkPkg/DnsDxe/DnsDxe.inf NetworkPkg/HttpUtilitiesDxe/HttpUtilitiesDxe.inf NetworkPkg/HttpDxe/HttpDxe.inf NetworkPkg/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 # 增加一个虚拟网桥br0sudo brctl addif br0 eth0 # 在br0中添加一个接口eth0sudo 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的网络。
- BIOS/UEFI基础——UEFI网络框架之概述
- BIOS/UEFI基础——UEFI网络框架之UNDI
- BIOS/UEFI基础——UEFI网络框架之SNP
- BIOS/UEFI基础——UEFI网络框架之MNP
- BIOS/UEFI基础——UEFI网络框架之ARP
- BIOS/UEFI基础——UEFI网络框架之TCP4
- BIOS/UEFI基础——UEFI网络框架之MNP2
- BIOS/UEFI基础——UEFI网络框架之IP4
- BIOS/UEFI基础——UEFI网络框架之支撑模块DPC
- BIOS/UEFI基础——基础知识
- BIOS/UEFI基础——EDK
- BIOS/UEFI基础——EFI_HANDLE
- BIOS/UEFI基础——变量
- BIOS/UEFI基础——定时器
- BIOS/UEFI基础——DEBUG
- BIOS/UEFI基础——Device Path
- BIOS/UEFI基础——x86架构中断基础介绍
- BIOS/UEFI基础——第一条指令
- Android RecyclerView 使用完全解析 体验艺术般的控件
- Action类为何要 extends ActionSupport
- php脚本守护进程设计
- 浏览器链接打开App
- C#控制台基础 找到一个字符串中一个字符的所有索引值
- BIOS/UEFI基础——UEFI网络框架之概述
- [LeetCode] Search in Rotated Sorted Array
- 顺序表
- DOS命令大全
- UVA - 129 (字符串的相似问题)
- 飞机游戏初步
- opencv error bad argument (default classifier file not found)
- 如何看懂mysql explain
- mac终端向远程linux上传文件夹