如何知道UEFI Shell是以64位还是32位启动?

时间:2017-10-30 12:29:03

标签: uefi

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

请帮助我!

2 个答案:

答案 0 :(得分:0)

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

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

另一种方法是放入你的pendrive文件,如BOOTIA32和BOOTX64。被执行的人填充一些变量或在文件系统中写入一些指示当前体系结构的文件,然后给shell。

我会尝试寻找更好的方法(可能是一些没有解决方法的shell工具);如果我发现任何内容,我会在答案中添加。

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

smbiosview -t <structure_type>

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

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

答案 1 :(得分:0)

创建一个简单的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 ==

以及用法示例屏幕截图:

enter image description here