内存ECC纠错

分类: beat365官方网站正规 发布时间: 2026-02-21 07:05:37 作者: admin 阅读: 5931
内存ECC纠错

目录ECC是什么?为了在使用过程中减少坏块的产生,通过2种方式进行预防:奇偶校验ECC的运作原理:查看是否有启EDAC模块开启并查看EDAC驱动程序检查EDAC驱动程序的状态获取内存的CE计数查看内存布局查看日志,可以确认是否ECC模块已发挥作用查看纠错提示,内存对应关系

ECC是什么?

ECC的全称是 Error Checking and Correction or Error correctionCoding,是一种用于差错检测和修正的算法。

NAND闪存在生产和使用中都会有坏块产生,BBM就是坏块的管理机制。

为了在使用过程中减少坏块的产生,通过2种方式进行预防:

1、利用磨损平衡(WL)提前预防坏块产生;

2、已经产生“坏块”的引入ECC,通过ECC对“坏块”进行有效检测及纠正。

如果操作时序和电路稳定性不存在问题,NAND闪存出错的时候一般不会造成整个Block或Page不能读取甚至全部出错,而是整个Page中只有一个或几个bit出错,这个时候ECC针对出错的bit进行检测和纠正。

从DDR5自带ECC功能来看就是在内存中增加存储芯片,这样能检测和纠正内存单元中的数据错误,同时也能够有效提高DRAM芯片良率。

奇偶校验

在ECC技术出现之前,内存中应用最多的另外一种错误检查技术,是奇偶校验位(Parity)技术。

奇偶校验,即Parity Check,根据被传输的一组二进制代码的数位中“1”的个数是奇数或偶数来进行校验通常用于确定数据是否出错。

在数字电路中,最小的数据单位就是叫“比特(bit)”,也叫数据“位”,“比特”也是内存中的最小单位,它是通过“1”和“0”来表示数据高、低电平信号。

在数字电路中8个连续的比特是一个字节(byte),如:字节中某一存储数值(1、0、1、0、1、0、1、1)相加是5,结果奇数。

采用偶校验,校验位就定义为1,5+1=6为偶数;

对于奇校验,则为0,5+0=5奇数。

当CPU读取存储的数据时,会再次把前8位中存储的数据相加,计算结果是否与校验位相一致(即下面讲到的与ECC签名是否一致)。

但Parity(奇偶校验位)的不足是:当内存查到某个数据位有错误时,不能准确定位存在错误的数据位,也就不一定能修正错误。

而且当数据量大时,数据出错的几率也就越大,对于只能纠正简单错误的奇偶检验的方法就无法纠正,由此出现错误检查和纠正(Error Checking and CorrecTIng)。

ECC的运作原理:

ECC是在奇偶校验的基础上发展起来,与奇偶校验技术一样,ECC纠错技术也需要额外的空间来储存校正码,但其占用的位数跟数据的长度并非成线性关系。

具体来说,它是以8位数据、5位ECC码为基准,随后每增加一个8位数据只需另增加一位ECC码即可。

也就是说当数据位为16位时ECC位为6位,32位时ECC位为7位,数据位为64位时ECC位为8位,依此类推,数据位每增加一倍,ECC位只增加一位。

所以ECC有更多位数的校验位,容错能力更强。

查看是否有启EDAC模块

# find /lib/modules/$(uname -r) -name '*edac*'

开启并查看EDAC驱动程序

使用物理机执行

已安装rasdaemon

检查EDAC驱动程序的状态

1. 使用命令查看:# ras-mc-ctl --status

2. 如果显示未加载

1) # ras-mc-ctl --status

ras-mc-ctl: drivers not loaded.

2)检查edac模块是否加载

# lsmod |grep edac

输出为空

3)加载内核

x86:

# insmod /usr/lib/modules/4.19.90/kernel/drivers/edac/amd64_edac_mod.ko.xz

# lsmod |grep edac

amd64_edac_mod 36864 0

edac_mce_amd 32768 1 amd64_edac_mod

4)再次检查

# ras-mc-ctl --status

获取内存的CE计数

# grep "[0-9]" /sys/devices/system/edac/mc/mc*/csrow*/ch*_ce_count

输出类似

# grep "[0-9]" /sys/devices/system/edac/mc/mc*/csrow*/ch*_ce_count

内存正常情况

/sys/devices/system/edac/mc/mc0/csrow0/ch0_ce_count:0

/sys/devices/system/edac/mc/mc0/csrow0/ch1_ce_count:0

/sys/devices/system/edac/mc/mc0/csrow1/ch0_ce_count:0

/sys/devices/system/edac/mc/mc0/csrow1/ch1_ce_count:0

/sys/devices/system/edac/mc/mc0/csrow2/ch0_ce_count:0

/sys/devices/system/edac/mc/mc0/csrow2/ch1_ce_count:0

/sys/devices/system/edac/mc/mc0/csrow3/ch0_ce_count:0

/sys/devices/system/edac/mc/mc0/csrow3/ch1_ce_count:0

/sys/devices/system/edac/mc/mc1/csrow0/ch0_ce_count:0

最后一个数字不为0则是校验错误,例:

/sys/devices/system/edac/mc/mc1/csrow0/ch3_ce_count:0

/sys/devices/system/edac/mc/mc1/csrow1/ch0_ce_count:198276530

/sys/devices/system/edac/mc/mc1/csrow1/ch1_ce_count:233266714

/sys/devices/system/edac/mc/mc1/csrow1/ch2_ce_count:0

查看内存布局

# ras-mc-ctl --layout

输出类似

# ras-mc-ctl --layout

+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

| mc0 | mc1 | mc2 |

| csrow0 | csrow1 | csrow2 | csrow3 | csrow0 | csrow1 | csrow2 | csrow3 | csrow0 | csrow1 | csrow2 | csrow3 | csrow0 | cs

----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

channel1: | 16384 MB | 16384 MB | 16384 MB | 16384 MB | 16384 MB | 16384 MB | 16384 MB | 16384 MB | 16384 MB | 16384 MB | 16384 MB | 16384 MB | 16384 MB | 163

channel0: | 16384 MB | 16384 MB | 16384 MB | 16384 MB | 16384 MB | 16384 MB | 16384 MB | 16384 MB | 16384 MB | 16384 MB | 16384 MB | 16384 MB | 16384 MB | 163

----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

# ras-mc-ctl --layout

+-----------+

| mc0 |

----------+-----------+

memory31: | 0 MB |

memory30: | 32768 MB |

----------+-----------+

memory29: | 0 MB |

memory28: | 32768 MB |

----------+-----------+

memory27: | 0 MB |

memory26: | 32768 MB |

----------+-----------+

memory25: | 0 MB |

memory24: | 32768 MB |

----------+-----------+

memory23: | 0 MB |

memory22: | 32768 MB |

----------+-----------+

memory21: | 0 MB |

memory20: | 32768 MB |

----------+-----------+

memory19: | 0 MB |

memory18: | 32768 MB |

----------+-----------+

memory17: | 0 MB |

memory16: | 32768 MB |

----------+-----------+

memory15: | 0 MB |

memory14: | 32768 MB |

----------+-----------+

memory13: | 0 MB |

memory12: | 32768 MB |

----------+-----------+

memory11: | 0 MB |

memory10: | 32768 MB |

---------+-----------+

memory9: | 0 MB |

memory8: | 32768 MB |

---------+-----------+

memory7: | 0 MB |

memory6: | 32768 MB |

---------+-----------+

memory5: | 0 MB |

memory4: | 32768 MB |

---------+-----------+

memory3: | 0 MB |

memory2: | 32768 MB |

---------+-----------+

memory1: | 0 MB |

memory0: | 32768 MB |

---------+------------+

查看日志,可以确认是否ECC模块已发挥作用

# dmesg | grep ECC

输出类似

[ 39.890947] EDAC amd64: Node 0: DRAM ECC enabled.

[ 39.947001] EDAC amd64: Node 1: DRAM ECC enabled.

[ 40.008809] EDAC amd64: Node 2: DRAM ECC enabled.

[ 40.064882] EDAC amd64: Node 3: DRAM ECC enabled.

[ 40.109443] EDAC amd64: Node 4: DRAM ECC enabled.

[ 40.159722] EDAC amd64: Node 5: DRAM ECC enabled.

[ 40.238696] EDAC amd64: Node 6: DRAM ECC enabled.

[ 40.271722] EDAC amd64: Node 7: DRAM ECC enabled.

查看纠错提示,内存对应关系

注:UE、CE 分别为不可纠错和可纠错

# edac-util -rfull

mc0:csrow0:mc#0csrow#0channel#0:CE:0

mc0:csrow0:mc#0csrow#0channel#1:CE:0

mc0:csrow1:mc#0csrow#1channel#0:CE:0

mc0:csrow1:mc#0csrow#1channel#1:CE:0

mc0:csrow2:mc#0csrow#2channel#0:CE:0

mc0:csrow2:mc#0csrow#2channel#1:CE:0

mc0:csrow3:mc#0csrow#3channel#0:CE:0

mc0:csrow3:mc#0csrow#3channel#1:CE:0

mc0:noinfo:all:UE:0

mc0:noinfo:all:CE:0

mc1:csrow0:mc#1csrow#0channel#0:CE:0

mc1:csrow0:mc#1csrow#0channel#1:CE:0

mc1:csrow1:mc#1csrow#1channel#0:CE:0

mc1:csrow1:mc#1csrow#1channel#1:CE:0

mc1:csrow2:mc#1csrow#2channel#0:CE:0

mc1:csrow2:mc#1csrow#2channel#1:CE:0

mc1:csrow3:mc#1csrow#3channel#0:CE:0

mc1:csrow3:mc#1csrow#3channel#1:CE:0

mc1:noinfo:all:UE:0

mc1:noinfo:all:CE:0

mc2:csrow0:mc#2csrow#0channel#0:CE:0

mc2:csrow0:mc#2csrow#0channel#1:CE:0

mc2:csrow1:mc#2csrow#1channel#0:CE:0

mc2:csrow1:mc#2csrow#1channel#1:CE:0

mc2:csrow2:mc#2csrow#2channel#0:CE:0

mc2:csrow2:mc#2csrow#2channel#1:CE:0

mc2:csrow3:mc#2csrow#3channel#0:CE:0

mc2:csrow3:mc#2csrow#3channel#1:CE:0

mc2:noinfo:all:UE:0

mc2:noinfo:all:CE:0

mc3:csrow0:mc#3csrow#0channel#0:CE:0

mc3:csrow0:mc#3csrow#0channel#1:CE:0

mc3:csrow1:mc#3csrow#1channel#0:CE:0

mc3:csrow1:mc#3csrow#1channel#1:CE:0

mc3:csrow2:mc#3csrow#2channel#0:CE:0

mc3:csrow2:mc#3csrow#2channel#1:CE:0

mc3:csrow3:mc#3csrow#3channel#0:CE:0

mc3:csrow3:mc#3csrow#3channel#1:CE:0

mc3:noinfo:all:UE:0

mc3:noinfo:all:CE:0

mc4:csrow0:mc#4csrow#0channel#0:CE:0

mc4:csrow0:mc#4csrow#0channel#1:CE:0

mc4:csrow1:mc#4csrow#1channel#0:CE:0

mc4:csrow1:mc#4csrow#1channel#1:CE:0

mc4:csrow2:mc#4csrow#2channel#0:CE:0

mc4:csrow2:mc#4csrow#2channel#1:CE:0

mc4:csrow3:mc#4csrow#3channel#0:CE:0

mc4:csrow3:mc#4csrow#3channel#1:CE:0

mc4:noinfo:all:UE:0

mc4:noinfo:all:CE:0

mc5:csrow0:mc#5csrow#0channel#0:CE:0

mc5:csrow0:mc#5csrow#0channel#1:CE:0

mc5:csrow1:mc#5csrow#1channel#0:CE:0

mc5:csrow1:mc#5csrow#1channel#1:CE:0

mc5:csrow2:mc#5csrow#2channel#0:CE:0

mc5:csrow2:mc#5csrow#2channel#1:CE:0

mc5:csrow3:mc#5csrow#3channel#0:CE:0

mc5:csrow3:mc#5csrow#3channel#1:CE:0

mc5:noinfo:all:UE:0

mc5:noinfo:all:CE:0

mc6:csrow0:mc#6csrow#0channel#0:CE:0

mc6:csrow0:mc#6csrow#0channel#1:CE:0

mc6:csrow1:mc#6csrow#1channel#0:CE:0

mc6:csrow1:mc#6csrow#1channel#1:CE:0

mc6:csrow2:mc#6csrow#2channel#0:CE:0

mc6:csrow2:mc#6csrow#2channel#1:CE:0

mc6:csrow3:mc#6csrow#3channel#0:CE:0

mc6:csrow3:mc#6csrow#3channel#1:CE:0

mc6:noinfo:all:UE:0

mc6:noinfo:all:CE:0

mc7:csrow0:mc#7csrow#0channel#0:CE:0

mc7:csrow0:mc#7csrow#0channel#1:CE:0

mc7:csrow1:mc#7csrow#1channel#0:CE:0

mc7:csrow1:mc#7csrow#1channel#1:CE:0

mc7:csrow2:mc#7csrow#2channel#0:CE:0

mc7:csrow2:mc#7csrow#2channel#1:CE:0

mc7:csrow3:mc#7csrow#3channel#0:CE:0

mc7:csrow3:mc#7csrow#3channel#1:CE:0

mc7:noinfo:all:UE:0

mc7:noinfo:all:CE:0

相关文章

学美工在哪里学
桂晶晶(Gui Jingjing)
「指虎四指」拍賣商品優惠價格
《魔兽世界怀旧服》火焰之心在哪掉落 火焰之心掉落地点一览