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

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

相关文章:

  • preprocessing.scale函数介绍
  • 区块链研究(一):Windows下搭建以太坊私有链,部署智能合约实现数据上链功能(完整跑通版!好累!)
  • Ubuntu cgroups v2切换cgroups v1
  • 《深入理解JVM》实战笔记(一):内存区域、对象布局与OOM排查指南
  • uni-app开发app时 使用uni.chooseLocation遇到的问题
  • el-dropdown选中效果
  • 企业内部真题
  • Openssl交叉编译
  • 【深度解析】最短路径算法:Dijkstra与Floyd-Warshall
  • 淘宝/天猫店铺订单数据导出、销售报表设计与数据分析指南
  • 算法-二叉树-判断二叉树是否相等
  • MATLAB学习之旅:从入门到基础实践
  • 面试题汇总
  • 智慧场馆运营系统
  • 分割 学习笔记cvpr2024
  • Linux-GlusterFS操作子卷
  • 多环境日志管理:使用Logback与Logstash集成实现高效日志处理
  • QT 建立一片区域某种颜色
  • 青龙圣者的训练脚本训练 Flux lora
  • 第1章:LangChain4j的聊天与语言模型
  • 好的室内设计网站推荐/科学新概念外链平台
  • 开公司怎么找客户/seo点击排名工具
  • 免费做请帖的网站/太原seo团队
  • 莱芜网站制作公司/实体店营销方案
  • 东莞信科网站建设/百度一下 你就知道官方
  • 苏州网站开发建设电话/关键词指数查询工具