6.1 Block Translation Table (BTT) Background
定义个一个连续地址的非易失性的namespace,就是将一整个namespace 拆分成一个个block,其中的地址保存至BBT(块转换表),这样可以防止扇区撕裂(由于电源问题导致的写入部分中断)等问题。定义了用于Block I/O 操作的layout和规则。类似于SCSI的logic Unit(LUN)或者Nvem 的namespace.(注:用于描述内存空间的 table)
BTT Layout 中描述的BTT arena,然后最小是16MiB,最大是512GiB,若是大于512GiB就需要划分成多个BTT Arena。根据BTT layout 以及Rule 可以不读取源数据,依靠BTT size 来定位每一个BTT Arena.
6.2 Block Translation Table (BTT) Data Structures
6.2.1 BTT Info Block
数据结构定义:
typdef struct _EFI_BTT_INFO_BLOCK {CHAR8 Sig[EFI_BTT_INFO_BLOCK_SIG_LEN]; // Shall be “BTT_ARENA_INFO\0\0”.EFI_GUID Uuid;//创建BTT Arena 的时候创建,而且在同一个namespace 的UUID是同一个EFI_GUID ParentUuid; //包含namespace的UUID,用于验证BTT的信息,确认是当前的Namespace的,而不是之前的同一个设备的BTT信息。UINT32 Flags;UINT16 Major; UINT16 Minor;UINT32 ExternalLbaSize; UINT32 ExternalNLba;UINT32 InternalLbaSize;UINT32 InternalNLba;UINT32 NFree;UINT32 InfoSize;UINT64 NextOff;UINT64 DataOff;UINT64 MapOff;UINT64 FlogOff;UINT64 InfoOff;CHAR8 Unused[EFI_BTT_INFO_UNUSED_LEN];UINT64 Checksum;
} EFI_BTT_INFO_BLOCK
6.2.2 BTT Map Entry
typedef struct _EFI_BTT_MAP_ENTRY {UINT32 PostMapLba : 30;UINT32 Error : 1;UINT32 Zero : 1;
} EFI_BTT_MAP_ENTRY;
Error位和Zero位表示不能同时为真的条件,因此该组合用于指示法线映射条目,其中不指示错误或归零块。只有当error位被设置并且Zero位被清除时,错误条件才会被指示,与零块条件的逻辑类似。如果没有指定任何条件,则设置Error和Zero以指示处于正常、非错误状态的映射项。这留下了Error和Zero都是位的情况,这是首次写入BTT布局时所有映射项的初始状态。两个位都为零表示映射项包含初始的同一性映射,其中映射前LBA映射到相同的映射后LBA。以这种方式定义映射允许实现利用已知名称空间的初始内容为零的情况,在编写布局时不需要对映射进行写操作。这可以极大地改善布局时间,因为映射是布局期间写入的最大的BTT数据结构。
6.2.3 BTT Flog
// Alignment of each flog structure
#define EFI_BTT_FLOG_ENTRY_ALIGNMENT 64
typedef struct _EFI_BTT_FLOG {UINT32 Lba0;UINT32 OldMap0;UINT32 NewMap0;UINT32 Seq0;UINT32 Lba1;UINT32 OldMap1;UINT32 NewMap1;UINT32 Seq1;
} EFI_BTT_FLOG
6.2.4 BTT Data Area
BTT数据区从低地址到高地址,紧接BTT信息块开始,一直延伸到BTT Map数据结构的开头。可以存储在Arena中的内部数据块的数量是这样计算的:首先计算BTT Info块、map和flog所需的必要空间(加上所需的任何对齐),然后从Arena的总大小中减去该数量,然后计算有多少块适合最终的空间。
6.2.5 NVDIMM Label Protocol Address Abstraction Guid
此版本的BTT布局和行为由UEFI NVDIMM标签协议部分中的AddressAbstractionGuid使用此GUID共同描述:
#define EFI_BTT_ABSTRACTION_GUID {0x18633bfc,0x1735,0x4217, {0x8a,0xc9,0x17,0x23,0x92,0x82,0xd3,0xf8}
6.3 BTT Theory of Operation
BTT的layout 取决于namespace的大小以及在初始化Layout时确认的三个管理选择:
• ExternalLbaSize: the desired block size
• InternalLbaSize: the block size with any internal padding
• NFree: the number of concurrent writes supported by the layout
为了减小BTT元数据的大小并增加并发更新的可能性,将名称空间中的BTT布局划分为多个arena。竞技场容量不能大于512gb或小于16 mib。一个命名空间被划分为尽可能多的512GiB arena,从偏移量零开始,不加填充地打包在一起,如果剩余空间至少为16MiB,则后面是一个小于512GiB的arena。如果需要,较小的区域大小将四舍五入为EFI_BTT_ALIGNMENT的倍数。由于这些规则,每个BTT竞技场的位置和大小和 namespace 的 size 有关。