热门标签 | 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
推荐阅读
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 本文介绍了某点评网的搜索策略,包括名称和地址的匹配策略,模糊匹配的方法以及不同口音和拼音的近似发音。同时提供了一些例子来说明这些策略的应用。 ... [详细]
  • 我是这么写的, ... [详细]
  • [更新幻灯]1剔除“伪创新”和“无领域”的领域驱动设计
    如果有人不了解人体的内部结构,就自称医生,声称自己能给人开腹割掉发炎的阑尾,甚至还能开胸给冠心病人做心脏搭桥,你信吗 ... [详细]
  • 本文目录一览:1、mysql数据库插入数据很慢,咋回事 ... [详细]
  • html+css网页设计源码_11个Html和CSS 动态网页背景免费代码案例
    html+css网页设计源码_11个Html和CSS 动态网页背景免费代码案例 ... [详细]
  • JavaScript设计模式之策略模式(Strategy Pattern)的优势及应用
    本文介绍了JavaScript设计模式之策略模式(Strategy Pattern)的定义和优势,策略模式可以避免代码中的多重判断条件,体现了开放-封闭原则。同时,策略模式的应用可以使系统的算法重复利用,避免复制粘贴。然而,策略模式也会增加策略类的数量,违反最少知识原则,需要了解各种策略类才能更好地应用于业务中。本文还以员工年终奖的计算为例,说明了策略模式的应用场景和实现方式。 ... [详细]
  • 解决Cydia数据库错误:could not open file /var/lib/dpkg/status 的方法
    本文介绍了解决iOS系统中Cydia数据库错误的方法。通过使用苹果电脑上的Impactor工具和NewTerm软件,以及ifunbox工具和终端命令,可以解决该问题。具体步骤包括下载所需工具、连接手机到电脑、安装NewTerm、下载ifunbox并注册Dropbox账号、下载并解压lib.zip文件、将lib文件夹拖入Books文件夹中,并将lib文件夹拷贝到/var/目录下。以上方法适用于已经越狱且出现Cydia数据库错误的iPhone手机。 ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • Windows7企业版怎样存储安全新功能详解
    本文介绍了电脑公司发布的GHOST WIN7 SP1 X64 通用特别版 V2019.12,软件大小为5.71 GB,支持简体中文,属于国产软件,免费使用。文章还提到了用户评分和软件分类为Win7系统,运行环境为Windows。同时,文章还介绍了平台检测结果,无插件,通过了360、腾讯、金山和瑞星的检测。此外,文章还提到了本地下载文件大小为5.71 GB,需要先下载高速下载器才能进行高速下载。最后,文章详细解释了Windows7企业版的存储安全新功能。 ... [详细]
  • {moduleinfo:{card_count:[{count_phone:1,count:1}],search_count:[{count_phone:4 ... [详细]
  • 5G新空口关键技术之信道编码
    信道编码概念  信道编码过程包括添加循环冗余校验码(CRC,CyclicRedundancyCheck)、码块分割(Code ... [详细]
  • P2P学习(四)P2P编程实现
    一:协议解析(一)协议格式设计(二)字段说明Version(1Byte):版本信息,这里默认0即可Status(1Byte):协议的状态信息#definePROTO_LOGIN_R ... [详细]
  • Linux使用虚拟机安装Windows 10的方法
    Linux使用虚拟机安装Windows10的方法:Windows10是最新的Windows系统,目前只推出了试用版,不少人已经迫不及待的试用上了,Linux系统中,可使用虚拟机安装 ... [详细]
  • 06CubeMx+Keil+Proteus仿真STM32
    本文例子参考《STM32单片机开发实例——基于Proteus虚拟仿真与HALLL库》源代码:https:github.comLanLinnetSTM33F103R6 ... [详细]
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社区 版权所有