英特尔MPX,BNDSTX,BNDLDX

AttributedTensorField

英特尔MPX,在以下文档中针对新手进行了介绍:https : //software.intel.com/sites/default/files/managed/68/8b/319433-019.pdf

我不确定我是否了解BNDLDX和BNDSTX的工作方式。以BNDSTX为例。

从文档(第855页)中:

BNDSTX用于通过两级结构通过地址转换将与缓冲区关联的边界和指向该缓冲区的指针的“指针值”存储到绑定表条目中,请参见第9.3.8节。例如,该软件有一个缓冲区,其边界存储在BND0中,指向该缓冲区的指针位于ESI中,下面的序列将使用“地址”的地址转换将“指针值”(缓冲区)和边界存储到已配置的绑定表条目中与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的任何dword ,这就是我假定的是指指针值,还是其他含义?这样做的目的是什么,它与BNDSTX执行的地址转换有什么关系?

第二条指令似乎很直观,它只想将此指针存储到缓冲区并对其进行复制。但是为什么严格要求这样做也有些奇怪。BND0是否已经包含缓冲区的开始?它不只是复制下限指针吗?同样,这个指针值的确切用途对我来说还不清楚。

埃德·麦克曼

英特尔的例子措辞很差。ESI最初持有一个指向buf的指针。之所以检查“指针值”,是因为非MPX代码可能已经修改了指针值而没有修改边界。如果发生这种情况,则BNDLNX指令会取消边界:

https://software.intel.com/sites/default/files/managed/0d/53/319433-022.pdf

BNDLDX使用从基址寄存器构造的线性地址和内存操作数(mib)的SIB地址形式的位移来执行地址转换,以访问绑定表条目,并有条件地将BTE中的边界加载到目标。如果mib的索引寄存器的内容与BTE中存储的指针值匹配,则使用BTE中的边界更新目标寄存器。

如果指针值比较失败,那么将使用INIT边界(lb = 0x0,ub = 0x0)更新目标(注意:如前所述,上限使用1的补码表示,因此,上限的0x0值允许访问到完整的内存)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章