汉明码对数据的纠错&ECC内存

# 0x00

在过去一年的工作里,大多数时间都在做的内容是私有化交付,大概就是 Bazel 打包某些应用到 Linux 下部署,开发的任务相对其他同学来说比较少,也很久没有接触到算法了。

最近被分配到另一个组里(data组)也就是数据持久化的一个组,然后我在悄悄学习一些数据相关的技术。

今天本来是想上网去找EC算法(ErasureCode)的资料,结果突然看到了 ECC 内存使用的汉明码,然后突然想起来,以前学校里学过这个东西,但是只停留在怎么用这个层级,不知道原理是什么。

今天我们来回顾一下学生知识:

# 0x01

假设我们有一组数据要传输或者储存,为了计算方便我们将数据的长度设置为11位,也就是说11个数据位

假设数据就是 0010 0011 010 然后我们会在这些数据里去插入一些校验位,分别在 $2^0, 2^1, 2^2, 2^3$ 加入四个校验位。

为了方便,我把数据放进表格里,然后打上标志

A0 A1 A2 0
A3 0 1 0
A8 0 0 1
1 0 1 0

我先说不说 A 相关的比特位的产生规则,我先直接填充上。

0 1 1 0
1 0 1 0
1 0 0 1
1 0 1 0

并且把所有表格按照二进制顺序排序,0000,0001,0010,0011……1111,

然后把所有1位置对应的二进制描述全部按顺序列出来

1
2
3
4
5
6
7
8
0001
0010
0100
0110
1000
1011
1100
1110

上面这些数位按位异或,就会得到0000,校验就会成功。

# 0x02

书上说这么校验,但是我一直不知道为什么,知道看了茶谈硬件的视频以后才知道。

x 1 2 3 4
A0 A1 A2 0
A4 0 1 0
A8 0 0 1
1 0 1 0

刚才个表格是这样生成的,A1 是用来给

Last updated on Apr 25, 2024 08:46 UTC