热门标签 | 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
推荐阅读
  • 【Java数据结构和算法】008栈
    目录0、警醒自己一、栈的应用场景和介绍1、栈的应用场景一个实际的场景:我的思考:2、栈的介绍入栈演示图:出栈演示图 ... [详细]
  • 远程访问用户 Kindle通过电子书实现控制
    介绍自2007年以来,亚马逊已售出数千万台Kindle,令人印象深刻。但这也意味着数以千万计的人可能会因为这些Kindle中的软件漏洞而被黑客入侵。他 ... [详细]
  • C++中类的内外定义及内联函数详解
    本文详细介绍了C++中的类内定义与类外定义,以及内联函数的使用方法和注意事项。通过实例说明了不同定义方式的优缺点,并探讨了编译器对内联函数的处理机制。 ... [详细]
  • 详解JavaScript的原型与原型链_javascript技巧
    这篇文章主要为大家详细介绍了JavaScript原型与原型链,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下, ... [详细]
  • 探讨如何利用Visual Basic (VB) 将十六进制或二进制字符串写入Windows注册表的方法。 ... [详细]
  • KNN算法在海伦约会预测中的应用
    本文介绍如何使用KNN算法进行海伦约会的预测。我们将从数据导入、数据预处理、数据可视化到最终的模型训练和测试进行全面解析。 ... [详细]
  • HidD_GetHidGuid(guidHID)hDevInfoSetupDiGetClassDevs(guidHID,0,0,DIGCF.DIGCF_PRESENTOrDIGCF ... [详细]
  • 本文通过对OkHttp源码的详细解读,旨在帮助读者理解其核心执行流程,特别是同步与异步请求的处理方式。文中不仅涵盖了基本的使用示例,还深入探讨了OkHttp的核心功能——拦截器链的工作原理。 ... [详细]
  • ANSI最全介绍linux终端字体改变颜色等ANSI转义序列维基百科,自由的百科全书由于国内不能访问wiki而且国内关于ANSI的介绍都是简短的不能达到,不够完整所以转wiki到此 ... [详细]
  • 深入解析线程池的工作原理与实际应用
    本文详细探讨了线程池的核心概念、工作原理及其在实际开发中的应用,包括不同类型的线程池创建方式及其适用场景。 ... [详细]
  • 本文探讨了Thrift作为一款支持多语言的服务开发框架,其在体积、功能、扩展性以及多协议支持等方面的显著优势。特别地,Thrift作为一种RPC(远程过程调用协议)框架,非常适合用于构建可扩展且低耦合的分布式服务系统。文章通过多种编程语言对Thrift服务进行了性能测试,并提供了详细的测试结果。 ... [详细]
  • 理解HTTP状态码及其应用
    本文详细解析了HTTP状态码的分类及常见代码的意义,帮助开发者和用户更好地理解和解决网络请求中遇到的问题。 ... [详细]
  • 在现代移动应用开发中,尤其是iOS应用,处理来自服务器的JSON数据是一项基本技能。无论是使用Swift还是PHP,有效地解析和利用JSON数据对于提升用户体验至关重要。本文将探讨如何在Swift中优雅地处理JSON,以及PHP中处理JSON的一些技巧。 ... [详细]
  • 深入解析链表成环问题:剑指Offer第22天的新视角
    本文将详细介绍链表成环问题的多种解法,包括哈希表法、JSON.stringify特殊解法及双指针法,并提供详尽的代码示例。阅读本文,你不仅能够掌握这一经典算法问题的核心技巧,还能了解到更多编程思维的拓展。 ... [详细]
  • 深入探讨LeetCode上的一道经典算法题——判断一个整数是否为4的幂,提供高效解决方案。 ... [详细]
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社区 版权所有