联想拯救者刃9000GTI升级2x32G海盗船3200Mhz内存并开启XMP

背景

19年初的时候,入手了一台迷你游戏主机,型号为联想拯救者刃9000GTI-19ICO。这台机器当时配置了16G内存,并且通过自带的联想电脑管家的游戏模式可以直接打开XMP模式,内存等效频率从2666MHz超频到3200MHz进行使用。时间过渡到20年底,随着内存的降价,这台i9-9900K+RTX2080的主机来到了一个不错的内存升级的时机。于是乎我在京东花了1715元买了两条海盗船复仇者LPX 32G DDR4 3200

然而问题来了,当我换上新内存后,发现了一个严重的问题。就是在这台机器在联想电脑管家里的内存超频选项消失了!也就是说我买的支持XMP模式3200的内存之能跑在2133模式下。。。

这我怎么能忍!于是故事开始了。。。

成果

先说成果。最终达成了开启XMP的效果,系统运行比之前2133的时候更流畅了,这样也能支持我继续爽玩各种游戏大作了。效果见下图,任务管理器显示内存运行在3200MHz模式

联想电脑管家里也能显示出内存超频选项

过程

第一式: 确定路线——修改主板UEFI or 修改内存SPD

目标确定了,首先我们要看看用什么方案来实现。经过一段时间的搜索,我看到了一种大家都想尝试并且有人成功方法,就是通过刷写修改过的BIOS来打开XMP的调节选项。这里有两个有人已经实现的例子。

具体进行下分析。第一个联想论坛的应该是10代平台的UEFI,截图跟我9代的都不一样。结论是官方提供的固件都是只能支持第三方JEDEC 3200的内存,没法开XMP。但有人在跟帖里说加他微信来解决。这个加微信的方案,我预估是要收费给UEFI固件,然后自己刷写。其实这个方式是最快的,而且算下来时间成本也是最优的,毕竟我自己折腾怎么也得花个少则一天多则好几天的业余时间。如果按照工作日薪来算的话,自己搞的时间成本绝对是不如直接买的,省下来的时间我可以看书学习研究也可以休息健身或者做点其他的事情。但是,我本能的不太想用这种方法。为什么呢? 算是一个技术宅的倔强吧。

第二个海外论坛的例子,和我的情况是最接近的。因为他的UEFI界面和我的一模一样,应该都是9代平台。但说实话不太具有可操作性,因为他具体也没有说他是如何修改UEFI来打开隐藏菜单的。整贴后面大部分内容都在说怎么不用编程器也能把修改过的UEFI给刷写进去,但这个其实对我来说没有啥实际意义。。。因为我至少要知道怎么进行修改。。。或许这个论坛里有其他部分是在说如何进行修改操作,或者大家基本都懂,但是我确实不太懂。。。

所以算下来,修改UEFI这条路搜索现成的成功方案没有发现可以具体实现的方法。而且这里还有一个问题,就是一旦修改,你后续每次随着官方UEFI升级,你都得每次改,其实这也是个麻烦事。

那有没有其他的方法呢?

其实是有的。换个思路想,为什么插上原厂的内存在联想电脑管家里就有内存超频配置,而在插上第三方的内存之后,就不行呢? 直接原因就是联想电脑管家识别出了这不是它支持的内存,于是就不让你开XMP。那进一步问它为什么能认出这个内存不是原厂的呢? 它要靠内存本身的信息标记来进行识别。那内存是如何进行信息标记的呢? 答案是通过SPD来进行标记,具体可以查看这个链接。那我们能不能想想办法,让联想电脑管家来认为我们买的第三方内存就是原厂的呢?

这里交待一下背景。我之前就用SPD修改来解决过问题,所以这次也会想到这个方法。多年前,我曾经买过一条协德的DDR3L 1600的内存,便宜是真便宜,但是买回来之后发现在一块迷你主机上没法用。后来查原因,发现了一个情况。就是这个条的SPD的时序写的确实有问题,生成出来的有效频率是中没有平时常见的533MHz,667MHz,而是685Mhz,752Mhz。但在ThinkPad上就能正常工作在667MHz下,看来确实是这个条的不标准和那个主板的不兼容两者产生了问题。于是当时我就使用Thaiphoon Burner把一条时序配置正常的大厂内存SPD拷贝下来,刷写到这个条上,然后再插到问题主板上。于是协德内存就可以正常工作了。这条内存一直正常使用到现在,距离现在有大概两年了。

答案是可以。SPD信息包含了内存的时序与厂商等相关信息,就像”内存的BIOS”一样。我们修改了关于厂商的识别信息,大概率就能成功。而且这个修改相对风险比较低,搞坏了可以直接上编程器刷写就行,比搞坏了UEFI,只能用编程器和夹子进行刷写要方便不少。并且修改一劳永逸,不影响后续正常升级主板UEFI后XMP就不能正常开启。

第二式: 修改内存SPD字段信息

虽然之前有过修改SPD的经历,但那是针对DDR3,而现在是DDR4,而且还有XMP。于是我首先使用Thaiphoon Burner免费版来查看一下所谓的原厂内存的SPD信息。这个Thaiphoon Burner免费版虽然不能进行SPD编辑和刷写,但是它对于SPD的每个有效字节和区域使用不同的颜色进行高亮标记,也在下方状态栏中显示其含义,非常方便。结合我从网上搜到的DDR4的SPD规范PDF文档,我清楚的得知了SPD中标记的信息有哪些。另外结合XMP扩展的PDF文档(这里实在是在全网找不到XMP2.0的规范,所以用XMP1.1的规范来看,绝对的字节偏移是不一样的,但是从相对地址来看大部分定义都是一样的)概述起来大概有这些

  • 偏移0x000~0x0FF 前256字节 运行所需基础信息,时序信息等
  • 偏移0x100~0x1FF 后256字节 厂商信息,XMP信息,自定义信息

然后这里面的关键其实就是把厂商信息和自定义信息给替代掉,以实现让联想电脑管家来认为我们自己的条就是原厂条的目的。

那为什么基础信息和时序信息不做考虑? 因为即使是同一个厂商,不同的批次,这些信息也都会有区别,所以这些信息不可能作为识别依据。

于是我对内存信息开始进行了替代。原来的海盗船内存SPD后256字节信息如下

修改后,把原厂的内存对应的字节全部搬过来,包括厂商和序列号等信息,以及靠近最后的3个字节”RGB”独立标记拷贝过来,结果如下

红圈处即为对应替换的字节。

这里因为我们的Thaiphoon Burner是免费版不能进行修改,于是我就用它的文本报告到导出功能到出成txt报告,再把十六进制的文本提取出来转换成bin文件,再用二进制编辑器进行修改。因为字节数不是很多,即使下载一个二进制编辑器,用手工对着敲其实也是没问题的。

第三式: 刷写修改好的SPD到内存条

前面说了,Thaiphoon Burner免费版不能进行刷写,而且即使你付费也不行。因为我们的主板把SPD所在的SMBus在对应区间的写入功能直接关掉了,所以我们没法直接用机器本身进行刷写。那怎么办呢? 我们可以使用编程器来进行刷写。经过一番搜索,发现淘宝上有专门的DDR4内存刷写全套工具,价格要好几百。但是我看了下直接买EEPROM8脚到内存插槽的转换器和另外单独买CH341的8脚编程器却很便宜,加起来都不到50元。于是乎我果断买了后者,买回来二话不说我就组装好,准备开刷。

然后我下载了一个CH341的编程器的Windows软件,我选择了24系列的通用EEPROM芯片,容量选择为512B,上来首先进行读取进行验证。

读取顺利!我看到读出的字节和我用Thaiphoon Burner读出来的一样! 再往下看,等等! 我的心凉了半截,为啥后256字节读出来都是FF呢? 然后我验证了下对于前256字节的读取和写入,都是正常的。但问题是我的修改都是在后256字节,这可如何是好? 所以现在又有了一个新问题,就是如何用编程器读写后256字节的数据。

经过代换验证,发现并不是编程器损坏,而是确实只能读写出256字节的数据。于是我进一步进行搜索,找到了一个关于DDR4 SPD芯片的PDF文档。经过阅读,发现一个事情,就是其实DDR4内存的SPD的EEPROM,按规范是分成两个Bank的,默认选取第一个Bank,即前256字节。但是这个芯片通过I2C协议除了进行读写外,还支持通过命令切换到第二个Bank。根据文档的说明,即发送6E 00 00三个字节,就能达到切换到第二个Bank的效果。但是编程器并没有提供这个功能,那我们必须使用自己的工具来实现切换Bank和读写么? 经过一番搜索,意外发现了一个工具,就是在官方提供了一组CH341评估工具,解压后在CH341PAR\VC目录下包含了一个使用I2C发送和接收信息的图形化工具CH341EVT.exe,最不济我也能用这个工具进行Bank切换和读写。

接下来验证我的猜想的时刻到了! 运行命令后,果然通过选项卡切换到读取EEPROM内容,确实读出了后256字节的数据,说明我切换成功!心里暗爽了一把。但是用这个评估工具进行刷写,着实太麻烦了,那我们能不能取取巧。。。我同时打开了前面的CH341编程器应用,点击了读取。。。果然可以!进行切换后,在编程器应用里一样可以进行读写了!

接下来就好办了。我打开了修改好的后256字节的内容,成功刷写进入。

然后把刷好SPD的内存条插入到机器中,重启,发现终于可以在联想电脑管家中设置内存超频了!

这里其实有个小插曲。由于中途我安装了Intel的Extreme Tunning Utility,导致内存超频选项配置后无法正常生效。后来经过多次反复验证,我才发现这个我问题。这里要注意即使是卸载了XTU软件也不行,还要手工在设备管理器里把XTU相关的软件设备全部卸载掉,再在联想电脑管家中设置内存超频,就能生效了。

后记

这次前后严格讲花了一个通宵+半天的时间。说实话还是有些浪费的。不过也学到了一些东西,也算是不白折腾。不过下次可能我就直接找付费服务了。因为这次折腾我搞明白了这么几个事情,一个是I2C协议,这个东西我之前是完全不懂的,现在这个I2C通信基本是整明白了。另外一个是DDR4的SPD以及时序是如何使用参数计算的。整个过程其实能够总结出一个模式,即首先明确问题,再查找已有解决方案,结合经验确定解决方向,再查询相关标准的文档,使用工具或编写工具进行解决。这个模式此次运作的还是比较成功的。

其实这个模式完全可以套用在解决工作中的问题上。现在越来越多的问题其实是没有办法直接找到现成的解决方案的。因此查询相关的标准文档,观察,猜想,验证最后到解决这一系列的能力非常重要。这次也算是一个练兵吧~