首页 > 其他分享 >FTL没有映射管理,跟上班没有钱有什么区别

FTL没有映射管理,跟上班没有钱有什么区别

时间:2023-06-27 17:35:49浏览次数:39  
标签:逻辑 映射 Flash 写入 page 上班 FTL Block

大家好,我是五月。

前言

FTL(Flash Translation Layer),即闪存转换层,是各种存储设备的核心算法,作用是将Host传下来的逻辑地址转换成物理地址,也就是映射。

可以说,地址映射是FTL最原始最基本的功能。

 

为什么需要映射

NAND Flash最大的问题就是不能像内存一样随意写入。

根据Flash的特性能知道,写入page之前需要先将所在的Block擦除。

按照这种准则,市面上出现的Flash根本不能使用,其一,性能会很差,瓶颈限制在块擦除上,其二,持续不断对同一Block擦除,会导致Block在短时间内磨损,很容易造成存储数据丢失。

映射的观念出来后,数据不会直愣愣的写入原来的page页/Block块,而是重新映射到新的page页/Block块中,按照这个思路引导,Flash中所有的存储空间都可以按照这种page/Block映射方式进行管理。

用户肉眼看到的,是连续的逻辑地址组成的空间,实际在Flash当中,一段数据的存储很有可能是不连续的。

映射种类

首先要知道,映射种类有仨:

1. 块映射
2. 页映射
3. 混合映射(块映射+页映射)

块映射

以Block为映射单位,一个逻辑块可以映射到任何的物理块上,所以块内每一页的偏移不变。

还需要映射表来记录逻辑块和物理块之间的映射关系。

优点:因为映射表只需要块的映射,所以映射表所占空间小。

缺点:性能差。如果用户要操作一个逻辑页的话,就需要把整个块的数据读取出来,再修改逻辑页,再写入flash当中,所以小尺寸数据写性能极差。

页映射

以page为映射粒度,一个逻辑页可以映射到任何的物理页上,所以块内每一页的偏移变化多端。

需要映射表来记录每一逻辑页与物理页之间的映射关系。

优点:用户可随时操作某一逻辑页,直接将数据写进对应物理页,方便快捷,性能极好。

缺点:由于每一逻辑页与物理页都有一张映射表,并且页的数量远远要比块的数量多得多,所以映射表所占空间极大。

用个例子就很好理解了:

假设有个256G的Flash,page大小为4KB,那么一共就有64M(256G/4KB)个page,也就是说需要64M个映射表,假设每个映射表占用4个字节,那么整个映射表大小就为64M*4 = 256M。

一般来说,整个映射表的大小不宜超过Flash容量的千分之一。

混合映射

混合映射是块映射和页映射的混合产物,外面经常说的Hybird level mapping就是说的它。

一个逻辑块可以映射到任何的物理块上,块内采用页映射方式,块内逻辑页可以映射到对应物理块内任何物理页上。

市面上大部分用的映射方式都是Hybird映射方式。

HyBird的映射操分为两级:

第一级是data_log,数据以page的维度写入log,这个log一般是SLC;

第一级是data_Block,当data_log写满后,数据会合并到data_Block中。

data_log由于数量有限,可以采用页映射的方式写入数据,data_Block容量比较大,所以采用块映射的方式写入。

所以在性能和所占空间都介于块映射和页映射之间。

以下是不同映射之间的比较:

 

映射原理

Host是通过发送逻辑地址 LBA 来访问Flash的,每一个LBA大小为 1Sec。

每一个Sec大小各有不同,有512B、4KB、8KB,业内常称为一包数据,大部分情况下都是512B。

因为PC端操作磁盘的方式,都是以Sec的方式发送命令的,操作其他存储设备比如U盘,SD卡也是一样,不会改变。

写过程

Flash是以page为单位进行写的,所以Host发送的 LAB+数据并不会立马就写进入,而是会先在Dbuf缓存起来,直到凑成了1page的数据量,才会写进Flash中。

用户每写入1page数据,FTL会先去找映射,看看LBA有没有对应的映射关系,如果没有找到,就会找一个物理页吧用户数据写入,同时新建一条映射。

那么,用户逻辑地址和物理地址的一条映射就生成了。

每写入一个逻辑页,就会有一条映射表产生或者更新。

读过程

用户读取某一个区域,发送LBA进行访问时,FTL就会先在映射表池里找呀找,找到与LBA对应的映射表,FTL就知道要在Flash的哪个物理页把数据读出来了。

如果读过程没有找到映射表,那么读取过程失败。

映射表位置

DRAM

大多数存储设备都有板载DRAM,映射表就能存储在DRAM上

作用:可以快速访问映射表,快速读写

缺点:随着映射表越来越多,所占DRAM就会越来越大,提高了成本和功耗。

 

Flash

后来的主流是映射表大部分被存在于Flash中,当下要用的小部分映射表存于DRAM中。

作用:降低成本和功耗,还可以避免掉电带来的映射信息损失,另外Flash空间很大,映射表想放多少放多少。

Host发送LBA的时候,FTL会先在DRAM中寻找,如果没有找到对应的映射表,就会去Flash中读取映射表,再根据映射关系操作对应的物理页。

缺点:需要读取两次Flash,一次映射表,一次用户数据,底层带宽减小了,对于随机操作来说,就显得效率低了一点。

 

映射表更新

随着映射表的增加、删除、覆盖,到了某个时刻就要把映射表写进Flash保存起来,避免掉电时发生大量映射表丢失。

时不时将映射表写进Flash,就算发生了突然的异常掉电,丢失的也只是小部分映关系,后面还能通过重建映射表恢复回来。

映射表的写入时刻

1. 新生的映射表数量积累到一定的阈值
2. 用户写入的数据量积累到一定的阈值
3. 空闲闪存块的剩余数量达到一定的阈值

写入策略

1. 全部更新

将所有的映射表,无论是新产生的还是原先就有的,全部一股脑写入Flash中。

优点:固件实现简单,不用去考虑哪些映射表是新的,哪些是原本就有的。

缺点:写入数据量多,影响性能和延时,还会增加写入放大。

2. 增量更新

只把新产生的映射表写入Flash中。

优点:新增写入的数据量少,性能好,时效高。

缺点:固件实现复杂,还得区分那么那么些是新增的映射表,哪些是被覆盖的。

选择哪种写入决策,应根据硬件架构,结合实际情况考虑。

好了,这次先写到这儿,祝各位生活愉快。

 

标签:逻辑,映射,Flash,写入,page,上班,FTL,Block
From: https://www.cnblogs.com/wuyue525/p/17509481.html

相关文章

  • MyBatis的映射关系
    MyBatis的映射关系是有一个默认的,采用下划线命名的方式将数据库表的列名按照驼峰式映射成Java实体类的属性名举个例子数据库表名为 tb_user,其中的字段名为 inst_code,对应的实体类属性名为 instCode,这样不用自定义映射关系,会默认二者相对应的我们也可以自定义映射关系以一......
  • Linux安装花生壳进行端口映射内网穿透
    1下载1.1官网下载进入 花生壳 官网,选择linux版安装包,下载,上传到服务器 1.2wget下载wget"https://down.oray.com/hsk/linux/phddns_5.2.0_amd64.rpm"-Ophddns_5.2.0_amd64.rpm 2安装执行命令rpm-ivhphddns_5.2.0_amd64.rpm安装成功......
  • Mybatis 使用汇总(介绍,功能,连接池,日志,注解,XML映射文件)
    Mybatis介绍Mybatis功能Mybatis连接池mybatis日志Mybatis注解MybatisXML映射文件01.Mybatis是一款优秀的持久层框架(DAO),它支持自定义SQL、存储过程以及高级映射。MyBatis免除了几乎所有的JDBC代码以及设置参数和获取结果集的工作。MyBatis可以通过简单的XML......
  • 前端实现权限控制 - 三种方法 - 不同的角色有不同的路由映射
     有代码:https://gitee.com/zhu-longxu/zhulx-rbacps:注意本地路由router有哪些规则?服务器返回的数据格式? 方法一:本地路由router包含静态路由规则;虽然动态路由规则定义了但是没有注入;动态路由规则在登录判断的时候选择性是否注入;服务器返回数据格式 [ "news", "cat......
  • 添加 拼音分词器 与 IK分词器 后的 映射结构与实体类(hotel)【ElasticSearch】
    1、索引库//酒店数据索引库PUT/hotel{"settings":{"analysis":{"analyzer":{"text_anlyzer":{"tokenizer":"ik_max_word","filter":"py"......
  • idea的创建与使用mapper映射文件
    一.创建mapper映射文件在设置中模板<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPEmapperPUBLIC"-//mybatis.org//DTDMapper3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mappernamespace="&......
  • fixmap 地址映射
    在系统启动的汇编阶段,为kernelimage、dtb建立了临时页表,开启了MMU,进入了虚拟空间的世界,进入到start_kernel,内核要访问内存,要访问IO地址空间,那么就必须要为物理地址建立页表,以实现物理地址和虚拟地址之间的映射。在内核初始化前期,内存管理系统还未初始化,现在除了临时页表外,主要......
  • [Leetcode] 0706. 设计哈希映射
    706.设计哈希映射点击跳转至leetcode题目描述不使用任何内建的哈希表库设计一个哈希映射(HashMap)。实现MyHashMap类:MyHashMap()用空映射初始化对象voidput(intkey,intvalue)向HashMap插入一个键值对(key,value)。如果key已经存在于映射中,则更新其对应的值v......
  • 【Unity3D】法线贴图和凹凸映射
    1法线贴图原理​表面着色器中介绍了使用表面着色器进行法线贴图,实现简单快捷。本文将介绍使用顶点和片元着色器实现法线贴图和凹凸映射,实现更灵活。​本文完整代码资源见→法线贴图和凹凸映射。​1)光照原理​Phong光照模型和BlinnPhong光照模型是应用比......
  • .Net6 增加AutoMapper自动映射
    概述1、什么是AutoMapper简单来说,AutoMapper就是一个用C#语言开发的一个轻量的处理一个实体对象到另外一个实体对象映射关系的组件库官网地址:AutoMapper文档地址:AutoMapper—AutoMapperdocumentation 2、为什么要用AutoMapper层与层之间的......