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

闪存学习_1:Flash-Aware Computing from Jihong Kim

闪存学习_1:Flash-Aware Computing from Jihong Kim

  • 前言
  • 一、Storage Media:NAND Flash Memory
    • 1、概念
    • 2、编程和擦除操作
    • 3、读操作
    • 4、异地更新操作(Out-Place Update)
    • 5、数据可靠性
    • 6、闪存控制器(SSD主控)
    • 7、闪存转换层(Flash Translation Layer,FTL)
    • 8、Trim/unmap命令
    • 8、Scatter-Gather
  • 二、总结
  • reference

前言

  今天主要根据Jihong Kim老师的闪存教程进行学习,帮助我更好地扎实闪存的基础知识

一、Storage Media:NAND Flash Memory

1、概念

  闪存是非易失性存储芯片,具备电擦除和再编程的特性

闪存页

图:闪存页的架构,由多个闪存单元组成

  闪存块是一个阵列,每一行为一个页(page),编程和读操作均是以页为单位,擦除是以块为单位。
闪存块

图:闪存块图结构

2、编程和擦除操作

  闪存采用的是浮栅晶体管架构,通过在控制极(Control Gate)施加电压,往浮栅(Floating Gate)注入电子,实现编程操作,表示数据0。通过在衬底施加电压,将浮栅中存储的电子吸出,实现擦除操作,表示数据1。

浮栅晶体管细节

图1:浮栅晶体管结构

编程和擦除细节

图2:左图为擦除状态,浮栅中没有电子;右图为编程状态,浮栅中存储电子

过程

图3:左图为编程过程,控制极拉高电压;右图为擦除过程,衬底拉高电压

3、读操作

  通过施加一个介于擦除状态和编程状态之间的电压值,观察晶体管是否导通,实现读操作。

读操作

图4:读操作细节

  如下图所示,闪存中包含寄存器作为输入和输出数据的缓冲区,当执行读操作时,实际是将指定闪存页中的数据读取到寄存器中,再从寄存器通过IO总线读取到闪存控制器中。编程操作同理,执行编程操作时,实际是先将缓存中的数据存储到闪存的寄存器中,再从寄存器编程到指定闪存页。这个寄存器可以实现多个plane并行读写的功能,提升闪存并行性。
真实操作细节

图:硬件架构上的读写擦操作细节

4、异地更新操作(Out-Place Update)

  闪存具备写前擦除的特性,因此当要对某页已经保存在NAND Flash中的数据进行修改更新时,需要执行异地更新,即将原先位置的数据置为无效,再将新修改的数据编程到新的闪存页中。但是由于编程和擦除操作都需要对闪存单元施加较高的电压值,容易导致闪存单元磨损,出现漏电现象,从而导致数据错误。虽然可以通过闪存控制器中的ECC进行数据纠错保证数据正确率,但ECC的纠错能力有限,当数据误码率超过ECC纠错范围时,则数据永久丢失,即该闪存单元完全损坏。因此NAND Flash具有一定的生命周期。

5、数据可靠性

  数据可靠性不仅受上面提及的擦除和编程操作的影响,主要包括以下几个因素:

  1. 编程和擦除次数
  2. 闪存所处的温度
  3. 读次数
  4. 闪存的制作工艺

  而对于保证数据可靠性的解决方案就是通过闪存控制器将数据迁移到新的位置,类似于刷新操作

6、闪存控制器(SSD主控)

 &emsps;SSD主要由三部分组成,闪存控制器(主控)、固件和闪存。其中主控负责控制固件的运行,固件则对前后端数据进行处理,包括ECC、垃圾回收、磨损均衡、内存映射、坏块管理等,闪存控制器的出现为不完美的闪存芯片提供了更强的鲁棒性(robust)和可靠性,其与固件的结合形成了SSD控制器架构,主要由以下几个部分组成:

  1. 主机接口(Host Interface):这个接口通过相关协议实现主机端和SSD的交互,从而实现主机进行闪存访问操作和闪存控制器直接内存访问(DMA)。常用的接口包括SAS、SATA和PCIe。
  2. 闪存总线接口:总线连接闪存控制器和闪存芯片,这个总线往往包含多个channel通道,每个channel通道连接多个闪存芯片,提升闪存读写的并行性。
  3. 直接内存访问(Direct Memory Access,DMA)和直接闪存访问(Direct Flash Access, DFA):这两个缓冲区通过允许在没有CPU干预的情况下从内存(RAM)和闪存传输数据来提高CPU效率。
  4. ECC(错误检验和校对):这是一个关键的组件,可以对闪存中出错的数据进行校验,提升数据可靠性。对于高密度SSD更是不可或缺的组件。
  5. 其他组件:数据加密(Data Encryption)、数据扰码器(Data Scrambler)、缓存(SRAM)

  下面几张图是闪存控制器在SSD中的位置分布
SSD架构

图:SSD架构图

闪存控制器细节图

图:SSD控制器细节图

在这里插入图片描述

  一个闪存控制器连接到多个闪存通道(Channel),与闪存芯片进行交互。每个闪存通道都有自己的时钟频率,MT/s额定值(Million Transfer Per Second,每秒百万次数据传输,是以数据为单位)根据DDR进行配置。通道数量越多,SSD性能越好,但对于闪存控制器的要求就更高。
闪存控制器

图:一个channel连接4个闪存芯片,4个channel共同连接一个闪存控制器

7、闪存转换层(Flash Translation Layer,FTL)

  通过闪存转换层实现闪存的地址映射、垃圾回收和磨损均衡操作
闪存转换层

图:闪存转换层处于主机与SSD主控之间,为SSD系统软件
  1. 地址映射:由于闪存不能就地更新,当需要对数据进行修改更新时只能执行异地更新操作,因此FTL需要进行地址映射,将原先数据存储位置置为无效,再将新的存储位置更新到映射表中,使得后续可以通过映射表正确获取到数据的最新状态
  2. 垃圾回收:由于闪存具备写前擦除的特性,并且擦除操作是以块为单位的,因此,当闪存空闲空间不足时,会触发垃圾回收(Gabage Collection),则FTL就需要挑选一个受害块(victim block)执行擦除,执行有效数据的迁移,再执行受害块的擦除,更新映射表
  3. 磨损均衡:上面提到了当闪存单元频繁执行编程和擦除操作时会导致闪存单元彻底损坏,因此为了避免这个问题,FTL通过磨损均衡算法监测每个闪存块执行的编程和擦除次数,将热数据迁移到磨损较轻的闪存单元中,将冷数据迁移到磨损较重的闪存单元中,平衡热块和冷块的磨损程度。

8、Trim/unmap命令

  Trim是内置于ATA命令中的SSD命令,对应的SCSI命令是Unmap,是磁盘与计算机交互方式的一部分。当我们在操作系统中删除一个文件时,系统为了避免影响后续请求的执行性能,没有立即向驱动器发送信号以直接在SSD擦除这些数据,而是在内存中将这些数据占用的地址标记为空,但SSD本身并不知道那些地址对应的数据已经无效。因此,操作系统通过间歇发送TRIM命令到SSD,使SSD知道对应哪些物理地址无效,从而方便SSD执行垃圾回收时对受害块(victim block)的选择,以及可以实现在后台对受害块进行预删除使其可以直接被写入。既提升SSD性能,也能降低垃圾回收的开销,延长SSD寿命。

8、Scatter-Gather

  通过scatter-gather 可以提升数据的传输速率。传统的DMA一个命令只能传输物理上连续的一个块的数据,完成传输后发起中断。而采用了scatter-gather之后,通过用一个链表记录每个物理上不连续的数据块的首地址和长度,从而允许一个DMA命令一次传输多个物理上不连续的块,完成后发起一起中断,从而极大程度降低了发起中断的次数,提升了数据传输效率。

二、总结

  这是今天对闪存的学习成果,各种参考资料也都放在下面了。如果有什么不对的地方,欢迎大家批评指正!

reference

1.https://drive.google.com/file/d/1Umrlua-gX3deXkR9yZOAMq1A6nPIaxLF/view
2.https://semiengineering.com/four-steps-to-verifying-an-ssd-controller-with-emulation/
3.https://www.delkin.com/blog/understanding-nand-flash-based-ssd-drives-and-the-flash-controller/
4.https://blog.csdn.net/lanseliuxing/article/details/135359240
5.https://blog.csdn.net/wylfengyujiancheng/article/details/120435464
6.https://www.crucial.cn/articles/about-ssd/what-can-trim-do
7.https://blog.51cto.com/xmwang/1678350
8.https://blog.csdn.net/lichengtongxiazai/article/details/40398711

http://www.lryc.cn/news/474309.html

相关文章:

  • 如何将本地项目上传至Gitee仓库(详细教程)
  • redis详细教程(3.hash和set类型)
  • 性能测试详解
  • 修改ruoyi的logo和标题
  • vue系列==vue3新语法
  • 001-Kotlin界面开发之Jetpack Compose Desktop学习路径
  • qt QStackedLayout详解
  • python实现钉钉群机器人消息通知(消息卡片)
  • 防火墙技术应用
  • docker engine stopped
  • Redis- 内核的分配内存限制的警告“WARNING Memory overcommit must be enabled!”
  • 腾讯云在线扩容数据盘
  • Time Travel Queries|在 RisingWave 中访问历史数据
  • Unity之UnityWebRequest
  • 使用 pkg 打包 Puppeteer 应用:跨平台自动化的轻量级选择
  • 【Flask】三、Flask 常见项目架构
  • AI机西使用体验:你不知道的强大功能揭秘!
  • 什么是护网(HVV)需要什么技术?(内附护网超全资料包)
  • opencv优秀文章集合
  • php处理文件上传的五种方式
  • C#与C++交互开发系列(十一):委托和函数指针传递
  • 【window】补充一些powershell基本命令
  • 精准触达用户,私域三步法!
  • Tcl脚本介绍(一)
  • 安全运营 -- 监控linux命令history
  • MyBatis3(动态SQL 常用的动态SQL 元素 映射器注解 基本注解 结果映射注解)
  • C#自定义事件的案例
  • flume系列之:flume机器做条带划分提高磁盘性能和吞吐量的详细步骤
  • C++基于opencv的视频质量检测--图像清晰度检测
  • 力扣11.1