用标记数据填充x86_64指针前16位?

用标记数据填充x86_64指针前16位?,x86,cpu,x86-64,computer-architecture,X86,Cpu,X86 64,Computer Architecture,由于当前的x86_64实现只能使用48位的“虚拟”地址空间来降低MMU复杂性,因此前16位可以用于实现安全标记数据。当前的实现是否限制了这种使用(即使知道IP和其他段寄存器是完整的64位),并限制指针的前16位仅包含虚拟地址而不包含其他数据 不,你不能。前16位当前要求全部相同(例如,0x0000…或0xffff…)-不符合此模式的地址将始终导致故障。将来的版本可能在这个范围内有“真实”地址空间,因此使用这些位作为标记是不安全的。您确实说过顶部位必须都相同,所以这意味着只要您只使用两个标记(0或

由于当前的x86_64实现只能使用48位的“虚拟”地址空间来降低MMU复杂性,因此前16位可以用于实现安全标记数据。当前的实现是否限制了这种使用(即使知道IP和其他段寄存器是完整的64位),并限制指针的前16位仅包含虚拟地址而不包含其他数据

不,你不能。前16位当前要求全部相同(例如,
0x0000…
0xffff…
)-不符合此模式的地址将始终导致故障。将来的版本可能在这个范围内有“真实”地址空间,因此使用这些位作为标记是不安全的。

您确实说过顶部位必须都相同,所以这意味着只要您只使用两个标记(0或1),您就可以从技术上写入这些顶部位而不会收到错误?也许,但这是个坏主意。前导位为0和1的地址旨在彼此不同。如果您将其描述为符号扩展(即复制最高有效位),可能会有所帮助。此外,在使用指针之前右移指针(即,将标记指针转换为简单指针的简单步骤)也是很有可能的,正如可以利用对齐来使用几个最低有效位进行标记一样。当然,使用最重要的位会有将来不兼容的风险。一些操作系统保留负地址供操作系统使用,使应用程序的使用出现问题。顺便提一下,ARM AArch64提供了忽略8个MSbits的选项(以便更方便地进行标记)