众所周知,除了 ECC 内存之外,还有其他方法可以帮助避免由于宇宙射线翻转 RAM 内存单元(位翻转问题)而导致的数据丢失:
位翻转问题是什么:
纠错程序:
RAM 镜像的 BIOS 实现:
- https://www-thomas--krenn-com.translate.goog/de/wiki/RAM_Mirroring?_x_tr_sl=auto&_x_tr_tl=en&_x_tr_hl=en-US&_x_tr_pto=wapp
- https://web.archive.org/web/20230114220407/https://www-thomas--krenn-com.translate.goog/de/wiki/RAM_Mirroring?_x_tr_sl=auto&_x_tr_tl=en&_x_tr_hl=en-US&_x_tr_pto=wapp
软件实现:
软ECC
https://web.archive.org/web/20230119082028/https://pdos.csail.mit.edu/papers/softecc:ddopson-meng/softecc_ddopson-meng.pdf https://web.archive.org/web/20230114103624/https://pdos.csail.mit.edu/papers/softecc%3Addopson-meng/softecc_ddopson-meng.pdf
2023 年,哪些软件解决方案(例如内核实现或附加程序)可在 Linux Mint21 和 LMDE5 下使用?可能是使用类似于 ZFS RAIDZ 的端到端哈希技术,但适用于工作 RAM 内存而不是硬盘。
可能的实际解决方案的提示:
镜像内存支持:
- https://web.archive.org/web/20230114231952/https://lwn.net/Articles/897734/
- https://web.archive.org/web/20230114232055/https://www.fujitsu.com/jp/documents/products/software/os/linux/catalog/LinuxConJapan2016-Izumi.pdf
- https://web.archive.org/web/20230114232143/https://www.phoronix.com/news/Linux-AArch64-Mirrored-Memory
- https://www.micron.com/-/media/client/global/documents/products/technical-note/nand-flash/tn2971_software_bch_ecc_on_linux.pdf
- https://linux.kernel.narkive.com/cxqgDQlR/software-based-ecc
- https://dspace.mit.edu/handle/1721.1/36769
答案1
基本上,以任何有意义的方式,您都需要硬件支持来修复内存错误,因为您的 CPU 并未设计用于执行任何错误检查或添加纠错信息:软件假定从 RAM 读取的数据是正确的。
当软件从 RAM 读取值时,它会通过一些“加载”指令告诉 CPU 它想要从内存中获取某个位置。 (这与从 ZFS 读取数据时发生的情况非常不同)
作为操作系统或其他软件,您几乎没有机会拦截未修改的软件中的读取内容 - 您所能做的就是每一个用户态读取失败,然后从内存中加载相应的页面,进行错误检查,最后返回值;除非您放弃每次将虚拟内存地址转换为线性内存地址的查找表,并使所有缓存无效,否则它在系统上每 4kB 页精确工作一次。结果是你的系统会变得超级慢——我们这里谈论的是奔腾1,因为速度上的大多数优势都来自于不这样做。如果您想要一台带有错误检查内存的非常慢的机器,我确信有硬件回收商可以为您在带有 ECC RAM 的旧服务器硬件上节省很多钱!
SoftECC 论文提出了一个实际上不适用于任何现实世界问题的解决方案:您需要实现“过时内存页面检查”(它无法保护经常写入的页面,尽管由于邻近效应,这些页面是实际上,您需要保护的那些,请参阅 Linux 中的 Row Hammer)(在现代系统上祝您好运),但您仍然会遇到巨大的性能下降。
现在,如果您正在考虑实际修改您的软件以包含完整性检查本身,那么这是可行的。例如,假设您实际上正在编写一个在 RAM 中具有大量数据缓存的数据库服务器 - 您可以自己轻松地实现校验和和更正。但接下来的问题就变成了特定应用程序的开发和通道编码问题,而不是系统上运行的所有软件的通用 RAM 保护方案。
老实说,ECC 内置于当前一代的台式机 CPU 中,许多主板都支持它,而且 ECC RAM 并没有那么昂贵:如果您需要 ECC,从架构的角度来看,硬件是实现它的正确位置,不是软件。