LBA(Logical Block Address),表示用户操作(读写)数据的位置。
PBA(Physics Block Address),表示数据在硬盘的真实位置。
在HDD时代,数据可以覆盖写,LBA和PBA直接对应不会更改。但是SSD时代,由于NAND特性,LBA所对应的PBA映射关系是不断修改着的。
LBA size理论上是可以分为512B和4096B,根据8字节PI的位置又分为 DIF (Data Integrity Field 512+8) 和DIX (Data Integrity Extensions 分开存) 。
但为了向前兼容,LBA是以sector(512B)为单位顺序排列。NVMe SSD在创建namespace和format时,LBA相关的参数一般只支持设置512B格式,例如Samsung,Intel。当然也有国内的厂商支持按照namespace分别设置LBA 为512或4096,这样对全盘整体的性能来说是不好的。也有国内厂商设置其中某个namespace LBA size为512/4096时,所有的namespace LBA size都随着变。
1. nvme id-ns /dev/nvme*n* | grep "lbaf" -A 6
(smartctl -a /dev/nvme*n* | grep "Supported LBA" -A 8)
hdparm -I /dev/sd*
以上可以查看到LBA 支持的情况
2. nvme create-ns /dev/nvme* -s 100000 -c 100000 -f 0 -d 0 -m 0
这个命令的-f 就是填的LBA支持列表里的序号,[ –flbas=, -f ] — FLBA size
nvme format /dev/nvme* -l 0
这个命令的-l就是填的LBA支持列表里的序号。
LBA不能直接映射到PBA,需要通过中间的转换HA<->FA找到PBA。LBA计算出HA,HA根据映射表找到FA,FA根据位置计算出PBA。
LBA Addr,这里根据 容量/512B 计算出sector数量。按顺序依次是0 ~n-1,每8个(4k)捆一起依次计算HA位置。
HA(Host Addr),4Bytes hpage。这里我画的比较简单,实际上hpage有按照行列规律分为segmt和block。
FA(Flash Addr),4Bytes。根据容量不同CH/CE/Plane/block/page个数不同在4Byte中的位置分布也可能不一样。比如CH 4个只需要2个bit,8 channel就需要3个bit,16channel要4个bit。
PBA Addr,就是FA中的值表示的真实地址。
H2F表格的索引是HA,存放的值是FA。存在NAND中或static SLC block存放。
F2H表格的索引是FA,存放的值是HA。存在Data block的bank末尾。F2H metadata存放在每个page的meta data中,在端到端保护章节有介绍。