答案1
根据我的经验,这种随机崩溃几乎总是内存故障。在评论中,有人建议运行 memtest,但最近在我的客户群中至少有几个案例,memtest 没有发现任何错误,但更换内存解决了问题。我强烈建议更换内存;这要花几百美元,但很有可能解决你遇到的问题。
答案2
我有一个答案,并分享这个答案,以便其他可能遇到同样问题的人受益
感谢转储。我现在同意,我已经看过它们,坏的 RAM 是最可能的原因,我将在稍后详细解释为什么会这样。我首先想回答你关于“IRQ 问题”的问题,因为你似乎很感兴趣?
我认为您指的是 0xA 错误检查 - IRQL_NOT_LESS_OR_EQUAL BSOD?这告诉您在提升的 IRQL 下运行时发生了页面错误。这是不允许的。IRQL(中断请求级别)是在处理器(硬件)级别使用的中断优先级机制。它定义了处理器可以接受的中断范围。最低级别(接受所有中断)是 NORMAL 级别(IRQL 0),任何高于该级别的 IRQL 称为“提升的 IRQL”。最常用的提升 IRQL 是 DISPATCH_LEVEL(IRQL 2)。处理器在 IRQL 2 下无法执行的操作之一是对分页文件的 I/O,因此不允许出现页面错误。在提升的 IRQL 下运行的驱动程序在非分页池中分配存储以避免这种可能性。
您可以在此 0xA 转储中看到 IRQL 级别为 2(参数 2),并且在堆栈跟踪(从下往上读取)中,您可以看到页面错误。这就是导致此 BSOD 的原因.... 代码:
STACK_TEXT:
fffff183`09aca468 fffff800`35a11729 : 00000000`0000000a 00000000`00000d4c 00000000`00000002 00000000`00000000 : nt!KeBugCheckEx
fffff183`09aca470 fffff800`35a0d2e3 : ffff9280`00000000 00000000`00000008 00000000`0000ffff 00000000`00000000 : nt!KiBugCheckDispatch+0x69
fffff183`09aca5b0 fffff800`358f6346 : 00000000`00000000 ffffb50d`d2ea1508 00000000`00000000 fffff183`09aca801 : nt!KiPageFault+0x463
fffff183`09aca740 fffff800`35a2fe4b : fffff183`0000002f fffff800`00000000 00000000`00000001 ffffb50d`d2ea11c0 : nt!KeAbPreWait+0x6
fffff183`09aca770 fffff800`35948262 : ffffb50d`d2ea1508 00000000`00000010 00000000`00000001 fffff800`35cfd700 : nt!KeWaitForSingleObject+0x1eff7b
fffff183`09aca860 fffff800`35cfd738 : ffffffff`ffffffff 00000000`00000001 ffffb50d`d23808f0 00000000`00000000 : nt!AlpcpWaitForSingleObject+0x3e
fffff183`09aca8a0 fffff800`35c18955 : ffffffff`00000001 00000000`00000000 ffffb50d`d23808f0 ffffb50d`d23808f0 : nt!AlpcpCompleteDeferSignalRequestAndWait+0x3c
fffff183`09aca8e0 fffff800`35c1b6af : 00000183`165eff1c 00000000`00000001 fffff183`09aca990 fffff183`09aca988 : nt!AlpcpReceiveMessagePort+0x265
fffff183`09aca950 fffff800`35c1b4fb : fffff183`09acaa30 00000183`165eff1c fffff183`09aca990 00000000`00000000 : nt!AlpcpReceiveLegacyMessage+0x11f
fffff183`09aca9f0 fffff800`35a10ef8 : ffffb50d`d2ea1080 00000018`131ff828 fffff183`09acaaa8 00000000`00000000 : nt!NtReplyWaitReceivePortEx+0xcb
fffff183`09acaa90 00007ff8`9942d544 : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : nt!KiSystemServiceCopyEnd+0x28
00000018`131ff808 00000000`00000000 : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : 0x00007ff8`9942d544
发生页面错误是因为包含引用的虚拟地址的页面不在 RAM 中。这可能是因为它从未分配,因为它被调出,因为引用的地址错误(填充指针),或者因为 RAM 损坏。
前三个原因是相当常见的第三方驱动程序问题,只有第四个是硬件问题。这就是为什么这个特定 BSOD 的原因几乎总是第三方驱动程序。通常我们会在导致错误检查的调用堆栈上看到驱动程序 - 但在这里我们没有。根本没有引用第三方驱动程序,所有函数调用都是内核调用(nt!......)。这意味着,鉴于我们在此转储中看到的情况,更可能是 RAM 损坏。
另外两个转储是 0x1A - MEMORY_MANAGEMENT 和 0xBE - ATTEMPTED_WRITE_TO_READONLY_MEMORY。
0x1A 的参数 1 值为 8886,这表示待机列表中原本应具有相同页面优先级值的两个页面的页面优先级值并不相同。不同的值在参数 4 中捕获。最可能的原因是 RAM 页面损坏。
0xBE 转储在导致错误检查的调用堆栈上也没有第三方驱动程序...代码:
0:kd>knL
Child-SP ReAddr 调用站点
00 fffff802 48c74448 fffff802
43a7a1e8 nt!KeBugCheckEx 01 fffff802 48c74450 fffff802
4382474f nt!MiRaisedIrqlFault+0x141740 02 fffff802 48c744a0 fffff802
43a0d1d8 nt!MmAccessFault+0x4ef 03 fffff802 4383ceb6 nt 48c74640 fffff802
!KiPageFault+0x358 04 fffff802 48c747d0 fffff802
438c2086 nt!KiTryUnwaitThread+0x186 05 fffff802 48c74830 fffff802
438c1c2c nt!KiTimerWaitTest+0x1e6 06 fffff802 48c748e0 fffff802
438c0d3d nt!KiProcessExpiredTimerList+0xdc 07 fffff802 48c749d0 fffff802
43a0202e nt!KiRetireDpcList+0x5dd 08 fffff802 48c74c60 00000000
00000000 nt!KiIdleLoop+0x9e
您还可以看到(按照我在此处显示堆栈的方式),失败的函数是第 4 帧 - 因为第 3 帧(下一个调用)是页面错误。我们可以显示第 4 帧的详细信息以查看发生了什么... 代码:
0: kd> .frame /r 4
04 fffff802`48c747d0 fffff802`438c2086 nt!KiTryUnwaitThread+0x186
rax=0000000000000001 rbx=ffffd78a945d6080 rcx=0000000000000000
rdx=0000000000000000 rsi=ffffd78a945d6250 rdi=fffff80243841495
rip=fffff8024383ceb6 rsp=fffff80248c747d0 rbp=fffff802408c5180
r8=0000000000000102 r9=0000000000000000 r10=0000000000000000
r11=fffff80248c748c0 r12=0000000000000102 r13=0000000000000000
r14=fffff802408c5180 r15=0000000000000000
iopl=0 nv up ei pl nz na pe nc
cs=0010 ss=0018 ds=002b es=002b fs=0053 gs=002b efl=00000202
nt!KiTryUnwaitThread+0x186:
fffff802`4383ceb6 f0480fbaaf107c000000 lock bts qword ptr [rdi+7C10h],0 ds:002b:fffff802`438490a5=c7fffffbe8850f00
您可以在底部看到,BSOD 发生在尝试使用 RDI 寄存器和偏移量作为指向内存中锁的指针执行 LOCK 指令时,但生成的指针地址 (fffff802`438490a5) 包含无效的内存位置 (c7fffffbe8850f00)。它是无效的,因为它是非规范的 - 它不是允许的虚拟地址的有效范围。您可以通过显示它的页表条目来检查这一点...代码:
0: kd> !pte c7fffffbe8850f00
VA c7fffffbe8850f00
PXE at FFFF9BCDE6F37FF8 PPE at FFFF9BCDE6FFFF78 PDE at FFFF9BCDFFFEFA20 PTE at FFFF9BFFFDF44280
Unable to get PXE FFFF9BCDE6F37FF8
WARNING: noncanonical VA, accesses will fault !
很明显,预期的地址是 0xFFFFFFFBE8850F00,但第一个字节中的几个位未正确设置...Rich(BB 代码):
0: kd> .formats c7fffffbe8850f00
Evaluate expression:
Binary: 11000111 11111111 11111111 11111011 11101000 10000101 00001111 00000000
0: kd> .formats fffffffb`e8850f00
Evaluate expression:
Binary: 11111111 11111111 11111111 11111011 11101000 10000101 00001111 00000000
这只能是由损坏的 RAM 页面引起的。
我讲得非常详细,因为你似乎对细节很感兴趣?结论是你的 RAM 不好,我建议你用 Memtest86 测试一下……
Download Memtest86 (free), use the imageUSB.exe tool extracted from the download to make a bootable USB drive containing Memtest86 (1GB is plenty big enough). Do this on a different PC if you can, because you can't fully trust yours at the moment.
Then boot that USB drive on your PC, Memtest86 will start running as soon as it boots.
If no errors have been found after the four iterations of the 13 different tests that the free version does, then restart Memtest86 and do another four iterations. Even a single bit error is a failure.
让我们知道进展如何。