【问题标题】:Starting image from memory从内存开始图像
【发布时间】:2020-06-29 15:11:22
【问题描述】:

我在从内存加载和启动图像时遇到问题。 这是代码:

    UINT8 *Buffer;
    
    typedef struct
    {
        MEMMAP_DEVICE_PATH Node1;
        EFI_DEVICE_PATH_PROTOCOL End;
    } MEMORY_DEVICE_PATH;
    
    STATIC CONST MEMORY_DEVICE_PATH mMemoryDevicePathTemplate =
        {
            {
                {
                    HARDWARE_DEVICE_PATH,
                    HW_MEMMAP_DP,
                    {
                        (UINT8)(sizeof(MEMMAP_DEVICE_PATH)),
                        (UINT8)((sizeof(MEMMAP_DEVICE_PATH)) >> 8),
                    },
                }, // Header
                0, // StartingAddress (set at runtime)
                0  // EndingAddress   (set at runtime)
            },     // Node1
            {
                END_DEVICE_PATH_TYPE,
                END_ENTIRE_DEVICE_PATH_SUBTYPE,
                {sizeof(EFI_DEVICE_PATH_PROTOCOL), 0}} // End
    };
    
    MEMORY_DEVICE_PATH BufferDevicePath = mMemoryDevicePathTemplate;

    BufferDevicePath.Node1.StartingAddress = (EFI_PHYSICAL_ADDRESS)(UINTN)Buffer;
    BufferDevicePath.Node1.EndingAddress = (EFI_PHYSICAL_ADDRESS)(UINTN)Buffer + BufferSize;

    Prnt("Loading Image...");
    Status = gBS->LoadImage(
        TRUE,
        gImageHandle,
        (EFI_DEVICE_PATH *)&BufferDevicePath,
        Buffer,
        BufferSize,
        &ImageHandle);
    if (!EFI_ERROR(Status))
    {
            Status = gBS->StartImage (ImageHandle, NULL, NULL);
            if (EFI_ERROR(Status))
            {
                Prnt("Error Starting image ... Status=%08x", Status);
            }
    } 
    else {
          Prnt("Error Loading image ... Status=%08x", Status);
    }

通过 UEFI Shell 使用 load 加载(而不是从内存中)图像,验证该图像没有问题。 但是在这种情况下没有错误,图像似乎已启动但机器卡住了,左上角出现黑屏和白色光标。

【问题讨论】:

    标签: c uefi


    【解决方案1】:

    您忘记了 MEMMAP_DEVICE_PATH 结构中的 MemoryType 字段。

    ///
    /// Memory Mapped Device Path.
    ///
    typedef struct {
      EFI_DEVICE_PATH_PROTOCOL        Header;
      ///
      /// EFI_MEMORY_TYPE
      ///
      UINT32                          MemoryType;
      ///
      /// Starting Memory Address.
      ///
      EFI_PHYSICAL_ADDRESS            StartingAddress;
      ///
      /// Ending Memory Address.
      ///
      EFI_PHYSICAL_ADDRESS            EndingAddress;
    } MEMMAP_DEVICE_PATH;
    

    使用您的代码将其设置为 0 (EfiReservedMemoryType),将其设置为 1 (EfiLoaderCode)。

    顺便说一句,有一个similar question,也许那里的解决方案也可以帮助你。

    【讨论】:

    • 我按照你的建议改了,还把{sizeof(EFI_DEVICE_PATH_PROTOCOL), 0}} // End`改成了{(UINT8)sizeof(EFI_DEVICE_PATH), (UINT8)(sizeof(EFI_DEVICE_PATH)>> 8)}} // End,还是卡住了。
    • 您能否分享一个完整的程序来重现您的问题,尤其是您将其他程序加载到内存中的部分?
    • 您的解决方案有效,我在开始时遇到了问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-28
    相关资源
    最近更新 更多