入侵DDR3 SPD

我用两个4GB DDR3-1333内存模块升级了旧笔记本电脑,但事实证明该笔记本电脑最多可兼容DDR3-1066。 一个真正的男人会做什么? 当然,它将升级EEPROM以将DDR3重新绑定到较慢的型号!


工作地点。 右侧是用于闪烁的Thinkpad,左侧是有问题的MacBook Pro

小心点 显然,您可以破坏或永久阻止DIMM上的记录。 可能更细微的问题,包括电池逻辑电路故障,或者母板会变成砖头

一切如何开始


我在2010年年中有一台13英寸MacBook Pro。 在常规重新引导期间,其文件系统已损坏,并且磁盘实用程序(来自恢复分区)无法执行任何操作。 好吧,我已经等了很久了:该放置一个SSD并添加一些RAM了。

我买了一个固态硬盘,很幸运在电子垃圾堆中发现了几台损坏的笔记本电脑,上面装有合适的RAM模块。 我们插入SSD和两个4 GB模块,启动Internet Recovery-一个小时后,我们应该有了一个正常工作的系统。 但是没有 下载只是冻结。 因为什么 这些RAM模块引起了最大的怀疑,毕竟它们来自垃圾。 因此,我们可以做任何人都可以做的事情:使用memtest86创建USB闪存驱动器并使其运行一整夜。 很好,记忆很好。 在为不同版本的macOS尝试了不同的安装方法后,终于发现,只要重新插入旧内存,一切就可以正常工作。 1个

真实原因


意识到此问题后,我很快了解到2009-2010年MacBook的内存处理速度实际上并不比PC3-8500快 ,并且您可以使用名为Thaiphoon Burner的Windows程序修改RAM元数据来解决此问题

故障的真正原因是集成图形处理器GeForce 320M,它使用共享内存,即常规RAM。 它最多可以与PC3-8500(即DDR3-1066,即533 MHz DRAM的时钟频率)一起工作,但是系统内存控制器不知道这一点,因此将最大可用速度提高到667 MHz(即PC3-10600,即DDR3)。 -1333)。 其余组件对此没有问题,就像VESA模式下的GPU(我认为)一样。

我还没有听说过任何其他设备无法以比设备更高的速度运行RAM。 当然,在市场上购买内存模块时,卖家会警告过这种细微差别。 自2012年以来,这仍然比焊接的RAM更好,例如在Apple笔记本电脑中。

固件设定


找出原因后,我在2 GB上安装了一个原始PC3-8500模块,并在一个新的4 GB模块上安装了该模块,并且可以正常工作。 但是DDR3重新绑定似乎是一个不错的项目,因此我决定尝试一下。

当然,如果一切都可以手动完成,那么我不会安装仅用于EEPROM固件的Windows,也不会购买高级软件。 我认为该任务显然应该在Linux上完成,也许可以使用一些其他工具。 我也不想仅在Macbook上安装Linux。 因此,带有NixOS的老式可靠Thinkpad X220 成为理想的工作平台。 更新它花了一些时间,因为我大约一年没有装载汽车。

然后轮到选择首先尝试哪个模块。 Thinkpad每个已经有两个4 GB,我发现了四个4 GB模块,因此我有很多选择。 我决定从最奇怪的美光产品开始。 其余的都是三星。 一个贴有联想标签。

读取SPD


内存模块随附EEPROM芯片,其中包含有关串行状态检测 (SPD)模块的元数据。 格式本身很简单,可以通过SMBus总线安排对EEPROM的访问,该总线与I²C基本相同。 2

幸运的是,有内核驱动程序和现成的软件可以与SMBus进行交互,甚至可以读取EEPROM DDR3。

首先,要查看总线上的设备,需要i2c-tools和一些内核模块。

$ nix-shell -p i2c-tools
$ modprobe i2c-dev
$ modprobe i2c-i801
$ i2cdetect -l
i2c-0 unknown i915 gmbus ssc N/A
i2c-1 unknown i915 gmbus vga N/A
i2c-2 unknown i915 gmbus panel N/A
i2c-3 unknown i915 gmbus dpc N/A
i2c-4 unknown i915 gmbus dpb N/A
i2c-5 unknown i915 gmbus dpd N/A
i2c-6 unknown DPDDC-B N/A
i2c-7 unknown DPDDC-C N/A
i2c-8 unknown DPDDC-D N/A
i2c-9 unknown SMBus I801 adapter at efa0 N/A


SMBus适配器在这里很有趣,在我的情况下是i2c-9

i2c-tools软件包甚至还带有一个decode-dimms用于以可读格式读取RAM信息。 这需要eeprom内核模块。

$ modprobe eeprom
$ decode-dimms
$ modprobe -r eeprom


这是一个内存模块的输出:

 内存串行状态检测解码器
由Philip Edelbrock,Christian Zuckschwerdt,Burkart Lingner撰写,
 Jean Delvare,Trent Piepho等


解码EEPROM:/ sys /总线/ i2c /驱动程序/ eeprom / 9-0050
猜测暗调在银行1中

 --- === SPD EEPROM信息===-
字节0-116 OK的EEPROM CRC(0xAEA4)
写入SDRAM EEPROM 176的字节数
 EEPROM 256中的字节总数
基本存储器类型DDR3 SDRAM
模块类型SO-​​DIMM

 --- ===内存特性===-
最高模块速度1333 MHz(PC3-10600)
大小4096 MB
银行x行x列x位8 x 15 x 10 x 64
排名2
 SDRAM设备宽度8位
总线宽度扩展0位
 tCL-tRCD-tRP-tRAS 9-9-9-24
支持的CAS延迟(tCL)10T,9T,8T,7T,6T,5T

 --- ===标准速度下的计时===-
 tCL-tRCD-tRP-tRAS作为DDR3-1333 9-9-9-24
 tCL-tRCD-tRP-tRAS作为DDR3-1066 7-7-7-20
 tCL-tRCD-tRP-tRAS作为DDR3-800 6-6-6-15

 --- ===时间参数===-
最小循环时间(tCK)1.500 ns
最小CAS延迟时间(tAA)13.125 ns
最小写恢复时间(tWR)15.000 ns
 RAS#到CAS#的最小延迟(tRCD)13.125 ns
最小行活动到行活动延迟(tRRD)6.000 ns
最小行预充电延迟(tRP)13.125 ns
最小有效到预充电延迟(tRAS)36.000 ns
最小活动到自动刷新延迟(tRC)49.125 ns
最小恢复延迟(tRFC)160.000 ns
最小读写读写CMD延迟(tWTR)7.500 ns
最小读取至预充电CMD延迟(tRTP)7.500 ns
最小四个激活窗口延迟(tFAW)30.000 ns

 --- ===可选功能===-
可操作电压1.5V
支持RZQ / 6? 没有啦
支持RZQ / 7? 是的
支持DLL-Off模式吗? 是的
工作温度范围0-95摄氏度
扩展温度范围内的刷新率2倍
自动自我刷新? 是的
芯片上温度传感器读数? 没有啦
部分数组自刷新? 没有啦
模块温度传感器是
 SDRAM设备类型标准单片

 --- ===物理特性===-
模组高度30毫米
模块厚度正面2毫米,背面2毫米
模组宽度67.6毫米
模块参考卡F修订版0
等级1映射标准

 --- ===制造商数据===-
模块制造商美光科技
 DRAM制造商美光科技
制造位置代码0x0F
制造日期2011-W23
部件序列号0xFB5C7F1A
零件编号16JSF51264HZ-1G4D1
修订代码0x4431 

相当多的数据。 显示的部分信息是根据数据计算得出的。 例如,基于纳秒分辨率的定时参数来计算标准速度下的定时(即,循环计数)。 即使它们以安装在EEPROM上其他位置的时基单位的倍数存储,但这不适用于本文的主题。 此RAM模块为DDR3-1066提供了7-7-7-20,符合DDR3-1066F JEDEC标准。 不要问我JEDEC是什么,但是它比最便宜的DDR3-1066G还要快。

我花了很多时间来确认我的结论:在尝试重新绑定内存时,唯一重要的数字是最小循环时间(tCK)。 这是1.5 ns,即 667 MHz。

让我们看一下源数据。

  $ i2cdump 9 0x50
未指定大小(使用字节数据访问)
警告! 该程序会使您的I2C总线混乱,导致数据丢失甚至更糟!
我将探测文件/ dev / i2c-9,地址0x50,模式字节
继续吗  [是/否]
      0 1 2 3 4 5 6 7 8 9 abcdef 0123456789abcdef
 00:92 10 0b 03 03 19 00 09 03 52 01 08 0c 00 7e 00 ??????。????? R ???。〜。
 10:69 78 69 30 69 11 20 89 00 05 3c 3c 00 f0 82 05 ixi0i?  ?。?<<。???
 20:80 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 30:00 00 00 00 00 00 00 00 00 00 00 00 00 00 0f 11 05 00 ............ ???
 40:00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
 50:00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
 60:00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
 70:00 00 00 00 00 80 2c 0f 11 23 fb 5c 7f 1a a4 ae .....?,??#?\ ????
 80:31 36 4a 53 46 35 31 32 36 34 48 5a 2d 31 47 34 16JSF51264HZ-1G4
 90:44 31 44 31 80 2c 00 00 00 00 00 00 00 00 00 00 00 D1D1 ?, ..........
 a0:00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
 b0:ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................
 c0:ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................
 d0:ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ......
 e0:ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................
 f0:ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................ 

规范说最小时间表示为0x0c。 让我们看一下,它在c列的第一行( 00: 。 顺便说一下,它的值也是0x0c或12。这是平均时基(MTB)的倍数,它是将0x0a中的值除以0x0b中的值(以纳秒为单位)的商。 这里1⁄8 ns。 因此12 MTB相当于1.5 ns。

变更计划


要降至DDR3-1066,我们需要533 MHz,即1.875 ns或15 MTB或0x0f。 也就是说,我们要在0x0c处写入0x0f。

但是,等等,显然有一个错误修复。 前116个字节的CRC存储在0x7e-7f中。 我看着那里,看到a4 ae ,然后去寻找计算器进行计算。 找到一个可行的CRC计算器花了我很长时间。 我尝试了几种命令行工具,但仍然选择在线计算器http://crccalc.com/ 。 然后我发现这里使用了CRC-16 / XMODEM变体,校验和实际上是0xAEA4。 字节顺序等等。 应该在发出decode-dimms

因此,您需要在0x0c处写一个新的最小周期时间(0x0f),在0x7e处写一个新的校验和。

SPD记录


现在我知道该写些什么了,终于敢尝试。 我用颤抖的手键入y ,然后按Enter进行最终确认并...

  $ i2cset 9 0x50 0x0c 0x0f
警告! 该程序会使您的I2C总线混乱,导致数据丢失甚至更糟!
危险! 写入内存DIMM上的串行EEPROM
可能会使您的内存变得无用,并使您的系统无法正常运行!
我将写入设备文件/ dev / i2c-9,芯片地址0x50,数据地址
 0x0c,数据0x0f,模式字节。
继续吗  [y / N] y
错误:写入失败 

错误。 等等什么

作为一个学究的人,我开始研究i2cset的来源以及相应的内核模块。 在某个时候,我意识到这可能是由写保护引起的。

我取出一个内存模块,查看了一下,确认了EEPROM芯片。 它说97B321和其他一些东西。 谷歌搜索,我发现这是SE97B芯片。 我查看了数据表并仔细阅读了写保护部分。 在程序的帮助下,我进行了几次尝试删除临时写保护的尝试,但是都失败了。 写保护可能是恒定的,所以我只是决定寻找一个没有写保护的模块。

顺便说一句,一个有趣的事实是通过向特定地址写入内容来启用实时写保护。 我认为i2cdetect无法正常执行此操作,但是运行i2cget 9 0x30 <any-address>可能会设置实时写保护,这确实是恒定的。 我没有尝试这样做。

我采用了以下模块,并且那里没有错误消息。 EEPROM只是没有改变。

终于成功了!


有了第三个模块,操作终于完成了。 我计算了CRC,并将其与循环时间一起写入。 加载eeprom内核模块并启动decode-dimms模块看起来就像是普通的4GB PC3-8500。 当我将其安装在MacBook Pro上时,我最终启动了具有8 GB内存的系统。


重新绑定后的DDR3 SODIMM准备在MacBook Pro中工作

之前:原始DDR3-1333


  0 1 2 3 4 5 6 7 8 9 abcdef 0123456789abcdef
 00:92 10 0b 03 03 19 00 09 03 52 01 08 0c 00 3e 00 ??????。????? R ???。>。
 10:69 78 69 30 69 11 20 89 00 05 3c 3c 00 f0 83 01 ixi0i?  ?。?<<。???
 20:00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
 30:00 00 00 00 00 00 00 00 00 00 00 00 00 00 0f 11 45 00 ............ ?? E.
 40:00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
 50:00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
 60:00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
 70:00 00 00 00 00 80 ce 02 11 30 b1 5b 13 a1 0e 59 ..... ???? 0?[??? Y
 80:4d 34 37 31 42 35 32 37 33 43 48 30 2d 43 48 39 M471B5273CH0-CH9
 90:20 20 00 00 80 ce 00 00 00 53 31 42 4e 30 30 30 .. ?? ... S1BN000
 a0:01 00 01 00 00 00 00 00 00 00 00 00 00 00 00 03 03 ..?............?
 b0:00 00 00 00 00 00 00 00 00 00 00 00 00 00 32 59 00 ............. 2Y
 c0:00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
 d0:00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
 e0:00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
 f0:00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 

之后:看起来像DDR3-1066


  0 1 2 3 4 5 6 7 8 9 abcdef 0123456789abcdef
 00:92 10 0b 03 03 19 00 09 03 52 01 08 0f 00 3e 00 ??????。????? R ???。>。
 10:69 78 69 30 69 11 20 89 00 05 3c 3c 00 f0 83 01 ixi0i?  ?。?<<。???
 20:00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
 30:00 00 00 00 00 00 00 00 00 00 00 00 00 00 0f 11 45 00 ............ ?? E.
 40:00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
 50:00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
 60:00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
 70:00 00 00 00 00 80 ce 02 11 30 b1 5b 13 a1 06 54 ..... ???? 0?[??? T
 80:4d 34 37 31 42 35 32 37 33 43 48 30 2d 43 48 39 M471B5273CH0-CH9
 90:20 20 00 00 80 ce 00 00 00 53 31 42 4e 30 30 30 .. ?? ... S1BN000
 a0:01 00 01 00 00 00 00 00 00 00 00 00 00 00 00 03 03 ..?............?
 b0:00 00 00 00 00 00 00 00 00 00 00 00 00 00 32 59 00 ............. 2Y
 c0:00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
 d0:00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
 e0:00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
 f0:00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 

如果您没有立即看到差异,那么就和我一样,您还没有深入研究这些垃圾填埋场。

你的想法


值得这样做吗? 经济上当然不行!

但这很有趣,我学到了很多东西。 我不知道可以在哪里确切地应用这些知识,但是我觉得在某些时候将需要它们。 能够正确解决问题的感觉真的很不错,并且给人信心。



1.我认为如果通过memtest86,RAM可以在该设备上工作,这是错误的。 然而,即使回头看,这个假设似乎也并不愚蠢。 根据经验,由于标准测试的失败,硬件的奇怪组合并不少见。

2.我最近了解到在另一个项目中使用I²C的知识。 我认为我可以使用自己的程序在Cortex-M微控制器上读写EEPROM,但实际上,焊接连接器非常困难,对我而言,编写代码的工作量太大。 尽管如此,我真的很高兴我在理论上有能力做到这一点!

Source: https://habr.com/ru/post/zh-CN431128/


All Articles