热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

将MPX边界寄存器中的值提取到通用寄存器中

如何解决《将MPX边界寄存器中的值提取到通用寄存器中》经验,为你挑选了1个好方法。

Intel的存储器保护扩展提供了四个新的128位界定寄存器,BND0BND3每个存储对64位下界(LB)和上界(UB)的缓冲液中的值.

如何提取下界的64位值(即%BND0[0-63]进入64位通用寄存器(即%RAX))?

据我所知,问题在于英特尔的指令集没有提供直接执行此操作的方法.我已经查阅了英特尔的MPX支持指南(参见本链接底部的下载),发现有一条BNDMOV b/m, b指令可以将边界寄存器中的下界和上界存储到存储器或其他寄存器中.但是看起来另一个寄存器必须是一个边界寄存器本身,因为它不可能将128位边界寄存器装入64位通用寄存器.

另外,据我所知,通过使用半宽同级寄存器(即%EAX包含下半部分的值),无法从边界寄存器中获得下限%RAX.同样,没有寻址%BND#.LB,即使无花果.14 on pg." MPX启用指南"中的50个显示了一个监视这些值的调试器.



1> Margaret Blo..:

这是一个实验性解决方案,我手头没有带MPX支持的CPU.
我的工作纯粹是理论上的,我不知道由于真正的硬件上有些狡辩,它是否会失败.


正如Igor所说,完全回答没有指令在bnd不通过内存的情况下读取寄存器.
这就是故事的结局.

由于Mattew表达了他对溢出bnd寄存器值的担忧,我通过间接方式读取bnd寄存器.

该行的底部是由于它们的性质,MPX让程序员对寄存器的值执行二分法搜索bnd.

我将bndcl在整个答案中作为参考.对于bndcu一种补码格式的考虑,双重性是相似的.

bndcl如果寄存器下限LB的值高于测试的地址A,则该指令产生异常#BR.
所需要的是将条件A 基本上,如果可用且可访问,bndstatus寄存器的字段EC(错误条件)就是我们要寻找的:如果bndcl失败则为1 ,否则为0.
或者,可以bndcl通过将变量/寄存器设置为1来处理#BR异常(或操作系统仅作为#BF和#UD生成的任何异常).如果在执行之前重置所述寄存器,bndcl则它将反映检查的结果.
必须注意作为rip违规bndcl指令的要点.

长话短说,需要类似的东西

 bndcl:
    A 

有了这些先决条件,我们就可以对下限的值执行二进制搜索.
有一个小警告:我们不能测试相等,只能大于或等于.
这意味着:1)我们执行固定数量的比较(略大于64)和2)我们需要额外的最后一步来确定确切的地址.

要理解第2点)只考虑在0到15之间的数组中搜索值14和15:

       15                          14

Pivot    Step   Cmp         Pivot    Step   Cmp
 8        4      ?           8        4      ?
 12       2      ?           12       2      ?
 14       1      ?           14       1      ? (Can't stop here)
 15       0      ?           15       0      ?

我的CPU不支持MPX,所以我假设存在一个bndclex执行上述检查bndcl和设置的宏ecx.

;Get the bnd0 lower bound without storing it into memory
;It uses a dichotomy search

get_bnd0_lb: 
 mov rax, 4000_0000_0000_0000h  ;Half-range
 lea rbx, [rax*2]               ;Address to check


_check:

 ;D O   T H E   B O U N D    C H E C K 

 bndclex _bnd0, rbx

 ;ecx = 01 if rbx = bnd0.lb

 ;S E T   T H E   C F 

 not ecx
 shr ecx, 1                     ;CF = 0   IF rbx = bnd0.lb

 ;A D D / S U B   T H E   H A L F   R A N G E 

 sbb rcx, rcx           ;rcx =  0 IF rbx = bnd0.lb

 sub rbx, rcx                   ;rbx = rbx     IF rbx = bnd0.lb

 xor rcx, rax                   ;rcx = rax     IF rbx = bnd0.lb

 add rbx, rcx                   ;rbx = rbx + rax      IF rbx = bnd0.lb

 shr rax, 1                     ;Halve half-range
jnz _check

 ;C H  E C K    T H E   E X A C T   A D D R E S S

 bndclex _bnd0, rbx

 ;ecx = 01 if rbx = bnd0.lb

 lea rax, [rbx + rcx]

 ret 

该算法通过将初始枢轴P 0设置为64位地址范围的一半并且初始S 0步长等于地址范围的1/4来工作.
然后在每一步,它将枢轴移动到P i + 1 = P i ±S i并将步骤S i + 1 = S i/2 减半.

该算法将bnd寄存器下限中的零个数泄漏为生成的异常数,但不将该值存储在内存中.
可以生成合成的#BR异常来解决这个问题.


bndclex宏观的实施- 或者更好地消除宏观 - 留给了OP,因为它在很大程度上取决于环境.
我很简单

%macro bndclex 2

 xor ecx, ecx           ;RCX = 0
 lea r8, [rcx+1]        ;r8 = 0

 cmp %2, QWORD [REL %1 %+ .lb]            
 cmovb rcx, r8          ;RCX = 1 if %2 


至于测试 - 英特尔SDE支持MPX:https://software.intel.com/en-us/articles/intel-software-development-emulator
推荐阅读
  • 本文节选自《NLTK基础教程——用NLTK和Python库构建机器学习应用》一书的第1章第1.2节,作者Nitin Hardeniya。本文将带领读者快速了解Python的基础知识,为后续的机器学习应用打下坚实的基础。 ... [详细]
  • 兆芯X86 CPU架构的演进与现状(国产CPU系列)
    本文详细介绍了兆芯X86 CPU架构的发展历程,从公司成立背景到关键技术授权,再到具体芯片架构的演进,全面解析了兆芯在国产CPU领域的贡献与挑战。 ... [详细]
  • Ihavetwomethodsofgeneratingmdistinctrandomnumbersintherange[0..n-1]我有两种方法在范围[0.n-1]中生 ... [详细]
  • 本文对比了杜甫《喜晴》的两种英文翻译版本:a. Pleased with Sunny Weather 和 b. Rejoicing in Clearing Weather。a 版由 alexcwlin 翻译并经 Adam Lam 编辑,b 版则由哈佛大学的宇文所安教授 (Prof. Stephen Owen) 翻译。 ... [详细]
  • 在《Cocos2d-x学习笔记:基础概念解析与内存管理机制深入探讨》中,详细介绍了Cocos2d-x的基础概念,并深入分析了其内存管理机制。特别是针对Boost库引入的智能指针管理方法进行了详细的讲解,例如在处理鱼的运动过程中,可以通过编写自定义函数来动态计算角度变化,利用CallFunc回调机制实现高效的游戏逻辑控制。此外,文章还探讨了如何通过智能指针优化资源管理和避免内存泄漏,为开发者提供了实用的编程技巧和最佳实践。 ... [详细]
  • A题这题贼水,直接暴力就可以了。用个bool数组记录一下,如果某一天,当前剩下的最大的出现了的话,就输出一段。1#include<stdio.h>2intn;3boolvi ... [详细]
  • 【线段树】  本质是二叉树,每个节点表示一个区间[L,R],设m(R-L+1)2(该处结果向下取整)左孩子区间为[L,m],右孩子区间为[m ... [详细]
  • python模块之正则
    re模块可以读懂你写的正则表达式根据你写的表达式去执行任务用re去操作正则正则表达式使用一些规则来检测一些字符串是否符合个人要求,从一段字符串中找到符合要求的内容。在 ... [详细]
  • 深入理解二分查找及其应用
    二分查找是一种高效的搜索算法,适用于有序数据集合。其核心思想是通过不断将查找区间缩小一半,直至找到目标元素或区间为空。本文将详细介绍二分查找的基本原理、实现方法以及应用场景的局限性。 ... [详细]
  • 数据结构第三章,栈、队列、数组,期末不挂科指南,第3篇
    数据结构第三章,栈、队列、数组,期末不挂科指南,第3篇,Go语言社区,Golang程序员人脉社 ... [详细]
  • 本文详细介绍了Java反射机制的基本概念、获取Class对象的方法、反射的主要功能及其在实际开发中的应用。通过具体示例,帮助读者更好地理解和使用Java反射。 ... [详细]
  • 本文介绍如何使用OpenCV和线性支持向量机(SVM)模型来开发一个简单的人脸识别系统,特别关注在只有一个用户数据集时的处理方法。 ... [详细]
  • 本文介绍了几种常用的图像相似度对比方法,包括直方图方法、图像模板匹配、PSNR峰值信噪比、SSIM结构相似性和感知哈希算法。每种方法都有其优缺点,适用于不同的应用场景。 ... [详细]
  • 在尝试对 QQmlPropertyMap 类进行测试驱动开发时,发现其派生类中无法正常调用槽函数或 Q_INVOKABLE 方法。这可能是由于 QQmlPropertyMap 的内部实现机制导致的,需要进一步研究以找到解决方案。 ... [详细]
  • 深入解析 Android 中 EditText 的 getLayoutParams 方法及其代码应用实例 ... [详细]
author-avatar
涛声依旧0411_553
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有