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

如何使用CPU本身来判断x86-64指令操作码的长度?

如何解决《如何使用CPU本身来判断x86-64指令操作码的长度?》经验,为你挑选了1个好方法。

我知道有些库可以"解析"二进制机器代码/操作码来告诉x86-64 CPU指令的长度.

但我想知道,因为CPU有内部电路来确定这一点,有没有办法使用处理器本身来告诉二进制代码的指令大小?(甚至可能是黑客?)



1> Peter Cordes..:

EFLAGS/RFLAGS中的陷阱标志(TF)使CPU单步执行,即在运行一条指令后执行异常.

因此,如果编写调试器,则可以使用CPU的单步执行功能来查找代码块中的指令边界.但只有运行它,如果它出错(例如来自未映射地址的加载),你将获得该异常而不是TF单步异常.

(大多数操作系统都有附加和单步执行其他进程的工具,例如Linux ptrace,因此您可以创建一个无特权的沙盒进程,您可以在其中单步执行一些未知的机器代码字节...)

或者@Rbmn指出,您可以使用操作系统辅助的调试工具来单步执行.


@Harold和@MargaretBloom还指出你可以在页面的末尾放置字节(后跟一个未映射的页面)并运行它们.查看是否出现#UD,页面错误或#GP异常.

#UD:解码器看到一个完整但无效的指令.

未映射页面上的页面错误:解码器在确定它是非法指令之前命中未映射的页面.

#GP:由于其他原因,指令有特权或故障.

要排除解码+作为完整指令运行然后在未映射的页面上出现故障,请在未映射页面之前仅启动1个字节,并继续添加更多字节,直到您停止获取页面错误.

由Christopher Domas 打破x86 ISA进一步详细介绍了这种技术,包括使用它来查找未记录的非法指令,例如9a13065b8000d77字节非法指令; 这就是它停止页面错误的时候.(objdump -d只是说0x9a (bad)并解码其余的字节,但显然真正的英特尔硬件不满意它是坏的,直到它获取6个字节).


硬件性能计数器instructions_retired.any也会暴露指令计数,但是在不知道任何有关指令结束的信息的情况下,您不知道将rdpmc指令放在何处.使用0x90NOP 填充并查看执行了多少指令可能不会真正起作用,因为您必须知道在哪里切割并开始填充.


我想知道,为什么英特尔和AMD不会为此引入指令

对于调试,通常你想要完全反汇编指令,而不仅仅是找到insn边界.所以你需要一个完整的软件库.

将微编码反汇编程序放在一些新的操作码后面是没有意义的.

此外,硬件解码器只连接起来作为代码获取路径中前端的一部分,而不是为它们提供任意数据.他们已经忙于在大多数周期中解码指令,并且没有连线处理数据.添加解码x86机器码字节的指令几乎肯定会通过在ALU执行单元中复制该硬件来完成,而不是通过查询解码的uop缓存或L1i(在L1i中标记指令边界的设计中)或通过发送数据来完成实际的前端预解码器并捕获结果,而不是将其排队等待前端的其余部分.

我能想到的唯一真正的高性能用例是仿真,或支持英特尔软件开发仿真器(SDE)等新指令.但是如果你想在旧的CPU上运行新的指令,那么重点是旧的CPU 不知道那些新的指令.

与CPU进行浮点数学或图像处理所花费的时间相比,反汇编机器代码所花费的CPU时间非常少.有一个原因,我们vpsadbw在指令集中有像SIMD FMA和AVX2这样的东西,以加速CPU花费大量时间做的那些特殊用途的东西,但不是我们可以用软件轻松做的事情.

请记住,指令集的要点是可以创建高性能代码,而不是获取所有元数据并专门解码自身.

在特殊用途复杂性的上端,在Nehalem中引入了SSE4.2字符串指令.他们可以做一些很酷的东西,但很难使用. https://www.strchr.com/strcmp_and_strlen_using_sse_4.2(也包括的strstr,这是一个真正的用例,其中pcmpistri can be faster than SSE2 or AVX2, unlike for strlen / strcmp where plain oldPCMPEQB /pminub`工作非常好,如果有效地使用(见glibc的手书ASM).)无论如何,这些新指令甚至在Skylake中仍然是多用途的,并没有被广泛使用.我认为编译器很难用它们进行自动向量化,并且大多数字符串处理都是在语言中完成的,在这些语言中,以低开销紧密集成一些内在函数并不容易.


安装蹦床(用于热修补二进制函数.)

即使这需要解码指令,而不仅仅是找到它们的长度.

如果函数的前几个指令字节使用RIP相对寻址模式(或者a jcc rel8/rel32或甚至是jmp或者call),则将其移动到其他地方会破坏代码. (感谢@Rbmn指出这个角落的情况.)


相关/有趣[阅读如何确定指令边界,即使是特权/错误指令](https://www.blackhat.com/docs/us-17/thursday/us-17-Domas-Breaking-The-x86-Instruction -set-wp.pdf).
推荐阅读
  • 本文记录了作者对x265开源代码的实现与框架进行学习与探索的过程,包括x265的下载地址与参考资料,以及在Win7 32 bit PC、VS2010平台上的安装与配置步骤。 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • 深入理解Java虚拟机的并发编程与性能优化
    本文主要介绍了Java内存模型与线程的相关概念,探讨了并发编程在服务端应用中的重要性。同时,介绍了Java语言和虚拟机提供的工具,帮助开发人员处理并发方面的问题,提高程序的并发能力和性能优化。文章指出,充分利用计算机处理器的能力和协调线程之间的并发操作是提高服务端程序性能的关键。 ... [详细]
  • 本文概述了JNI的原理以及常用方法。JNI提供了一种Java字节码调用C/C++的解决方案,但引用类型不能直接在Native层使用,需要进行类型转化。多维数组(包括二维数组)都是引用类型,需要使用jobjectArray类型来存取其值。此外,由于Java支持函数重载,根据函数名无法找到对应的JNI函数,因此介绍了JNI函数签名信息的解决方案。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • FeatureRequestIsyourfeaturerequestrelatedtoaproblem?Please ... [详细]
  • 本文介绍了在Windows环境下如何配置php+apache环境,包括下载php7和apache2.4、安装vc2015运行时环境、启动php7和apache2.4等步骤。希望对需要搭建php7环境的读者有一定的参考价值。摘要长度为169字。 ... [详细]
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • Go GUIlxn/walk 学习3.菜单栏和工具栏的具体实现
    本文介绍了使用Go语言的GUI库lxn/walk实现菜单栏和工具栏的具体方法,包括消息窗口的产生、文件放置动作响应和提示框的应用。部分代码来自上一篇博客和lxn/walk官方示例。文章提供了学习GUI开发的实际案例和代码示例。 ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • 李逍遥寻找仙药的迷阵之旅
    本文讲述了少年李逍遥为了救治婶婶的病情,前往仙灵岛寻找仙药的故事。他需要穿越一个由M×N个方格组成的迷阵,有些方格内有怪物,有些方格是安全的。李逍遥需要避开有怪物的方格,并经过最少的方格,找到仙药。在寻找的过程中,他还会遇到神秘人物。本文提供了一个迷阵样例及李逍遥找到仙药的路线。 ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • 海马s5近光灯能否直接更换为H7?
    本文主要介绍了海马s5车型的近光灯是否可以直接更换为H7灯泡,并提供了完整的教程下载地址。此外,还详细讲解了DSP功能函数中的数据拷贝、数据填充和浮点数转换为定点数的相关内容。 ... [详细]
  • 本文介绍了Codeforces Round #321 (Div. 2)比赛中的问题Kefa and Dishes,通过状压和spfa算法解决了这个问题。给定一个有向图,求在不超过m步的情况下,能获得的最大权值和。点不能重复走。文章详细介绍了问题的题意、解题思路和代码实现。 ... [详细]
  • Android实战——jsoup实现网络爬虫,糗事百科项目的起步
    本文介绍了Android实战中使用jsoup实现网络爬虫的方法,以糗事百科项目为例。对于初学者来说,数据源的缺乏是做项目的最大烦恼之一。本文讲述了如何使用网络爬虫获取数据,并以糗事百科作为练手项目。同时,提到了使用jsoup需要结合前端基础知识,以及如果学过JS的话可以更轻松地使用该框架。 ... [详细]
author-avatar
没有变成王子的青蛙
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有