【问题标题】:Intel MPX, BNDSTX, BNDLDX英特尔 MPX、BNDSTX、BNDLDX
【发布时间】:2014-08-17 15:08:15
【问题描述】:

英特尔 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 指向的任何 dword 到 ecx 中,这就是我认为他们的意思是 指针值,还是他们的意思是别的?这样做的目的是什么,这与 BNDSTX 执行的地址转换有何关系?

第二条指令看起来很直观,它只是想将此指针存储到缓冲区并复制它。然而,为什么这是严格需要的也有点奇怪。 BND0 不是已经包含缓冲区的开始了吗?它不是简单地复制下界指针吗?再说一次,我不清楚这个指针值的具体用途。

【问题讨论】:

    标签: pointers assembly intel


    【解决方案1】:

    英特尔的例子措辞非常糟糕。 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)更新目标(注意:如 如前所述,上限使用 1 的补码表示,因此,上限的 0x0 值 允许访问全部内存)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-31
      • 2015-08-03
      相关资源
      最近更新 更多