一切都是兴趣使然,随笔写下这个帖记录。仅为学习笔记,笔者的理解和猜想可能会出现科学性错误,因此这并非科普文章。
在计算机中,内部硬件是一个超高速运行的状态才能维持电脑的流畅稳定运行。随着现代计算机的发展,CPU从硬盘中访问数据的速度已经很不现实,内存(Menmry)即为计算机更高速运行应运而生,它是硬盘与中央处理器进行数据通信的高速中转站,执行程序时,硬盘会将数据写入内存中,然后由CPU与内存进行高速通信以达到更高速的运行效率。
早期内存为Synchronous Dynamic Random Access Memory,即同步动态随机存取存储器(SDRAM);而今不论是台式电脑还是笔记本电脑内的内存均为DDR Synchronous Dynamic Random Access Memory(Double Data Rate Synchronous Dynamic Random Access Memory,即双倍数据速率同步动态随机存取存储器),简称DDR内存。
现在在轻薄本中,为了使续航时间更长同时为机身减重,新型内存LPDDR(SDRAM)应运而生,全称为低功耗双倍数据速率同步动态随机存取存储器(Low Power Double Data Rate Synchronous Dynamic Random Access Memory),当然因为是低功耗内存,在性能上自然要弱于DDR内存
DDR SDRAM内存相比早期SDRAM内存,其可在计算机一个时钟周期内传输两次数据(上升期和下降期各一次),设SDRAM内存一个周期可传输8bit数据,那么DDR SDRAM一个时钟周期则可传输16bit数据,数据量是原先内存的2倍,故称为双倍速率DDR。
内存为易失性存储器,与硬盘这类非易失性存储器相比,内存在中断电力供应后其储存在DRAM芯片中的全部数据会立即丢失,而硬盘则可在断电后将数据留存。
计算机作为电子产品,自然也会有电气干扰,干扰源可能是红外线,WiFi信号,异常的磁场等...干扰源会改变计算机硬件内高速传输的数据,从而导致计算机运行出现不稳定,出错等故障,影响人们的工作和使用。所以在电脑设计时已经充分考虑了电气干扰,随着硬软件的高速发展,电脑的抗干扰性能已经非常强,作为民用级计算机产品消费者的我们,已经几乎感知不到电气干扰对计算机造成的影响了。但在对精度要求更高的服务器甚至数据中心上,一个错误就可能会造成整个系统的全面崩溃,而这种崩溃带来的经济损失是巨大的,因此便有了ECC这一概念。
ECC(Error Checking and Correcting,错误检查及纠正),由奇偶校验发展而来,主要运用于内存和处理器缓存中,ECC可实现对数据中错误的发现和纠正,从而提高整个电脑系统的运行稳定性。
由于先前支持ECC技术的内存价格昂贵,因此主要被运用于服务器、数据中心、图形工作站等大型计算机中。因科技目前遵循摩尔定律的发展,以往只能在企业和高端计算机领域出现的ECC现在也被下放到了民用消费级硬件当中,离我们最近的如DDR5内存,再比如英特尔移动处理器里的i9-12950HX,i7-12850HX和i5-12600HX,它们都支持ECC,只是形式不同而已,这方面下文会继续讲述。
处理器缓存中的ECC
早期的ECC技术采用的是Parity奇偶校验,即内存每8bit字节中包含1bit字节进行EC。设写入内存的8bit字节(8bit=1字节)为(1,1,4,5,1,4,1,9),8位数相加得26(偶数),则EC bit值为true(1)并提交给CPU,若其中一个或多个bit发生偏转导致错误(奇数),则EC bit值为false(0)并提交给CPU
支持ECC技术的CPU接收到的值应为包含EC的9bit数据(1,1,4,5,1,4,1,9,1),并重新计算前8bit数据并与EC bit进行对比,若CPU对比结果为false(0:1)或接收到奇偶校验EC bit=false(0)的1字节则会尝试纠正字节中的错误并执行。
但奇偶校验的缺陷在于,它只能知道该字节中存在错误,并不能精准定位字节里哪一个或多个bit出现错误,因此返回给CPU时,CPU也只能尝试纠正错误。
缺陷二则是奇偶校验每8bit数据就要设置1个EC bit,在庞大的数据中就要设置海量的校验码,这也会增加出错的可能性,容错能力较差。
1字节=8bit,1024字节=1KB,1024KB=1MB,则1MB=1024×1024×8=8388608,那么奇偶校验中,每1MB数据就要设置8388608÷8=1048576bit校验码,折合128KB的校验码。
另一情况,即便1字节内bit发生偏转,但最后加法结果仍等于奇偶校验EC bit=ture,猜想CPU内存控制器在会将写入进内存的数据生成一个校验码,当错误的字节数据返回给CPU EC验证为true时,内存控制器会与CPU读取的字节与写入时的字节通过校验码比对,即使奇偶校验EC bit=true,但bit偏转仍将被发现,最终提交给CPU的EC结果仍为false,CPU仍将会尝试纠错并执行。
ECC内存相比于奇偶校验则可以实现自错误检查并自纠正,并且数据位每增加1倍,只需要增加1bit的校验码。8bit数据的校验码为5bit,16bit数据的为6bit,32bit数据的为7bit,容错率相较于奇偶校验显著增加。
【猜想】ECC内存在CPU向内存写入数据前会针对需要写入内存的数据生成一个校验码,随后随同校验码和数据一同发送给内存,同时支持ECC的内存中单独设置了RECC芯片,在内存接收到CPU的数据后会进行校验,将数据与校验码比对并定位发现出现错误的数据,同时进行自纠错。
通过校验的数据写入内存DRAM芯片中,在发送给CPU数据前进行二次校验并修正错误,CPU在读取内存发送的数据后进行第三次校验并将结果为true的数据执行。但具备RECC芯片的内存需要处理器、主板等其他硬件的支持才能形成一套完整的ECC体系(一般服务器上即服务器内存、服务器处理器和服务器主板,三者均支持ECC,具备RECC芯片的内存才能正常发挥自纠错功能),RECC内存也是当前主流服务器内存
这即为笔者猜想的普通ERCC内存纠错工作原理
随着内存发展,内存容量在增加的同时,工艺技术也会随之优化以实现更高的速度和价格更低的量产产品。当容量、速度、工艺技术进步时,内存阵列出现单位错误的可能性也随之增加。为了进一步改善内存信道和运行可靠性,在消费级DDR5内存中,ECC功能被集成在了DRAM芯片中,即(芯)片上错误检查和纠正(On-Die ECC,ODECC)实现在实时运行中出现的COL和ROW错误。On-Die ECC内存为每128bit数据额外提供8bit EC校验码。
同时,ODECC内存单独设置了一颗DRAM芯片用于储存ECC数据,可支持内存读取数据并与ECC校验实现实时运行时的纠错,提高了系统实时运行时的稳定性。但ODECC的问题在于仅支持运行时的实时纠错,对于正在PCIE传输中的数据出现信道干扰时发生的错误,内存ECC并不能校验和纠正。因此,在重要领域中On-Die ECC通常与Side-Band ECC共同使用,以增加在信道上的数据校验和纠错进一步提高稳定性。
因为ODECC主要为内存片上自纠错,还无法与CPU联通成为一个完整的端到端ECC纠错体系,故此当前在消费级处理器如英特尔i9-12950HX此类支持ECC技术的CPU还不能完全发挥自身的ECC效能。
但ODECC内存和支持ECC的处理器下放到消费级也可能指明或预示着在不久的将来,曾经只出现在服务器上的ECC技术也可以大面积的下放到消费级产品中来,让每个人都能享受更加稳定的计算机体验。
通过进一步了解,在上文撰写的RECC内存所使用的ECC类型为Side-Band ECC,此处将于On-Die ECC进行比对学习,对猜想进行验证和纠错。
Side-Band ECC工作原理图解
在Side-Band ECC的Write原理中,步骤如下:
1.处理器向内存控制器发送硬盘中将要写入内存的数据;
2.内存控制器将执行写入的数据发送至内存;
3.内存为写入的数据生成ECC数据并储存在内存DRAM芯片中
在Side-Band ECC的Read原理中,步骤如下:
1.内存读取实际写入数据和ECC;
2.内存为实际读取的数据生成ECC;
3.比对Write中ECC
→若ECC为true,数据将返回至处理器并执行
→若ECC为false,数据将被内存纠正并返回至处理器执行
【猜想】RECC DDR SDRAM中,若内存中ECC为true,但由于返回支持ECC的处理器途中因信道干扰而发生错误:
1.内存将返回数据与ECC提交至处理器;
2.处理器读取数据并生成ECC;
3.将内存ECC与实际读取ECC对比:
→若ECC为true,数据正常执行;
→若ECC为false,处理器将纠错并执行
On-Die ECC工作原理图解
在On-Die ECC的Write原理中,步骤如下:
1.处理器向内存控制器发送硬盘中将要写入内存的数据;
2.内存控制器为写入数据生成ECC;
3.数据和ECC发送至内存
4.写入数据和ECC被存储在内存DRAM芯片和**ECC DRAM芯片中
【猜想】因ODECC支持实时ECC,则每个周期刷新后ECC DRAM中的数据将与内存DRAM中的数据进行比对:
→若ECC为true,则继续执行;
→若ECC为false,内存将对问题数据进行纠错
在On-Die ECC的Read原理中,步骤如下:
1.控制器从内存中读取数据和ECC;
2.控制器根据实际读取的数据生成ECC;
3.比对原始数据和ECC:
→若ECC为true,发送给处理器;
→若ECC为false,数据将执行纠错程序并加密
在Side-Band ECC中:
写入时,内存会以实际接收的数据生成ECC并一同写入DRAM芯片中;
读取时,生成实际读取数据的ECC并由内存对比在写入和读取时生成的两个ECC进行自纠错。
在On-Die ECC中:
写入时,内存会以控制器生成的ECC并在读取时进行比对纠错;
读取时,由控制器生成ECC并与内存写入时生成的ECC进行比对纠错。
Side-Band ECC和On-Die ECC都是对内存本身运行中产生的错误进行ECC纠错:
On-Die ECC的特点是在实时运行中的纠错,并且能**进行ECC自纠错,但由于其自身的纠错局限性,并不能成为完整的ECC体系;
Side-Band ECC更倾向全局ECC纠错,需要支持ECC技术的处理器协同配合以更好的解决在端到端由于信道传输干扰而造成的错误,同时更好的发挥自身ECC功能。
出发点是想了解在消费级DDR5内存中新引入的On-Die ECC技术的原理,以明白ECC对于消费者的意义。在当前民用消费级计算机中,即便不支持ECC技术,其电气干扰可靠性也已经非常之高,而ECC下放到消费级产品中则是为可靠性锦上添花。
一台电脑或许用到报废也不会遇到电气干扰而导致的错误,但所有消费者的电脑加在一起则又是一个量级。也许一次干扰是游戏的崩溃,让WIN变LOST,亦或者一次崩溃会让工作推倒重来,在服务器面前这些错误是轻如鸿毛,但那句水滴石穿的道理亦是真理,一根根鸿毛堆叠在一起造成的损失不亚于一次服务器宕机。
从长远考虑,ECC的出现就是更快速的推进科学技术的进步,减少不必要的损失,同时让人们的数码生活变得更加便捷和美好。
联系客服