PCI Option ROM in BIOS

本文介绍了在UEFI环境中如何处理Legacy设备上的OpRom。主要内容包括:如何在BIOS中包含OpRom,如何定位和读取OpRom,以及如何查看其内存内容。适合对UEFI及Legacy支持感兴趣的读者。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 虽然UEFI 出来十几年了,但是legacy 的阴影一直笼罩着我们。今天我们来看看Legacy里面的一个老朋友OpRom。以前很多PCI 设备上面都外挂一颗Rom,用来实现一些特定的功能,比如网络启动,硬盘保护,远程管理等等。后面比较常见的就只有网卡和显卡这两种设备还在用OpRom,独立的板卡有自己的板载Rom IC,板载的为了节约成本,就把OpRom包到BIOS里面。此外,OpRom也可以独立存在并执行。    我们今天打算介绍一下下面几个主题:在BIOS里面包一个OpRom。在启动过程中找到这个OpRom。在内存里面查看这个OpRom的内容。如何在BIOS里面包一个OpRom?如下,在OvmfPkgX64.fdf里面[FV.DXEFV]段加入下面的代码即可。

FILE FREEFORM = 1845d593-26a0-4805-a014-2e294fef14ee {
    SECTION RAW = OvmfPkg/LegacyRom/rtegrom.lom
    SECTION UI = "RealtekPXE"
  }如何找到这个OpRom?如下,遍历firmware volumes根据GUID找到这个OpRom的位置。

STATICEFI_STATUSEFIAPICHHGetOpRom (  OUT VOID  **RomImage,  OUT UINTN *RomSize  ){  EFI_STATUS                    Status;  UINTN                         HandleCount;  EFI_HANDLE                    *HandleBuffer;  UINTN                         Index;  EFI_FIRMWARE_VOLUME2_PROTOCOL *FirmwareVolume;  UINT32                        AuthenticationStatus;  VOID                          *LocalRomImage;  UINTN                         LocalRomSize;   EFI_GUID gRealtekPXEOpRomGUID  = { 0x1845d593, 0x26a0, 0x4805, { 0xA0, 0x14, 0x2E, 0x29, 0x4F, 0xEF, 0x14, 0xEE } };  //GUID in OvmfPkgX64.fdf 1845d593-26a0-4805-a014-2e294fef14ee  // Get the list of available firmware volumes  //  Status = gBS->LocateHandleBuffer (                  ByProtocol,                  &gEfiFirmwareVolume2ProtocolGuid,                  NULL,                  &HandleCount,                  &HandleBuffer                  );  if (EFI_ERROR (Status) || HandleCount == 0) {    return EFI_NOT_FOUND;  }    //    // Loop through the Firmware Volumes looking for the Easton 815 Video ROM image    //    for (Index = 0; Index < HandleCount; Index++) {      //      // Get the Firmware Volume Protocol      //      Status = gBS->HandleProtocol (                      HandleBuffer[Index],                      &gEfiFirmwareVolume2ProtocolGuid,                      (VOID **) &FirmwareVolume                      );      if (EFI_ERROR (Status)) {        continue;      }      //      // Get the 16-bit BIOS code from the same Firmware Volume as this driver      //      LocalRomImage = NULL;      LocalRomSize  = 0;      Status = FirmwareVolume->ReadSection (                                 FirmwareVolume,                                 &gRealtekPXEOpRomGUID,                                 EFI_SECTION_RAW,                                 0,                                 &LocalRomImage,                                 &LocalRomSize,                                 &AuthenticationStatus                                 );      if (EFI_ERROR (Status)) {        continue;      }       DEBUG ((EFI_D_INFO, "Charles RomImage = 0x%X ;RomSize = 0x%X ;\n",LocalRomImage,LocalRomSize));      *RomImage = LocalRomImage;      *RomSize  = LocalRomSize;       FreePool (HandleBuffer);       return EFI_SUCCESS;    }   FreePool (HandleBuffer);   return EFI_NOT_FOUND;}
--------------------- 
作者:longsonssss 
来源:CSDN 
原文:https://blog.csdn.net/longsonssss/article/details/80499170 
版权声明:本文为博主原创文章,转载请附上博文链接!

;如何在内存里面查看这个OpRom的内容?根据上面丢出来的OpRom的地址,在内存对应位置查看,可以看到OpRom signature "55AA":

如何执行这个OpRom?
--------------------- 
作者:longsonssss 
来源:CSDN 
原文:https://blog.csdn.net/longsonssss/article/details/80499170 
版权声明:本文为博主原创文章,转载请附上博文链接!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值