@
yihy8023 RtkUndiDxe.efi 是 uefi 的 DXE 驱动,我是想把从 RtkUndiDxe.efi 提取出来的 RtkUndiDxe.rom 刷入网卡,这个 rom 就类似 ipxe 项目的 virtio 网卡的 rom:
d@develop:~$ rom-parser /usr/share/ipxe/qemu/efi-virtio.rom
Valid ROM signature found @
0h, PCIR offset 1ch
PCIR: type 0 (x86 PC-AT), vendor: 1af4, device: 1000, class: 020000
PCIR: revision 3, vendor revision: 1
Valid ROM signature found @
17400h, PCIR offset 1ch
PCIR: type 3 (EFI), vendor: 1af4, device: 1000, class: 000000
PCIR: revision 0, vendor revision: 0
EFI: Signature Valid, Subsystem: Boot, Machine: X64
Last image
d@develop:~$
efi-virtio.rom 这给是 qemu 源码中写死的默认会加载的 vritio 网卡的 rom:
d@f42c:~/src/qemu$ grep -C 3 efi-virtio.rom master/hw/virtio/virtio-net-pci.c
PCIDeviceClass *k = PCI_DEVICE_CLASS(klass);
VirtioPCIClass *vpciklass = VIRTIO_PCI_CLASS(klass);
k->romfile = "efi-virtio.rom";
k->vendor_id = PCI_VENDOR_ID_REDHAT_QUMRANET;
k->device_id = PCI_DEVICE_ID_VIRTIO_NET;
k->revision = VIRTIO_PCI_ABI_VERSION;
d@f42c:~/src/qemu$
在 libvirt 中还能通过<rom file=''/>这段配置来指定别的 rom 文件。
并不是所有 .efi 结尾的文件都是 uefi 启动用的,设备的 DXE 驱动也是 .efi 结尾的,比如 UEFI 的串口设备驱动名字叫作 PciSioSerialDxe.efi 和 TerminalDxe.efi (这两个要自己编译 edk2 的 MdeModulePkg 模块得到),加载这两个就能在 UEFI Shell 中获得串口控制台。