英特尔MPX,在以下文档中描述了新手:https://software.intel.com/sites/default/files/managed/68/8b/319433-019.pdf
我不确定我是否理解BNDLDX和BNDSTX是如何工作的。以BNDSTX为例。
从文件(第855页):
BNDSTX用于存储与缓冲区相关联的边界 指向该缓冲区的指针到绑定表条目的“指针值” 通过使用两级结构的地址转换,请参阅章节 9.3.8。例如,软件有一个缓冲区,其边界存储在BND0中,指向缓冲区的指针位于ESI中,以下序列将 将“指针值”(缓冲区)和边界存储到a中 使用线性地址转换配置绑定表条目 与由SIB寻址形式的基础相关联的地址 基址寄存器和索引寄存器:
MOV ECX, Dword ptr [ESI] ; store the pointer value in the index register ECX MOV EAX, ESI ; store the pointer in the base register EAX BNDSTX Dword ptr [EAX+ECX], BND0 ; perform address translation from the linear address of the base EAX and store bounds and pointer value ECX onto a bound table entry.
该示例指出ESI包含一些指针,如果是这样,则第一条指令mov ecx,dword ptr [esi]通过间接寻址执行简单的mov并获取任何esi 指向进入ecx,我认为它们的意思是指针值,或者它们是否意味着其他东西?这是什么目的,这与BNDSTX执行的地址转换有什么关系?
第二条指令看起来很直观,它只是想将这个指针存储到缓冲区并复制它。然而,为什么这是严格需要也有点奇怪。 BND0不包含缓冲区的开头吗?它不是简单地复制下限指针吗?而且,这个指针值的确切目的对我来说并不清楚。
答案 0 :(得分:3)
英特尔的例子措辞非常糟糕。 ESI最初拥有一个指向buf指针的指针。 "指针值"检查,因为非MPX代码可能已修改指针值而不修改边界。如果发生这种情况,BNDLNX指令将使边界无效:
来自https://software.intel.com/sites/default/files/managed/0d/53/319433-022.pdf:
BNDLDX使用从基址寄存器构造的线性地址和SIB寻址形式的位移 内存操作数(mib)执行地址转换以访问绑定表条目并有条件地加载 BTE到目的地的界限。如果是,则使用BTE中的边界更新目标寄存器 mib的索引寄存器的内容与存储在BTE中的指针值匹配。
如果指针值比较失败,则使用INIT边界更新目标(lb = 0x0,ub = 0x0)(注意:as 如前所述,上限用1的补码表示,因此,上限的0x0值 允许访问完整内存)。