You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

自研x86_64 UEFI应用在真实硬件死机,QEMU OVMF运行正常

x86_64 UEFI操作系统真实硬件启动黑屏无响应问题

此问题与某传统BIOS引导加载问题相关,但本次针对x86_64 UEFI架构。

我们正在基于UEFI开发x86_64架构的操作系统,发现该系统在QEMU的OVMF固件中可正常启动,但在四款真实硬件(联想Thinkpad、System76笔记本、Steam Deck、一款x86单板计算机)上均出现黑屏无响应的永久死机情况。更糟的是,在入口点最前端添加代码(触发异常、写入ConOut、写入串口)试图输出信息后,结果仍是无响应死机,这表明真实硬件可能根本未加载镜像,或跳转到了错误地址。

因特定原因,我们自研代码生成PE镜像(未使用标准C工具),无法分享该代码,但可提供EFI头文件及第一阶段引导加载程序:

00000000  4d 5a 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |MZ..............|
00000010  b8 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000020  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000030  00 00 00 00 00 00 00 00  00 00 00 00 80 00 00 00  |................|
00000040  0e 1f ba 0e 00 b4 09 cd  21 b8 01 4c cd 21 54 68  |........!..L.!Th|
00000050  69 73 20 70 72 6f 67 72  61 6d 20 63 61 6e 6e 6f  |is program canno|
00000060  74 20 62 65 20 72 75 6e  20 69 6e 20 44 4f 53 20  |t be run in DOS |
00000070  6d 6f 64 65 2e 0d 0d 0a  24 00 00 00 00 00 00 00  |mode....$.......|
00000080  50 45 00 00 64 86 03 00  00 00 00 00 00 00 00 00  |PE..d...........|
00000090  00 00 00 00 70 00 06 02  0b 02 02 26 00 10 00 00  |....p......&....|
000000a0  00 d0 16 00 00 00 00 00  00 10 00 00 00 10 00 00  |................|
000000b0  00 00 00 00 00 00 00 00  00 10 00 00 00 10 00 00  |................|
000000c0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
000000d0  00 f0 16 00 00 10 00 00  00 00 00 00 0a 00 00 00  |................|
000000e0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00000110  00 10 00 00 00 10 00 00  00 10 00 00 00 10 00 00  |................|
00000120  00 00 00 00 00 00 00 00  00 00 00 00 20 00 00 60  |............ ..`|
00000130  00 00 00 00 00 00 00 00  00 80 11 00 00 20 00 00  |............. ..|
00000140  00 80 11 00 00 20 00 00  00 00 00 00 00 00 00 00  |..... ..........|
00000150  00 00 00 00 40 00 00 c0  00 00 00 00 00 00 00 00  |....@...........|
00000160  00 50 05 00 00 a0 11 00  00 50 05 00 00 a0 11 00  |.P.......P......|
00000170  00 00 00 00 00 00 00 00  00 00 00 00 40 00 00 c0  |............@...|
00000180  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00001000  51 52 48 89 e5 48 89 d3  48 c7 c2 54 00 21 00 52  |QRH..H..H..T.!.R|
00001010  48 ba 53 00 54 00 41 00  52 00 52 48 89 e2 48 83  |H.S.T.A.R.RH..H.|
00001020  ec 40 48 8b 4b 40 ff 51  08 48 89 ec 48 89 da 48  |.@H.K@.Q.H..H..H|
00001030  8b 42 60 68 01 00 00 00  59 89 ca 68 98 01 00 00  |.B`h....Y..h....|
00001040  41 58 68 00 00 00 01 49  89 e1 48 83 ec 48 ff 50  |AXh....I..H..H.P|
00001050  28 48 83 c4 48 5f 81 c7  00 00 08 00 57 68 00 80  |(H..H_......Wh..|
00001060  11 00 59 48 8d 35 96 0f  00 00 f3 a4 5f 48 8d 35  |..YH.5......_H.5|
00001070  8c 8f 11 00 68 7f 53 01  00 59 ad 01 3c 07 e2 fa  |....h.S..Y..<...|
00001080  5a 5e 89 fc 8b 07 50 c3  00 00 00 00 00 00 00 00  |Z^....P.........|
00001090  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|

(0x1000处代码段的反汇编,功能为打印信息,然后将另外两个段复制到新分配的内存页并跳转至其中一个):

push rcx ; rcx contains EFI handle
push rdx ; rdx contains System Table
mov rbp, rsp
mov rbx, rdx
mov rdx, 0x210054 ; push L"T!"
push rdx
movabs rdx, 0x52004100540053 ; push L"STAR"
push rdx
mov rdx, rsp
sub rsp, 0x40
mov rcx, qword ptr [rbx + 0x40] ; ConOut
call qword ptr [rcx + 8] ; StringOutput
mov rsp, rbp
mov rdx, rbx
mov rax, qword ptr [rdx + 0x60] ; BootServices
push 1
pop rcx
mov edx, ecx
push 0x198
pop r8
push 0x1000000
mov r9, rsp
sub rsp, 0x48
call qword ptr [rax + 0x28] ; AllocatePages
add rsp, 0x48
pop rdi
add edi, 0x80000
push rdi
push 0x118000
pop rcx
lea rsi, qword ptr [rip + 0xf96] ; pointer to first section
rep movsb byte ptr es:[rdi], byte ptr [rsi]
pop rdi
lea rsi, qword ptr [rip + 0x118f8c] ; pointer to second section
push 0x1537f
pop rcx
lodsd eax, dword ptr [rsi]
add dword ptr [rdi + rax], edi
loop 0x1007a
pop rdx
pop rsi
mov esp, edi
mov eax, dword ptr [rdi]
push rax
ret 

我已通过PE-Bear工具对比Limine、EFI Shell等已知正常的EFI文件验证正确性,也尝试在EFI Shell中运行该程序、使用Intel管理引擎排查,但结果一致:QEMU中正常,真实硬件上黑屏死机。

补充:看门狗定时器无效——真实硬件10分钟后仍处于死机状态;Ctrl+Alt+Del也无法恢复,必须强制断电重启。

编辑1:修改了EFI函数调用的影子寄存器空间,解决了QEMU中的部分问题,但真实硬件上情况依旧。已更新上述转储和反汇编内容。


内容的提问来源于stack exchange,提问作者TheHans255

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 08:59:50