【FLASH存储器系列十五】NAND Flash究竟能不能随机读写到某个字节的数据?

news2024/10/5 15:23:56

网上有很多文章写道,nand flash的读写操作是以page为单位,还有文章说些nand flash时必须按page0、page1、page2…的顺序写,必须先写完前面的page才能写后面的page。难道nandflash就不能随机读到某个字节吗?只能一次性读一页?为啥写要按顺序写?不就是选中某根字线的事吗?明明可以做到随机选中啊,大家在学习过程中是否有这些疑问,今天尝试解答一下。

先来回顾一下nand flash的阵列结构:

通常以32或64个存储单元组成一个漏源相接的存储串,每个串的两头各有一个源线SL和位线BL选通管。32或64根字线连接存储单元的控制栅。一组这样的存储串组成一个block,也就是说32或64根字线下挂的所有存储单元组成一个block,而一根字线下挂的所有存储单元组成一个page或多个page。通常情况下,对SLC来说,一个字线对应一个Page; MLC则对应2个Page,这两个Page是一对(Lower Page和UpperPage); TLC对应3个Page(Lower Page、UpperPage和Extra Page,不同闪存厂家叫法不一样)。一个Page有多大,那么字线上面就有多少个存储单元,就有多少个位线。还有将位线以奇偶划分的,此时的page数会翻倍。

一个 LUN(die)至少包含一个page寄存器和一个plane,也有一个LUN内含2个或4个plane。 每个plane对应一个page寄存器。通常,为了加快读写吞吐量,每个plane还会增加一个cache 寄存器,Cache读支持在传输前一个Page数据给主控的时候(Cache Register→主控),可以从闪存介质读取下一个主控需要读的Page的数据到Page Register(闪存介质→Page Register),这样数据在闪存总线传输的时间就可以隐藏在读闪存介质的时间里(或者相反,取决于哪个时间更长); Cache Program也是如此,它支持闪存写前一个Page数据的同时(Page Register→闪存介质),传输下一个要写的数据到CacheRegister(主控→Cache Register),这样数据在闪存总线传输可以隐藏在前一个Page的写时间里。当然,有两个Register的闪存也支持正常的读写模式,这时候,用户可以把Cache Register和Page Register看成是一个缓存。

再来回顾一下nandflash的寻址,ONFI协议规定了两种地址类型:列地址和行地址,列地址用来访问一个page中的字节和字。行地址用于寻址page,block或者LUN。看到这里大家就有疑问了,这不是有列地址可以访问一个page中的字节吗?如果是以page为基本读写操作单位,那要列地址干什么?

首先,nand flash的读写操作是以page为单位,这句话从nand阵列本身来说是没错的,我们分情况举例说明:

1、如果是操作一个连续存储的大文件,主机通过READ PAGE(00h–30h)命令,选中相应字线后,整个字线上的所有存储单元(就是一个page)的状态(管子是通还是断)就会呈现在各自的位线上,位线上的电平信息会全部传输到与page大小相同的cache寄存器中,这时并不关注列地址是多少,等到第一页全部传输到缓存寄存器后,再通过列地址寻址,在缓存寄存器中定位到列地址指示的字节,然后开始输出到IO,这个列地址之前的数据就不会输出了。之后可以继续发送READ PAGE(00h–30h)命令读接下来的页,接下来的列地址就都为0,就可以完成整页整页输出。为了加大吞吐量,可以使用cache操作,使用READ PAGE CACHE SEQUENTIAL (31h)命令,就可以在cache寄存器输出当前页的同时,将下一页的数据移动到page寄存器中,这里是自动寻址到下一页,不用每次再写地址,同时将IO传输时间段与阵列操作时间段重叠,可以有效提升吞吐量,读大文件通常用此命令。

2、如果是读一些分散的小文件,比如先读page0的第8个字节,然后再读page0的第1个字节。假设每次读都在阵列上做列寻址,那第一次用一个读命令,定位到第8个字节,将这个字节传输到cache寄存器中,然后通过IO输出这个字节,再读第1字节的时候,又要重复发命令、地址,最关键的是还要做一次阵列到cache寄存器的数据搬运,这个搬运的时间是比较长的,造成效率很低,显然开发者不会这么去设计一个存储器。再者,怎么做到从nand阵列里只移动某一个字节的数据出去也是个问题,我们知道ONFI规定的读命令里,只给了一个起始地址,并没有给要读多长的数据信息,读多少就看外部读使能信号RE或者时钟发多少周期,所以在nand flash芯片内部的地址解码,只能解出来page地址(也就是选中哪根字线)和列地址(缓存寄存器中的页内偏移),列地址并不是用来选中位线,因为列地址只是一个起始偏移,并不能告诉阵列是要选中这个偏移开始的8根位线,还是这个偏移开始之后的所有位线。所以综合来看,一定是先把一整页全部移动到cache寄存器中,然后再在寄存器里做页内偏移寻址,这样就在第一个读第8个字节的命令下,就把整页数据都移动到cache寄存器了,下一次读第1个字节就不用再访问阵列了,直接使用RANDOM DATA READ (05h-E0h)命令,改变缓存的列地址,就可以读第1个字节了。

所以综上所述,nand flash的读写操作是以page为单位,说的是nand阵列操作的确是以page为基本单位,同时nand flash也能随机访问到某个字节,操作原理是在cache寄存器中做偏移寻址。正是因为nand flash这种操作机制,他的小文件随机读写效率不高,要多次发命令、地址,数据在整个IO传输中的占比较低,不经济。但是它操作大文件很合适,效率很高。

接下来看nand flash时必须按page0、page1、page2…的顺序写吗?这句话也没错,但是得分情况,如果是MLC、TLC这些一个cell存放多个bit的情况,就需要按顺序写Page0、Page1、Page2…,原因是MLC一个存储单元包含两个bit,要先写Lower Page,再写UpperPage,这是工艺决定的,但是对于读操作就没有这个限制,同时,如果是SLC,也没有这个限制。

最后仍有一个疑问:既然阵列操作是整页进行的,用不着去选中位线,那位线上的位线选择器和源线选择器是干什么的?这个疑问求大佬赐教。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/195037.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

区区几行代码,就能全面实现 Python 自动探索性数据分析

探索性数据分析是数据科学模型开发和数据集研究的重要组成部分之一。在拿到一个新数据集时首先就需要花费大量时间进行EDA来研究数据集中内在的信息。自动化的EDA Python包可以用几行Python代码执行EDA。 在本文中整理了10个可以自动执行EDA并生成有关数据的见解的Python包&am…

C语言——二分查找与猜数字游戏

文章目录二分查找二分查找的思想二分查找的条件二分查找的实现过程代码举例猜数字游戏游戏说明猜数字游戏思想代码实现打印菜单打印主函数打印游戏函数整体代码演示二分查找 题目: 在一个有序数组中查找具体的某个数字n。 首先我们先定义一个110的数组 ,…

immersive-translate(沉浸式双语网页翻译扩展),解决谷歌翻译无法使用问题

前言 谷歌停止了大陆的谷歌翻译服务,所以找到了immersive-translate 插件解决翻译问题。当然 最直接就是 换个浏览器比如 Edge\Firefox等等。 主要特性 智能识别网页主内容区,区别于同类插件翻译网页所有的区域,这可以极大增强译文的阅读…

【C++11】右值引用与移动构造、万能引用与完美转发

目录 一、右值引用 1.1 左值引用和右值引用 1.2 左值引用与右值引用比较 1.3 右值引用的使用场景和意义 二、移动构造 2.1 移动构造的实现 2.2 移动赋值 2.3 默认成员函数 2.4 default关键字 2.5 delete 关键字 2.6 STL中的移动构造 二、完美转发 2.1 模板中的万能…

利用剪枝降低bfs算法的时空复杂度(一道OJ题目)

作者:非妃是公主 专栏:《算法》《刷题笔记》 个性签:顺境不惰,逆境不馁,以心制境,万事可成。——曾国藩 《算法》专栏系列文章 算法设计与分析复习01:主方法求递归算法时间复杂度 算法设计与分析…

我写了一个脚本,实现了图片分类问题的全自动化训练

众所周知,图片分类问题属于计算机视觉中比较容易解决的问题之一 但 这几天被数据集的问题搞得焦头烂额, 照理说分类问题的数据集应该比较好制作 但 如果之前没有现成的数据集 也会变得比较麻烦 直到我偶然发现了一个HuggingFace的图片搜索API 无限次调用 而且不需要身份验证 真…

【手撕面试题】HTML+CSS(高频知识点一)

目录 面试官:给定一个元素,如何实现水平垂直居中? 面试官:padding与margin有什么不同? 面试官:vw和百分比有什么区别? 面试官:行内元素与块级元素有什么区别? 面试官…

MapReduce实现TopN

目录 1、先导知识 2、案例 2.1 需求 2.2 代码实现 FlowBean类 Mapper类 Reducer类 Driver类 3、总结 1、先导知识 TreeMap底层是根据红黑树的数据结构构建的,默认是根据key的自然排序来组织(比如integer的大小,String的字典排序&…

一刷代码随想录——回溯算法

1.理论基础【1】本质回溯法也可以叫做回溯搜索法,它是一种搜索的方式。回溯是递归的副产品,只要有递归就会有回溯。因为回溯的本质是穷举,穷举所有可能,然后选出我们想要的答案,如果想让回溯法高效一些,可以…

线性DP与真题

目录 一、前言 二、最长公共子序列(lanqiaoOJ题号1189,类似于1054) 三、最长递增子序列 1、蓝桥骑士(lanqiaoOJ题号1188) 四、编辑距离 1、字符串转换(lanqiaoOJ题号1507) 五、网络图上的…

JavaScript两数之和

两数之和 两层for循环 // O(n^2) const twoNum function(nums,target){for(let i 0;i<nums.length;i){for(let ji1 ;j<nums.length;j){if(nums[i]nums[j]target){return[i,j]}}} }双指针 // 当数组为有序的时候O(n) const twoNum2 function(nums,target){let i 0 …

SpringCloud学习

由于Spring Cloud基于Spring Boot构建&#xff0c;而Spring Cloud Alibaba又基于Spring Cloud Common的规范实现&#xff0c;所以当我们使用Spring Cloud Alibaba来构建微服务应用的时候&#xff0c;需要知道这三者之间的版本关系。 目前Spring Cloud Alibaba的版本与Spring Bo…

1-1MySql复习

MySql复习 一 数据类型 数值 字符串 ​ char(5) 定长字符串 varchar(5) 可变长度字符串 日期 ​ timestamp 记录行数据的最后修改事件 二 基本查询 1 聚合函数 avg count sum max min 2 排序 order by ​ asc ​ desc 3 分组 group by … having … 分组通常跟…

Python语言的重要性(模式识别与图像处理课程作业)

Python语言的重要性&#xff08;模式识别与图像处理课程作业&#xff09;Python语言的重要性1 Python的优点主要有&#xff1a;1.1、简单1.2、易学1.3、速度快1.4、免费1.5、高层语言1.6、解释性1.7、面向对象1.8、可扩展性1.9、可嵌入性1.10、丰富的库1.11、规范的代码2 Pytho…

TCP/IP网络编程——套接字的多种可选项

完整版文章请参考&#xff1a; TCP/IP网络编程完整版文章 文章目录第 9 章 套接字的多种可选项9.1 套接字可选项和 I/O 缓冲大小9.1.1 套接字多种可选项9.1.2 getsockopt & setsockopt9.1.3 SO_SNDBUF & SO_RCVBUF9.2 SO_REUSEADDR9.2.1 发生地址分配错误&#xff08;B…

高效学 C++|编程实例之计算器

本节将实现一个能进行实数间加、减、乘、除运算的简易计算器。首先创建一个基于QWidget带界面的Qt项目&#xff0c;然后按照如下步骤进行操作&#xff1a; 01、计算器界面设计 在界面中拖入两个单行文本框和十七个按钮&#xff0c;按钮上显示的文字、按钮对象和单行文本框对象…

百分百拿捏offer的自动化测试面试题全套教程

最近很多咨询我&#xff0c;有没有软件测试方面的面试题&#xff0c;尤其是Python自动化测试相关的最新面试题&#xff0c;所以今天给大家整理了一份&#xff0c;希望能帮助到你们。 接口测试基础 1、公司接口测试流程是什么&#xff1f; 从开发那边获取接口设计文档、分析接口…

VUE3 指令 插槽

指令 指令是 Vue 模板语法里的特殊标记&#xff0c;在使用上和 HTML 的 data-* 属性十分相似&#xff0c;统一以 v- 开头&#xff08; e.g. v-html &#xff09;。 它以简单的方式实现了常用的 JavaScript 表达式功能&#xff0c;当表达式的值改变的时候&#xff0c;响应式地…

1x1卷积、Inception网络

目录1.1x1卷积(1x1 convolution)又称网络中的网络(network in network)池化层只能压缩图像的宽和高&#xff0c;1x1卷积能压缩通道数量&#xff0c;减少计算成本。如上图&#xff0c;输入维度的通道数为192&#xff0c;用32个1x1x192的filters&#xff0c;就能将输出的通道数压…

java基础—面试题一

文章目录1.和equals区别是什么&#xff1f;2.Java中的 <<、>>、>>> 是什么3.if-else-if-else与switch的区别4.while和do-while的区别5.switch 是否能作用在 byte 上&#xff0c;是否能作用在 long 上&#xff0c;是否能作用在String上6.&和&&…