当前位置: 首页 > article >正文

UEFI Spec 学习笔记---6 - Block Translation Table (BTT) Layout

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 有关。


http://www.kler.cn/a/554664.html

相关文章:

  • 算法从0到100之【专题一】- 双指针第一练(数组划分、数组分块)
  • AI 是如何赋能企业,推动新的“商业革命”的?
  • 国产编辑器EverEdit -告别东找西找!一键打开当前文件所在目录!
  • RocketMQ保证消息有序性
  • linux5-多任务--进程fork()
  • 力扣hot100 ——和为k的子数组 前后缀和(积)各种情况总结
  • 大模型高效注意力机制全解析:FlashAttention 与稀疏注意力实战
  • 【自动化脚本工具】Hammerspoon (Mac)
  • 基于STM32与IFX007T的电机驱动全解析(无人机/机器人实战)
  • 【队列】循环队列(Circular Queue)详解
  • 美的楼宇科技基于阿里云 EMR Serverless Spark 构建 LakeHouse 湖仓数据平台
  • Junit——白盒测试
  • 前端js题目大全
  • 区块链技术:构建区块链生态的核心要素
  • uniapp录制语音
  • 网络安全入门防御与加固(二)
  • Windows 10操作系统上安装PHP
  • 广度优先搜索--之重生之我是蒟蒻,从入坟到入坑式讲解
  • 练习题:45
  • JavaScript系列(78)--Service Worker 深入解析