本文主要是介绍关于NAND的LBA到PBA的映射,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
关于NAND的LBA到PBA的映射
- LBA
- PBA
- LBA到PBA的映射;
- 映射表的设计思路;
LBA
LBA是logic block address 的概念,其实是个比较古老的概念了,甚至有点快过时了
LBA是用户侧表示的一个逻辑概念,表征一个数据块的逻辑编号;
目前主流的比如SSD产品是以512B为单位;
比如512G的硬盘,对应的LBA的个数为从0到(51210241024*1024/512 -1) ;
通过计算器计算至少需要30个bit 为才能完整表征512G的盘的LBA;
如果是1T的盘就是31bit;
2T的盘就是32bit 了;
我们在此还是以512G为例说明,并且我们可以使用一个整型int LBA 表示信息;
PBA
PBA则是physical block address的概念
前面关于NAND的block中其实已经有关于PBA的说明了,请翻看下前面的博客;
PBA包含基本的物理信息,比如block/page/page-offset/lun/plane/CE/CH等信息;
因为block/page/page-offset/lun/plane/CE/CH 这些信息在产品设计完成后都是固定值
所以你也可以计算出这每个值需要占用多少bit位,总共需要占用多少bit位;
假设此处我们也用总共32bit表示这些信息,那我们可以定义一个整形int PBA表示这些信息;
当然如果你说你的产品内存空间超级大,你可以可以把block/page/page-offset/lun/plane/CE/CH每个参数设计为1个int;那映射表的空间就会超级翻倍了;
LBA到PBA的映射;
前面已经举例说明了LBA的数据为int LBA; PBA的数据为int PBA;
那怎么表征二者的映射关系?
最简单的模式就是设计一个结构体,把2个变量放一起就可以了
struct map {int LBA;int PBA}
唯一的一个LBA对应唯一的一个PBA;
然后设计一个数组或者链表来记录每个LBA到PBA的映射关系
比如 map mapArray [LBA-max-count]
好的,映射设计完成了;
但是此时有以下问题,请大家计算下;
1.按照这种方法,一个全量的map表需要占用多少空间?
2.读IO的时候在这种全量的map表中搜索某个映射关系,怎么做到又快又好?
3.写IO的时候对应的LBA的映射关系会发生变化,怎么更新这张表?
映射表的设计思路;
此处的设计只是一种最简单原始的设计;
映射表的设计需要考虑控制器的内存,对读IO的速度的影响,对写IO的速度的影响;
怎么设计出一个简单又实用的映射表,需要结合具体的产品进行设计优化;
此处只是抛砖引玉,请大家考虑下你是否有更好的映射表的设计思路;
这篇关于关于NAND的LBA到PBA的映射的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!