【问题标题】:How to know if UEFI Shell is booting in 64-bit or 32-bit?如何知道 UEFI Shell 是以 64 位还是 32 位启动?
【发布时间】:2020-06-04 14:28:47
【问题描述】:

我打算在 startup.nsh 中编写一个脚本来处理 32 位和 64 位上的不同任务。但我不知道如何检索这些信息。

请帮帮我!

【问题讨论】:

    标签: uefi


    【解决方案1】:

    如果您打算在 .nsh 中编写内容,一种快速验证的方法是在文件系统上放置 2 个虚拟 .efi 程序,一个编译为 IA32,另一个编译为 X64。

    然后您尝试从 .nsh 脚本运行这两个程序。正确运行的人会告诉您系统的架构。

    另一种方法是放入您的随身碟文件,如 BOOTIA32 和 BOOTX64。被执行者填充一些变量或在文件系统中写入一些文件以指示当前架构,然后将位置让给 shell。

    我会尝试寻找更好的方法(也许是一些没有解决方法的 shell 工具);如果我发现任何东西,我会添加到我的答案中。

    更新:您还可以使用 UEFI Shell 中的 smbiosview 实用程序。您可以通过以下方式搜索特定的结构类型:

    smbiosview -t <structure_type>
    

    您可以尝试检查以下结构类型:

    • 4(处理器信息):可以检索诸如“支持 64 位的处理器”之类的信息
    • 18(32 位错误信息):关于 32 位的信息
    • 33(64 位错误信息):有关 64 位的信息(如果支持)

    【讨论】:

    • 拥有 64 位 CPU 意味着您的固件可能是 64 位的。但这并不意味着它是。查询这两个“内存错误”结构不会在我的平板电脑上返回任何内容。
    【解决方案2】:

    创建一个简单的 EFI 字节码应用程序:

    1. 使用无效参数调用某些接口函数
    2. 检查返回的状态码(第 31 位设置 = IA32;第 63 位设置 = x64 等)
    3. 以相应的状态码退出(例如 1 = IA32、2 = x64 等)

    此类应用程序的汇编代码可能类似于:

          movnw r1, @r0(+1, +16)
          movnw r2, @r0(+0, +16)
          xor32 r3, r3
          pushn r3
          pushn r3
          pushn r3
          movnw r1, @r1(EFI_SYSTEM_TABLE.BootServices)
          callex @r1(EFI_BOOT_SERVICES.AllocatePool)
          movn r7, r7
          movib @r0, 0x32
          cmpi32eq r7, 0x80000002
          jmpcs @f
          movib @r0, 0x64
        @@:
          pushn r2
          callex @r1(EFI_BOOT_SERVICES.Exit)
    

    这是 Base64 编码的应用程序二进制文件本身

    TVoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAFBFAAC8DgIAAAAAAAAAAAAAAAAAcAAiAAsCAQBAAAAAAAAAAAAAAAAgAQAAIAEAAAAAAAEAAAAAIAAAACAAAAABAAAAAQAAAAEAAAAAAAAAYAEAACABAAAAAAAACgAAAAAAEAAAAAAAABAAAAAAAAAAABAAAAAAAAAQAAAAAAAAAAAAAAAAAAAudGV4dAAAADQAAAAgAQAAQAAAACABAAAAAAAAAAAAAAAAAAAgAABgLmRhdGEAAAAAAAAAYAEAAAAAAABgAQAAAAAAAAAAAAAAAAAAIAAAYAAAAAAAAAAAcoFBEHKCEAAWMzUDNQM1A3KRiSGDKYUBABAyd3cIMgCtBwIAAIDCAncIZAA1AoMpGBgAIAAAAAAAAAAAAAAAAA==

    及用法示例截图:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-22
      • 2013-08-08
      相关资源
      最近更新 更多