🔥点击查看精选 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. 参考
- CXL Base Spec, r3.0
- SSD 之 Namespace - 知乎 (zhihu.com)
- NVME-Namespace - 可口可乐嗨 - 博客园 (cnblogs.com)
- NVMe SSD 中 namespace 的介绍和创建 | 陈浩的个人博客 (cighao.com)
- RAID 磁盘阵列是什么(一看就懂) - 知乎 (zhihu.com)
- RAID 磁盘阵列的原理与搭建 - 知乎 (zhihu.com)
- Fast Computation of Fletcher Checksums (intel.com)
- 弗莱彻的校验和| 码农家园 (codenong.com)
- 英特尔® 傲腾™ 持久内存 (intel.cn)
- 关于持久内存你了解多少?- 知乎 (zhihu.com)
- 持久内存(1):Persistent Memory 介绍 - 简书 (jianshu.com)
- 操作系统概念中,分区和卷的区别是什么?- 知乎 (zhihu.com)
- 持久卷| Kubernetes
- IETF RFC 4122 的 UUID_fothin 的博客-CSDN 博客
- UUID 那些事儿 - 知乎 (zhihu.com)
- deepin 23 Preview 揭秘:原子更新 – 深度科技社区
|
🔥 精选往期 CXL 协议系列文章,请查看【 CXL 专栏】🔥
⬆️ 返回顶部 ⬆️