当前位置: 首页 > news >正文

SSD LDPC软错误探测方案解读

上一篇文档中,基于SSD LDPC(Low-Density Parity-Check Codes)原理背景和纠错能力作了简单的介绍。

扩展阅读:

  • 关于SSD LDPC纠错能力的基础探究

  • 浅析LDPC软解码对SSD延迟的影响


本篇结合SMI发布的研究成果,通过SSD控制内部LDPC更底层的架构,来解读如何增强软错误探测能力和抗噪声干扰能力。

图片

在固态硬盘SSD模块级别,噪声源主要有以下几类:

  1. 控制器外部数据传输总线噪声:比如PCIe总线,以及与DRAM缓存和闪存芯片之间的接口。这些接口在高速数据交换过程中会产生电磁干扰,影响数据的准确传输。

  2. NAND编程/读取/擦除操作噪声:NAND闪存的P/E(编程/擦除)周期中,由于电荷迁移、漏电流等因素,尤其是在高密度QLC存储单元中,噪声和各种干扰现象会变得更严重。

  3. 辐射诱导的软错误:宇宙射线等放射性粒子对电子设备中的存储单元造成单粒子翻转(Single Event Upset, SEU),导致数据位错误。

  4. 其他噪声:除了上述明确提及的噪声源外,还有诸如电源波动、温度变化、器件老化等其他不确定因素产生的噪声。

为了对抗这些噪声导致的数据错误,SSD模块采用了ECC技术。ECC能够检测和纠正部分错误,通过将数据编码成带有冗余信息的编码字(codewords),可以区分出可纠正错误和不可纠正错误,同时也能够识别出可检测错误和未被检测出的错误。

在固态存储中,数据通常会被划分为多个数据块(Chunks),每个数据块除了包含用户数据外,还会附加额外的信息,如HE2E、元数据(Meta)、种子(Seed)、CRC校验值以及LDPC奇偶校验码。

图片

LDPC奇偶校验完整性检查是一个确保基于LDPC编码的数据在写入或读取过程中不遭受意外损坏的关键环节。在数据写入NAND闪存前,首先需要对用户数据和相关辅助信息进行LDPC编码生成相应的奇偶校验位,这些奇偶校验位包含了足以恢复潜在错误的信息。LDPC编码器本身包含了大量的组合逻辑和寄存器结构,甚至包括只读存储器(ROM)部分,以实现复杂而高效的编码过程。

图片

在实际操作中,由于宇宙射线等自然现象引发的单粒子翻转(Single Event Upset, SEU)可能会导致LDPC奇偶校验位出现错误。为了避免这种情况导致的无效写入,必须在数据从控制器传输至NAND的过程中对LDPC奇偶校验的完整性进行即时检查。如果检测到奇偶校验位错误,则跳过编程指令,避免将错误的奇偶校验信息写入NAND,而是重新进行编码后再尝试写入。

此外,在数据读取阶段,同样会进行多重验证以确保数据的准确无误。读取的数据不仅通过LDPC解码器来尝试纠正潜在的软错误,同时还需要通过CRC校验来验证整个数据块的完整性。另外,介质端到端(Media End-to-End, E2E)信息的比较也是重要的一环,通过对比原始写入时记录的E2E信息与当前读出的数据进行一致性校验,确保即使是在错误的位置上但内容仍然可纠正的数据块能够被正确识别和处理。

在SSD控制器设计中,LDPC解码器作为一个强大的错误纠正工具,用于修复在数据路径中发生的大部分软错误。通过LDPC编码和解码技术,可以有效地检测并修复由噪声或者其他不可预见因素引起的错误位。

图片

当错误被检测到时,会执行读重试操作,这是高效错误恢复步骤的一部分,体现了LDPC解码器在纠正偶尔错误方面的灵活性和效率。除了LD

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • C语言分析基础排序算法——交换排序
  • 仓库管理中三防手持终端应用的小知识!
  • ElasticSearch为什么快?
  • Linux:kubernetes(k8s)探针LivenessProbe的使用(9)
  • JavaEE进阶(14)Linux基本使用和程序部署(博客系统部署)
  • 【解决】虚幻导入FBX模型不是一个整体
  • java上传本地文件到服务器共享
  • LeetCode_25_困难_K个一组翻转链表
  • 开源计算机视觉库OpenCV详解
  • 《自私的基因》读书笔记
  • 初级代码游戏的专栏介绍与文章目录
  • 代码随想录算法训练营day53|第九章 动态规划part14
  • 关于springboot一个接口请求后,主动取消后,后端是否还在跑
  • SQLite3中的callback回调函数注意的细节
  • spring 技术100问?
  • 【从零开始安装kubernetes-1.7.3】2.flannel、docker以及Harbor的配置以及作用
  • canvas绘制圆角头像
  • Java 网络编程(2):UDP 的使用
  • mysql innodb 索引使用指南
  • nginx 负载服务器优化
  • PAT A1120
  • python学习笔记 - ThreadLocal
  • rc-form之最单纯情况
  • SpringBoot 实战 (三) | 配置文件详解
  • vue从创建到完整的饿了么(18)购物车详细信息的展示与删除
  • Zepto.js源码学习之二
  • 百度小程序遇到的问题
  • 程序员最讨厌的9句话,你可有补充?
  • 关于Flux,Vuex,Redux的思考
  • 基于遗传算法的优化问题求解
  • 看域名解析域名安全对SEO的影响
  • 名企6年Java程序员的工作总结,写给在迷茫中的你!
  • 一个普通的 5 年iOS开发者的自我总结,以及5年开发经历和感想!
  • MPAndroidChart 教程:Y轴 YAxis
  • ​​​​​​​开发面试“八股文”:助力还是阻力?
  • ​secrets --- 生成管理密码的安全随机数​
  • ​人工智能之父图灵诞辰纪念日,一起来看最受读者欢迎的AI技术好书
  • #Linux(权限管理)
  • (Matlab)基于蝙蝠算法实现电力系统经济调度
  • (pojstep1.3.1)1017(构造法模拟)
  • (二十三)Flask之高频面试点
  • (计算机网络)物理层
  • (离散数学)逻辑连接词
  • (牛客腾讯思维编程题)编码编码分组打印下标题目分析
  • (亲测成功)在centos7.5上安装kvm,通过VNC远程连接并创建多台ubuntu虚拟机(ubuntu server版本)...
  • (贪心 + 双指针) LeetCode 455. 分发饼干
  • (转)用.Net的File控件上传文件的解决方案
  • (转载)Linux网络编程入门
  • ***监测系统的构建(chkrootkit )
  • .NET C# 使用 SetWindowsHookEx 监听鼠标或键盘消息以及此方法的坑
  • .NET Core 实现 Redis 批量查询指定格式的Key
  • .NET Core 项目指定SDK版本
  • .net mvc 获取url中controller和action
  • .NET 使用配置文件
  • .NET/C# 中你可以在代码中写多个 Main 函数,然后按需要随时切换