【发布时间】:2020-06-04 14:28:47
【问题描述】:
我打算在 startup.nsh 中编写一个脚本来处理 32 位和 64 位上的不同任务。但我不知道如何检索这些信息。
请帮帮我!
【问题讨论】:
标签: uefi
我打算在 startup.nsh 中编写一个脚本来处理 32 位和 64 位上的不同任务。但我不知道如何检索这些信息。
请帮帮我!
【问题讨论】:
标签: uefi
如果您打算在 .nsh 中编写内容,一种快速验证的方法是在文件系统上放置 2 个虚拟 .efi 程序,一个编译为 IA32,另一个编译为 X64。
然后您尝试从 .nsh 脚本运行这两个程序。正确运行的人会告诉您系统的架构。
另一种方法是放入您的随身碟文件,如 BOOTIA32 和 BOOTX64。被执行者填充一些变量或在文件系统中写入一些文件以指示当前架构,然后将位置让给 shell。
我会尝试寻找更好的方法(也许是一些没有解决方法的 shell 工具);如果我发现任何东西,我会添加到我的答案中。
更新:您还可以使用 UEFI Shell 中的 smbiosview 实用程序。您可以通过以下方式搜索特定的结构类型:
smbiosview -t <structure_type>
您可以尝试检查以下结构类型:
【讨论】:
创建一个简单的 EFI 字节码应用程序:
此类应用程序的汇编代码可能类似于:
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==
及用法示例截图:
【讨论】: