目录
4.2 Permitted initial MTE tag states
1. Introduction
内存标签扩展(MTE:Memory Tagging Extension)是一种用于检查内存中数据的正确使用情况的机制。当内存位置分配给特定用途时,还可以为其分配一个存储器标签。
此内存标签与内存中的数据一起保存,称为“分配标签”。以后访问内存位置时,请求者使用位置的地址和它认为与位置相关联的标签值。
此标签称为物理地址标签(Physical Address Tag)或物理标签(Physical Tag)。
对于启用标签检查的任何访问,将根据分配标签检查物理标签。访问始终按正常进行,标签检查结果决定是否发出错误条件信号。
此机制可确保内存访问用于其预期目的,而不是错误或恶意访问。它可以在运行时用于识别许多常见的编程存储器错误,例如缓冲区溢出和use-after-free。
注:计算机安全领域中的"use-after-free"漏洞是一种常见的内存安全问题,指的是在释放(free)了某块内存后,程序继续使用了已释放的内存区域,可能导致严重的安全问题。漏洞发生的主要原因之一是内存管理不当。
存储器标签包括与内存中的每个16字节对齐数据相关联的4-bit标签。
支持以下行为:
- 只在请求Normal WriteBack内存时允许内存标记。
- Read transactions请求中有一个指示(TagOp),确定是否必须与数据一起返回分配标签值。
- 由请求者执行根据分配标签检查返回的物理标签。举个例子,如果缓存保存数据值但不保存分配标签值,则Read事务必须执行同时返回数据data和标签tag,返回的数据不要求有效。
- 需要提取标签的读取请求不得使用转发监听 Forwarding snoops。
- StashOnce transactions请求分配标签。分配标签预计会随着数据的存储而被积存。
- Write transactions有一个物理标签和必须根据分配标签检查的写数据一起提供。由Completer执行对分配标签进行检查物理标签。如果不匹配,则需要发出失败通知。
- Write transactions将分配标签更新为新值。这些写事务通常会同时更新数据。但是,允许没有字节使能置位,以便仅更新标签。
- Write transactions将Dirty或clean的cache line刷到下级cache line,无需更新或检查标签。这些写入事务始终包括数据,并指示分配标签值是否也随数据一起传递。
- 返回数据的Snoop transactions也可以返回关联的分配标签。如果标签是Dirty,则必须返回标签。如果标签为“Clean”,则返回标签是可选的。
- CMO缓存维护操作必须在数据和相应的内存标签上运行。
2. Message extensions
CHI消息定义的以下扩展用于支持Memory Tagging:
Tag |
提供4-bit标签集,每个标签都与16字节对齐的数据相关联。
|
TU |
Tag Update。指示必须更新哪些分配标签。
|
TagOp |
Tag Operation。指示要对相应DAT通道中存在的标签执行的操作。
|
TagOp的编码如下:
TagOp[1:0] |
Tag operation |
0b00 |
Invalid |
0b01 |