CXL 存储设备标签存储区(LSA)

2023-12-01 19:10

本文主要是介绍CXL 存储设备标签存储区(LSA),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!



🔥点击查看精选 CXL 系列文章🔥
🔥点击进入【芯片设计验证】社区,查看更多精彩内容🔥


📢 声明

  • 🥭 作者主页:【MangoPapa的CSDN主页】。
  • ⚠️ 本文首发于CSDN,转载或引用请注明出处【https://mangopapa.blog.csdn.net/article/details/132553168】。
  • ⚠️ 本文目的为 个人学习记录知识分享。因个人能力受限,存在协议解读不正确的可能。若您参考本文进行产品设计或进行其他事项并造成了不良后果,本人不承担相关法律责任。
  • ⚠️ 若本文所采用图片或相关引用侵犯了您的合法权益,请联系我进行删除。
  • 😄 欢迎大家指出文章错误,欢迎同行与我交流 ~
  • 📧 邮箱:mangopapa@yeah.net
  • 💬 直达博主:loveic_lovelife 。(搜索或点击扫码)

文章目录

  • 1. LSA 概念
  • 2. LSA 构成
    • 2.1 Label Index Block
      • 2.1.1 Block 有效性
      • 2.1.2 Block 更新
    • 2.2 Label Slot
      • 2.2.1 Region (Interleave Set) Labels
      • 2.2.2 Namespace Labels
      • 2.2.3 Vendor-specific Labels
      • 2.2.4 Label Slot 更新
  • 3. LSA 访问
  • 4. 参考


1. LSA 概念

  Label Storage Area (LSA)是 CXL 内存设备中的一块标签存储区域,用以存放内存交织集(Interleave Set)、命名空间(Namespace)相关标签信息或其他供应商指定(Vendor-Specific)的信息,以防系统重启后数据丢失或软件出错。

  对于一些内存设备,其 Interleave 和 Namespace 配置信息是跟设备绑定在一起的,即便设备被挪用,其配置也应保持不变。LSA 的用法似于 RAID(Redundant Array of Independent Disks,独立磁盘冗余阵列,简称磁盘阵列)的写配置信息,通过把配置信息写入磁盘阵列中每块磁盘的 Reserved 区域,确保配置变动的时候相关配置信息仍保持不变。

  CXL Memory 支持 DRAM(Dynamic Random Access Memory,动态随机存取存储器)等易失性存储设备,也支持 PMem(Persistent Memory)持久内存。

  • 对于 DRAM 易失性存储设备,由于内存设备的增删,每次系统重启(Re-Boot)后的 CXL 内存交织策略都有可能不同。考虑到易失性存储设备在掉电后不保留原数据,Re-Boot 后的内存交织方案变动并不会影响主机软件。
  • 对于 PMem 非易失性存储设备,掉电后相关数据继续保留在原位置,若 Re-Boot 后内存交织方案改变,原数据地址发生变化,主机软件就无法正确找到原数据,从而导致主机软件运行出错或访问到了错误的数据。

因此,在 CXL 存储设备中,DRAM 等易失性存储可以实现也可以不实现 LSA,PMem 持久内存必须实现 LSA。



2. LSA 构成

  LSA 结构布局如下图所示,其中包含两个 N*256B 的 Label Index Block 及若干个 256B 的 Label Slot。

在这里插入图片描述

CXL 允许的 LSA 最低配置为:

  • 2 个 256B 的 Label Index Block ,其一当前在用,其一用于更新;
  • 2 个 Label Slot ,Region Label 及 Namespace Label 各一;
  • 1 个 Free Slot ,用于更新 Label Slot。要更新某个 Slot 的时候不是直接更新相关 Slot,而是更新到 Free Slot 中,这样在更新生效前不影响原来 Slot 数据的使用。

  这样一来,最低配置时候的 LSA Size 为 2*256B+2*256B+1*256B=1280B。CXL 协议建议每个设备通过实现足够大的 LSA 以提供更多的配置灵活性。足够大是指:

  • 每个 Device 分配两个 Region Label;
  • 对于可用的持久内存容量,每 8GB 空间分配一个 Namespace Label。

2.1 Label Index Block

  Label Index Block 是 LSA 的 Header,用以指示以下信息:

  • Sig,Label Index Block 的签名,内容为"NAMESPACE_INDEX\0"
  • Flags,尚未定义,为 0
  • LabelSize,用以指示单个 Label 的大小,1->256B,2->512B,当前仅支持 256B
  • Seq,序列号,仅低 2b 有效,01->10->11 三个值依次循环使用
  • MyOff,当前 Index Block 在 LSA 内的偏移
  • MySize,当前 Index Block 的大小,单位为 256B
  • OtherOff,另一 Index Block 在 LSA 内的偏移
  • LabelOff,当前 LSA 内第一个 Label 的偏移
  • NSlot,当前 LSA 内的 Label Slot 总数
  • Major/Minor,当前布局的主/副版本号
  • CheckSum,Label Index Block 内所有字段的 Fletcher64 校验和
  • Free,每一 bit 对应一个 Label Slot,指示相关 Label Slot 为空闲还是在使用中

2.1.1 Block 有效性

  对于一个 Label Index Block,只有其 Sig、MyOff、OtherOff 及 CheckSum 均正确时当前 Label Index Block 才有效。

  Label Index Block 的 Seq 只能为 01/10/11 之一且两个 Label Index Block 的 Seq 不能相同。若 Seq=0,软件应忽略当前 Label Index Block。

在这里插入图片描述

  若同时存在多个 Block 有效,则采用 Seq 较新(01->10->11 循环中相邻两者靠右的一个)的 Block。比如 01/10 中选择 10,10/11 中选择 11,11/01 中选择 01,另一个较旧的 Block 弃而不用。若不存在有效 Block,则当前 LSA 还未初始化。

2.1.2 Block 更新

  CXL 采用原子更新的方法来更新 LSA 中的 Block。若需更新 Label Index Block 的内容,并非直接写到当前在用的 Block,而是更新另一个闲置状态的 Block 中,并把其 Seq 更新为下一个更新的 Seq 号。在 CheckSum 校验通过之后,更新之后的 Block 正式生效。

2.2 Label Slot

  CXL LSA 的 Label Slot 支持三种标签:Region Label、Namespace Label 及 Vendor-specific Label,其中 Region Label 及 Namespace 通过 UUID(Universally Unique Identifier,通用唯一标识)进行识别(遵循 IETF RFC 4122 规范)。

  每一个 Slot 在 Label Index Block 中都有 1b 来指示其闲忙状态。对于 256B Label Index,最多支持 1472 个(1472=(ffh-48h+1h)*8)Label Slot;对越 2*256B Label Index,最多支持 3520 个(1472+256*8)Label Slot。

2.2.1 Region (Interleave Set) Labels

  Region Label 用以描述 PMem 的 Interleave Set,又称 Interleave Set Label。该 Label 内含有以下信息:

  • Type,用以指示当前的 Label 类型,目前采用 UUID= 529d7c61-da07-47c4-a93f-ecdf2c06f444 来指示
  • UUID,当前 Region 的 UUID,不同设备上的同一 Region 采用同一 UUID
  • Flags,目前 0x00000008 指示 UPDATING,用以多设备 Slot 之间的协同更新
  • NLabel,基于当前 Interleave Set 的 Device 数目,等同于 Interleave Way
  • Position,当前 Device 在 Interleave Set 中的位置,从 0 开始累加
  • DPA,该 Region 在当前 Device 中的设备物理地址(Device Physical Address)
  • RawSize,Interleave Set 的 Size
  • HPA,Interleave Set 对于的主机物理地址(Host Physical Address)
  • Slot,当前 Slot 在 LSA 中的 Index 索引号
  • IG,Interleave Granularity,交织粒度
  • Alignment,期望的对齐边界,支持 256MB 和 512MB,也支持非对齐
  • Checksum,校验和

2.2.2 Namespace Labels

  类似于 Interleave 配置,持久内存也可以分为多个 Namespace,每个 Namespace 定义了持久内存的 Volume 卷。

  CXL LSA 中的 Namespace Label 用以描述持久分区,以内存卷的形式展示给软件,类似于 NVMe 的 Namespace 或 SCSI 的 LUN(Logic Unit Number)。该 Label 含有以下信息:

  • Type,用以指示当前的 Label 类型,目前采用 UUID= 68bb2c0a-5a77-4937-9f85-3caf41a0f93c 来指示
  • UUID,同一 Namespace 的不同 Label 应采用同一 UUID
  • Name,Namespace 的名称
  • Flags,目前 0x00000008 指示 UPDATING,用以多设备 Slot 之间的协同更新
  • NRange,若 Device 提供的存储容量在地址上不连续,该字段用以指示不连续地址范围的数量,每一段联系的地址采用一个 Label 进行描述
  • Position,当前 Range 在所有 Range 内的位置,从 0 开始累加
  • DPA,该 Region 在当前 Device 中的设备物理地址(Device Physical Address)
  • RawSize,当前 Range 的 Size
  • Slot,当前 Slot 在 LSA 中的 Index 索引号
  • Alignment,期望的对齐边界,支持 256MB 和 512MB,也支持非对齐
  • RegionUUID,包含当前 Namespace 的 Region 的 UUID
  • AddressAbstractionUUID,地址抽象 UUID,由软件指示该 UUID 的用法
  • LBASize,当前 Namespace 逻辑块(Logic Block)的 Size
  • Checksum,校验和

2.2.3 Vendor-specific Labels

  Vendor 自定义的标签。

2.2.4 Label Slot 更新

  跟 Label Index Block 更新策略相同,Label Slot 更新时并非直接更新到对应 Slot,而是将新的配置先行写到 Free Slot 中,更新完毕择机启用。Label Index Block 中的 Free 字段指示当前 Label Slot 的忙闲状态,任意时刻下至少应保证 1 个 Label Slot 处于 Free 空闲状态。

  某些情况下,需要对多个 CXL Device 内的相关 Slot 进行同步更新。例如,当新定义 Region 或 Namespace Label 时,需要对所有 CXL Device 内的相关 Label 进行更新。为了应对该情况,每一类 Label 中均定义有 UPDATING 字段,用以指示多个 Device 正在更新,当前 Label 内信息暂不可用。软件遵循以下多设备之间的 UPDATING Flow:

  • 软件将所有需要更新 Label 的 CXL Device 的 LSA Label UPDATING 字段置一;
  • 软件更新所有设备的 Label 相关字段;
  • UPDATING 字段清零,表示更新可用。

  基于以上 Flow,只有全部相关设备相关 Label 更新成功相关配置才可用;若更新过程中发现存在 Device 相关 Label 更新失败,则其他已更新 Label 的 Device,相关 Label 配置回滚,更新不可用。



3. LSA 访问

  CXL 内存设备不负责解读 LSA 相关内容,其只提供存储区域及响应 LSA 访问相关的 Mailbox 命令,由 Pre-boot Firmware 或 OS 等软件来配置 Interleave Set 和 Namespace。

  软件基于 Mailbox 发送 Memory Device 命令集相关命令来访问 LSA 区域:

  • Identify Memory Device Mailbox 命令获取 LSA 的 Size;
  • Get LSA 命令读 LSA 相关字段,命令格式为 4B Offset + 4B Length;
  • Set LSA 命令写 LSA 相关字段,命令格式为 4B Offset + 4B Rsvd + nB Data。

  注意,Set LSA Mailbox 不需要原子操作,就简单更新相关范围就行。LSA 的原子性及一致性通过 Checksum 及 Free Slot 更新来实现。

  注:Identify Memory Device 是一种 Device Command,用以访问 CXL Memory 设备被的基本信息,比如 FW 版本、可用容量、是否易失、LSA 大小、是否支持 Poison 处理、是否具备 QoS Telemetry 能力、是否支持动态容量等等。



4. 参考

  1. CXL Base Spec, r3.0
  2. SSD 之 Namespace - 知乎 (zhihu.com)
  3. NVME-Namespace - 可口可乐嗨 - 博客园 (cnblogs.com)
  4. NVMe SSD 中 namespace 的介绍和创建 | 陈浩的个人博客 (cighao.com)
  5. RAID 磁盘阵列是什么(一看就懂) - 知乎 (zhihu.com)
  6. RAID 磁盘阵列的原理与搭建 - 知乎 (zhihu.com)
  7. Fast Computation of Fletcher Checksums (intel.com)
  8. 弗莱彻的校验和| 码农家园 (codenong.com)
  9. 英特尔® 傲腾™ 持久内存 (intel.cn)
  10. 关于持久内存你了解多少?- 知乎 (zhihu.com)
  11. 持久内存(1):Persistent Memory 介绍 - 简书 (jianshu.com)
  12. 操作系统概念中,分区和卷的区别是什么?- 知乎 (zhihu.com)
  13. 持久卷| Kubernetes
  14. IETF RFC 4122 的 UUID_fothin 的博客-CSDN 博客
  15. UUID 那些事儿 - 知乎 (zhihu.com)
  16. deepin 23 Preview 揭秘:原子更新 – 深度科技社区

— END —


🔥 精选往期 CXL 协议系列文章,请查看【 CXL 专栏】🔥

⬆️ 返回顶部 ⬆️

这篇关于CXL 存储设备标签存储区(LSA)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:https://blog.csdn.net/weixin_40357487/article/details/132553168
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/442364

相关文章

MySQL 存储引擎 MyISAM详解(最新推荐)

《MySQL存储引擎MyISAM详解(最新推荐)》使用MyISAM存储引擎的表占用空间很小,但是由于使用表级锁定,所以限制了读/写操作的性能,通常用于中小型的Web应用和数据仓库配置中的只读或主要... 目录mysql 5.5 之前默认的存储引擎️‍一、MyISAM 存储引擎的特性️‍二、MyISAM 的主

Linux lvm实例之如何创建一个专用于MySQL数据存储的LVM卷组

《Linuxlvm实例之如何创建一个专用于MySQL数据存储的LVM卷组》:本文主要介绍使用Linux创建一个专用于MySQL数据存储的LVM卷组的实例,具有很好的参考价值,希望对大家有所帮助,... 目录在Centos 7上创建卷China编程组并配置mysql数据目录1. 检查现有磁盘2. 创建物理卷3. 创

使用Python和Tkinter实现html标签去除工具

《使用Python和Tkinter实现html标签去除工具》本文介绍用Python和Tkinter开发的HTML标签去除工具,支持去除HTML标签、转义实体并输出纯文本,提供图形界面操作及复制功能,需... 目录html 标签去除工具功能介绍创作过程1. 技术选型2. 核心实现逻辑3. 用户体验增强如何运行

使用Python实现调用API获取图片存储到本地的方法

《使用Python实现调用API获取图片存储到本地的方法》开发一个自动化工具,用于从JSON数据源中提取图像ID,通过调用指定API获取未经压缩的原始图像文件,并确保下载结果与Postman等工具直接... 目录使用python实现调用API获取图片存储到本地1、项目概述2、核心功能3、环境准备4、代码实现

SpringBoot项目中Redis存储Session对象序列化处理

《SpringBoot项目中Redis存储Session对象序列化处理》在SpringBoot项目中使用Redis存储Session时,对象的序列化和反序列化是关键步骤,下面我们就来讲讲如何在Spri... 目录一、为什么需要序列化处理二、Spring Boot 集成 Redis 存储 Session2.1

基于MongoDB实现文件的分布式存储

《基于MongoDB实现文件的分布式存储》分布式文件存储的方案有很多,今天分享一个基于mongodb数据库来实现文件的存储,mongodb支持分布式部署,以此来实现文件的分布式存储,需要的朋友可以参考... 目录一、引言二、GridFS 原理剖析三、Spring Boot 集成 GridFS3.1 添加依赖

java变量内存中存储的使用方式

《java变量内存中存储的使用方式》:本文主要介绍java变量内存中存储的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、介绍2、变量的定义3、 变量的类型4、 变量的作用域5、 内存中的存储方式总结1、介绍在 Java 中,变量是用于存储程序中数据

SQLyog中DELIMITER执行存储过程时出现前置缩进问题的解决方法

《SQLyog中DELIMITER执行存储过程时出现前置缩进问题的解决方法》在SQLyog中执行存储过程时出现的前置缩进问题,实际上反映了SQLyog对SQL语句解析的一个特殊行为,本文给大家介绍了详... 目录问题根源正确写法示例永久解决方案为什么命令行不受影响?最佳实践建议问题根源SQLyog的语句分

关于MongoDB图片URL存储异常问题以及解决

《关于MongoDB图片URL存储异常问题以及解决》:本文主要介绍关于MongoDB图片URL存储异常问题以及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录MongoDB图片URL存储异常问题项目场景问题描述原因分析解决方案预防措施js总结MongoDB图

CSS去除a标签的下划线的几种方法

《CSS去除a标签的下划线的几种方法》本文给大家分享在CSS中,去除a标签(超链接)的下划线的几种方法,本文给大家介绍的非常详细,感兴趣的朋友一起看看吧... 在 css 中,去除a标签(超链接)的下划线主要有以下几种方法:使用text-decoration属性通用选择器设置:使用a标签选择器,将tex