作者Segal (Dino)
看板hardware
标题[心得] Windows禁用出问题的记忆体区段
时间Thu Jan 9 12:23:54 2025
本篇关键字:Bit flipping、PFNs、badram、defective memory、WHEA
大概是圣诞节前後吧,手边的笔电在看YT时开始跳出分页崩溃错误,时好时坏。
到了1月初,情况甚至变成BSOD,错误码有0x0000001a(MEMORY_MANAGEMENT)、
0x0000003b(SYSTEM_SERVICE_EXCEPTION)、0x00000139(KERNEL_SECURITY_CHECK_FAILURE)
一开始我还没想透是怎麽一回事,还想说是不是哪个零日漏洞被开采而我中奖了。
直到我顺手读了火狐的错误报告,看到这一行:
Possible bit flips max confidence | 92%
阿靠,位元翻转,这下八九不离十是记忆体的包了。直接上记忆体检查。
Memtest86+ v7.00 | Intel(R) Core(TM) i5-8250U CPU @ 1.60GHz
CLK/Temp: 1800MHz 39/39°C | Pass 2%
L1 Cache: 32KB 93.8 GB/s | Test 48% ##################
L2 Cache: 256KB 38 GB/s | Test #2 [Address test, own address + window]
L3 Cache: 6MB 22.2 GB/s | Testing: 11GB - 12GB [1GB of 11.9GB]
Memory : 11.9GB 10.7 GB/s | Pattern: own address
--------------------------------------------------------------------------------
CPU: 4 Cores 8 Threads SMP: 8T (PAR) | Time: 0:00:16 Status: Failed! \
RAM: 1600Mhz (DDR4-3200) CAS 22-22-22-52 | Pass: 0 Errors: 5
--------------------------------------------------------------------------------
pCPU PASS Test Failing Address Expected Found
---- ---- ---- ------------------------ --------------- ---------------
0 0 2 0000001c1fd5938 (7.03GB) 0000001c1fd5938 0800001c1fd5938
3 0 2 0000001c1fd2af0 (7.03GB) 0000001c1fd2af0 0100001c1fd2af0
3 0 2 0000001c1fd5938 (7.03GB) 0000001c1fd5938 0800001c1fd5938
PS:不要用Windows内建的记忆体检查,那就只是个拉基,查不出个东西的。
我一开始就是先用内建检查,查无问题才想到别处去,结果绕了一圈问题还是出在记忆体
好,由上页画面可以看到记忆体在3个位址出现高位翻转的异常。
知道了出包的记忆体位址,怎麽去关闭呢?
估狗了一下,Windows从Vista开始,
就有支援由开机纪录(BCD)来宣告无效的记忆体分页的功能。
而从Windows 10 20H2起,微软改用了硬体错误架构(WHEA)来处理这类状况,
如果记忆体具有ECC纠错功能,那麽出错次数超过阀值时,
Windows就会自动将该区块宣告为禁用。无须人工介入。
但我的笔电没吃那麽好,所以才要手动自己来。
我用的是旧式的BCD宣告方式,所以跑Win 7/8的老机器也可以参考这篇。
要修改BCD,首先要有Admin权限。
假设你还进得了作业系统,至少是安全模式。打开有权限的CMD,
查询目前的故障记忆体列表:
bcdedit /enum {badmemory}
正常你会看到列表为空:
RAM Defects
-----------
identifier {badmemory}
只是因为BCD的列表接受的是页号(PFN),一个页号对应一个4k分页,
需要一个一个去作宣告,没办法直接宣告一个范围。好险我估算了一下,
本次出包的记忆体区间大概是0x1c1fd0000 ~ 0x1c1fd7fff,就8个pages,
还可以用手工列举。万一有成千上万的holes散落在各个实体颗粒上,我可能要想办法弄
个脚本来key-in。
那怎麽把位址转换成页号呢?
首先去头0,0000001c1fd5938变成1c1fd5938。再去掉低位3位,得到1c1fd5。
0x1c1fd5就是包含该位址的页号。
把范围处理成页号後,回到bcdedit加入:
bcdedit /set {badmemory} 0x1c1fd0 0x1c1fd1 0x1c1fd2 0x1c1fd3 0x1c1fd4
0x1c1fd5 0x1c1fd6 0x1c1fd7
并且启用禁止访问故障记忆体:
bcdedit /set {badmemory} badmemoryaccess no
之後再查询,你会看到:
RAM Defects
-----------
identifier {badmemory}
badmemoryaccess No
badmemorylist 0x1c1fd0
0x1c1fd1
0x1c1fd2
0x1c1fd3
0x1c1fd4
0x1c1fd5
0x1c1fd6
0x1c1fd7
这就完工啦,重启後Windows将完全无视这些故障的记忆体以保平安。
用RAMMap这类公用程式再去检查,会直接看不到这段记忆体。
当然这手法只是治标不治本,争取到时间赶快把问题所在的记忆体模组给换了才是真的。
(手刀下订一条新记忆体)
毕竟谁也不知道记忆体颗粒状况会不会进一步恶化,导致故障范围突破收容列表。
而换完之後记得回到bcdedit,清空列表并还原禁用设定:
bcdedit /deletevalue {badmemory} badmemorylist
打完收工。
最後,我肯定是脑袋去夹到才会买Patriot博帝的记忆体,当时到底在想啥啊我...
我上次看到记忆体检查喷红字还是XP时代DDR-400的南亚科欸。
--
https://i.imgur.com/Vk91kSq.gif
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 163.16.242.37 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/hardware/M.1736396638.A.111.html
※ 编辑: Segal (163.16.242.37 台湾), 01/09/2025 12:28:56
1F:→ cancelpc: 十诠,ADATA,蛇蛇..我都遇过新品故障,或一阵子跑出错误 01/09 13:25
2F:→ cancelpc: 这些非原厂的由於制程成熟,良率高,就省下测试时间/成本 01/09 13:26
3F:→ cancelpc: 保固做好,等消费者送修.还能赚到口碑 01/09 13:27
4F:推 d030b: 原来还能手动关闭某些区块 感谢分享 01/09 14:00
5F:推 cancelpc: 虽然很有资讯的一篇,但保固内还是快送修 01/09 14:57
6F:推 ccbbaa: 记忆体测试的画面居然不是抓图 而是用画的!!!! 01/09 22:56
7F:推 Saren: 实用 尤其是我的笔电是onboard的记忆体 01/10 16:46
8F:推 bartwang: 我还在想记忆体测试画面,+号会闪是怎麽做到的,厉害 01/11 18:54
9F:推 Cubelia: 超精华 01/12 04:37
10F:→ Cubelia: 理论多少看过,不过中文圈的实际操作是第一次见到 01/12 04:43
11F:推 BITMajo: XDD 超用心 01/12 11:41
12F:推 jtmh: 看到图还在想这麽那麽逼真,原来是画的XD 01/12 14:03
13F:推 gmkuo: 推 01/12 19:19
14F:推 jh961202: 笑死,还手绘memtest86+,有够浪费才能(称赞意味) 01/12 22:15
15F:推 utamaru: 手绘 推 01/12 23:26
16F:推 CardLin: 有散热片的RAM似乎比较不会坏,某牌DDR4裸露版已经修两次 01/14 08:26
17F:→ CardLin: 如Kingston Fury DDR4-3600预设其实只有2400至少能开机。 01/14 08:29
18F:推 styyu1281: 推经验分享。 02/16 02:59
19F:→ styyu1281: 但是看完之後,我哪天遇到还是直接买新的来换比较快… 02/16 02:59
20F:推 s25g5d4: 涨知识 02/23 18:46
21F:推 guanting886: 原来比特反转真的遇得到? 05/30 11:34
22F:推 nisioisin: 没终保吗? 06/02 00:34
23F:推 nrsair: 专业 07/24 00:15