当您执行 CPU 不支持的指令时会发生什么?

2024-03-16

如果 CPU 尝试执行使用您的 CPU 不支持的某些指令编译的二进制文件,会发生什么情况。我特别想知道一些在旧处理器上运行的新 AVX 指令。

我假设这可以进行测试,并且理论上可以向用户显示一条友好的消息。想必大多数低级库都会代表您检查这一点。假设您没有进行此项检查,您预计会发生什么?您的进程会收到什么信号?


新指令可以设计为“传统兼容”,也可以不设计。
前一类的指令如下tzcnt http://www.felixcloutier.com/x86/TZCNT.html or xacquire具有在旧架构中生成有效指令的编码:tzcnt被编码为rep bsf http://www.felixcloutier.com/x86/BSF.html and xacquire只是repne.
语义当然不同。

大多数新指令属于第二类,AVX 就是一个流行的例子。
当CPU遇到无效或保留的编码时,它会生成#UD (for 不明确的) 异常 - 这是中断号 6。

Linux 内核设置了IDT http://wiki.osdev.org/Interrupt_Descriptor_Table条目为#UD早在entry_64.S http://elixir.free-electrons.com/linux/latest/source/arch/x86/entry/entry_64.S#L850:

idtentry invalid_op         do_invalid_op           has_error_code=0

入口点指向do_invalid_op这是用宏生成的traps.c http://elixir.free-electrons.com/linux/latest/source/arch/x86/kernel/traps.c#L289:

DO_ERROR(X86_TRAP_UD,     SIGILL,  "invalid opcode",        invalid_op)

宏观DO_ERROR生成一个调用的函数do_error_trap在同一个文件中(here http://elixir.free-electrons.com/linux/latest/source/arch/x86/kernel/traps.c#L282).

do_error_trap uses fill_trap_info(在同一个文件中,here http://elixir.free-electrons.com/linux/latest/source/arch/x86/kernel/traps.c#L201)创建一个siginfo_t包含Linux信号信息的结构体:

case X86_TRAP_UD:
    sicode = ILL_ILLOPN;
    siaddr = uprobe_get_trap_addr(regs);
    break;

从那里发生以下调用:

do_trap in traps.c http://elixir.free-electrons.com/linux/latest/source/arch/x86/kernel/traps.c#L233 force_sig_info in signal.c http://elixir.free-electrons.com/linux/latest/source/kernel/signal.c#L1171 specific_send_sig_info in signal.c http://elixir.free-electrons.com/linux/latest/source/kernel/signal.c#L1140

最终调用信号处理程序SIGILL的违规过程。


下面的程序是一个非常简单的例子,它生成一个#UD

BITS 64

GLOBAL _start

SECTION .text

_start:

 ud2

我们可以用strace检查运行该程序收到的信号

--- SIGILL {si_signo=SIGILL, si_code=ILL_ILLOPN, si_addr=0x400080} ---
+++ killed by SIGILL +++

正如预期的那样。


As 科迪·格雷评论 https://stackoverflow.com/questions/44750258/what-happens-when-you-execute-an-instruction-that-your-cpu-does-not-support#comment76501377_44750258,库通常不依赖于 SIGILL,而是使用CPU调度程序 https://software.intel.com/en-us/articles/intel-integrated-performance-primitives-intel-ipp-understanding-cpu-optimized-code-used-in-intel-ipp或明确检查指令是否存在。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当您执行 CPU 不支持的指令时会发生什么? 的相关文章

  • 如何使用 xterm.js 创建基于 Web 的终端以 ssh 进入本地网络上的系统

    我偶然发现了这个很棒的图书馆xterm js https xtermjs org 这也是 Visual Studio Code 终端的基础 我有一个非常普遍的问题 我想通过基于网络的终端 不在网络中 可能位于 aws 服务器上 访问本地网络
  • 如何查明CONFIG_FANOTIFY_ACCESS_PERMISSIONS是否启用?

    我想利用fanotify 7 http man7 org linux man pages man7 fanotify 7 html我遇到的问题是在某些内核上CONFIG FANOTIFY ACCESS PERMISSIONS不起作用 虽然C
  • 为什么内核需要虚拟寻址?

    在Linux中 每个进程都有其虚拟地址空间 例如 32位系统为4GB 其中3GB为进程保留 1GB为内核保留 这种虚拟寻址机制有助于隔离每个进程的地址空间 对于流程来说这是可以理解的 因为有很多流程 但既然我们只有 1 个内核 那么为什么我
  • 从 Python 调用 PARI/GP

    我想打电话PARI GP http pari math u bordeaux fr dochtml gpman html仅从Python计算函数nextprime n 对于不同的n是我定义的 不幸的是我无法得到帕里蟒蛇 http code
  • Linux中的定时器类

    我需要一个计时器来以相对较低的分辨率执行回调 在 Linux 中实现此类 C 计时器类的最佳方法是什么 有我可以使用的库吗 如果您在框架 Glib Qt Wx 内编写 那么您已经拥有一个具有定时回调功能的事件循环 我认为情况并非如此 如果您
  • sendfile64 只复制约2GB

    我需要使用 sendfile64 复制大约 16GB 的文件 到目前为止我所取得的成就是 include
  • 域套接字“sendto”遇到“errno 111,连接被拒绝”

    我正在使用域套接字从另一个进程获取值 就像 A 从 B 获取值一样 它可以运行几个月 但最近 A 向 B 发送消息时偶尔会失败 出现 errno 111 连接被拒绝 我检查了B域套接字绑定文件 它是存在的 我也在另一台机器上做了一些测试 效
  • linux perf:如何解释和查找热点

    我尝试了linux perf https perf wiki kernel org index php Main Page今天很实用 但在解释其结果时遇到了困难 我习惯了 valgrind 的 callgrind 这当然是与基于采样的 pe
  • nslookup 报告“无法解析 '(null)': 名称无法解析”,尽管它成功解析了 DNS 名称

    我在 ubuntu 上 并且正在运行 docker 默认桥接网络 我有 Zookeeper kafka 的容器化版本 以及我编写的与 kafka 对话的应用程序 I do a docker exec it
  • vector 超出范围后不清除内存

    我遇到了以下问题 我不确定我是否错了或者它是一个非常奇怪的错误 我填充了一个巨大的字符串数组 并希望在某个点将其清除 这是一个最小的例子 include
  • arm64和armhf有什么区别?

    Raspberry Pi Type 3 具有 64 位 CPU 但其架构不是arm64 but armhf 有什么区别arm64 and armhf armhf代表 arm hard float 是给定的名称Debian 端口 https
  • 使用 AVX/AVX2 转置 8x8 浮点

    转置 8x8 矩阵可以通过制作四个 4x4 矩阵并对每个矩阵进行转置来实现 这不是我想要的 在另一个问题中 一个答案给出了解决方案 https stackoverflow com a 2518670 4144148x8 矩阵只需要 24 条
  • 如何在Linux内核源代码中打印IP地址或MAC地址

    我必须通过修改 Linux 内核源代码来稍微改变 TCP 拥塞控制算法 但为了检查结果是否正确 我需要记录 MAC 或 IP 地址信息 我使用 PRINTK 函数来打印内核消息 但我感觉很难打印出主机的MAC IP地址 printk pM
  • 为什么 printf 使用浮点和整数格式说明符打印随机值

    我在64位机器上写了一个简单的代码 int main printf d 2 443 所以 这就是编译器的行为方式 它将识别第二个参数为双精度型 因此它将在堆栈上压入 8 个字节 或者可能只是在调用之间使用寄存器来访问变量 d需要 4 字节整
  • Linux 内核标识符中前导和尾随下划线的含义是什么?

    我不断遇到一些小约定 比如 KERNEL Are the 在这种情况下 是内核开发人员使用的命名约定 还是以这种方式命名宏的语法特定原因 整个代码中有很多这样的例子 例如 某些函数和变量以 甚至 这有什么具体原因吗 它似乎被广泛使用 我只需
  • 如何授予 apache 使用 NTFS 分区上的目录的权限?

    我在一台带有 20GB 硬盘的旧机器上运行 Linux Lubutu 12 10 我有一个 1 TB 外部硬盘 上面有一个 NTFS 分区 在该分区上 有一个 www 目录 用于保存我的网页内容 它在启动时自动安装为 media t515
  • PHP 无法打开流:是一个目录

    非常简单的 PHP 脚本 我在我亲自设置的 Ubuntu Web 服务器上的 EE 模板中运行 我知道这与权限有关 并且我已经将我尝试写入的目录的所有者更改为 Apache 用户 我得到的错误是 遇到 PHP 错误 严重性 警告 消息 fi
  • jq中如何分组?

    这是 json 文档 name bucket1 clusterName cluster1 name bucket2 clusterName cluster1 name bucket3 clusterName cluster2 name bu
  • ftrace:仅打印trace_printk()的输出

    是否可以只转储trace printk 输出于trace文件 我的意思是过滤掉函数跟踪器 或任何其他跟踪器 中的所有函数 一般来说 您可以在选项目录中关闭选项 sys kernel debug tracing options Use ls显
  • 如何通过ssh检查ubuntu服务器上是否存在php和apache

    如何通过ssh检查Ubuntu服务器上apache是 否安装了php和mysql 另外如果安装的话在哪个目录 如果安装了其他软件包 例如 lighttpd 那么它在哪里 确定程序是否已安装的另一种方法是使用which命令 它将显示您正在搜索

随机推荐

  • SignalR 和 require.js 配置

    我正在合并SignalR进入我已经使用的项目需要 js处理我的脚本依赖项 我在确保 jquery signalR 1 1 2 加载后调用 signalr hubs 时遇到了一些麻烦 我已经让它工作了 但我想知道是否有更好的选择 这就是我所拥
  • 如何同步包含克隆元素的 jquery 可排序列表?

    我的情况很特殊 我有两个清单 1 列表包含所有项目 2 包含顶部列表 显然 项目重叠 并且第二个列表中的项目根据它们从列表 1 中克隆的元素标记为类clone 23clone 25 Example List 1 1 run 2 eat 3
  • WPF 图像缩放

    我有一个视图框 里面有一个图像 这非常棒 因为 Viewbox 会缩放图像以适合窗口 但是 我需要能够将图像缩放到完整尺寸并显示滚动条 但我很难弄清楚如何做到这一点 这就是我现在所拥有的 谁能指导我如何修改它以实现上述功能
  • R-lang / 如何使用 R 进行正则表达式 (Perl) 提取

    我使用 javascript 的正则表达式测试器得出以下 3 个正则表达式案例 从文本中提取不同类型的 URL 我想在 R 中使用这些正则表达式 regxi 来满足以下条件 http 网址 https www s 比特利网址 https b
  • 如何显示rails本地项目文件夹中的图像?

    非常基本的问题 但不知何故我无法让它发挥作用 我试图让位于项目本地文件夹中的图像显示在 Rails 上 另外 我正在使用引导程序 因此我需要声明class img responsive 以及 这是原始代码 img class img res
  • 如何将 read_html 的输出保存和读取为 RDS 文件?

    对象可以像这样保存和读取 Save as file saveRDS iris mydata RDS Read back in readRDS mydata RDS 但这似乎不适用于用xml2 read html Example librar
  • 一个JVM下的多个进程

    我们可以在一个 JVM 中运行多个进程吗 每个进程都应该有自己的内存配额吗 我的目标是在新的 http 请求进入时启动新进程 并为该进程分配单独的内存 以便每个用户请求都有自己的内存配额 如果内存配额已满 则不会打扰其他用户请求 我怎样才能
  • android: Parse.com Parseobject classnotfound 错误

    我在 Android 应用程序中使用 Parse com 的库 但收到以下错误 05 26 18 43 31 838 E AndroidRuntime 4759 致命异常 主要 05 26 18 43 31 838 E AndroidRun
  • 反应多个过滤器下拉菜单

    我有 React 应用程序 您可以在其中根据几个不同的属性过滤列表 目前 我可以一次过滤每个类别 但我想一次过滤多个类别 因此当您选择更多过滤器时 列表会变得越来越小 然后 当您清除所有值时 它将返回到原始列表 我怎样才能实现这个目标 de
  • 解析/转换 cookie 为 JSON 格式

    我们有任何 javascript 库或正则表达式来解析 将 cookie 转换为 JSON 格式吗 有些cookie是这样的 cookie referer example com post id 22 bcomID 8075 subretu
  • 替换非渲染(非显示)元素文本中的 ↵ (\n)

    我正在编写一个解析器 从隐藏的 iframe 中获取数据 在文本中我需要替换 n 个字符 空间 我用它来完成这项任务 text replace n gi 但是 它仅适用于可见元素 即没有display none 如果该元素不可见 displ
  • PHP json_decode 返回 null

    我正在努力让它发挥作用 但看不出我哪里出了问题 有人可以帮忙吗 Hint 初始 JSON 存储在 json变量 不验证 Code FIXED
  • 使用 github 操作从 docker build 内的 git repo 安装 PIp

    我正在致力于将通用模块分离到我们 github 组织的专用存储库中 使用 git repo 中的 pip installDockerfile安装组织内部开发的共享模块 RUN pip3 install r requirements txt
  • 无法从 Twilio Studio 创建任务

    在 Twilio Studio 上 我可以收到短信 回复预设回复 但当我尝试在 Flex 中传递 创建任务时 出现错误 REST API 流触发器不支持 SendToFlexWidget 即使我使用的是收入消息触发器 即使使用默认消息流 我
  • 将光标从块或矩形更改为线? [复制]

    这个问题在这里已经有答案了 我的光标是一个闪烁的黑色矩形 我不知道怎么变成这样了 我想把它变回一条闪烁的垂直线 图片 您正处于替换模式 按Insert键盘上的 键切换回插入模式 许多处理文本的应用程序都有这个共同点
  • Android NDK 反编译本机代码的可能性

    是否可以通过 ndk 解码编译并喜欢到 android 的本机代码 是否可以从 apk 重建项目并将其导入 eclipse 或任何其他 IDE 是否可以使用 so如果 java 本机函数声明正确完成 则再次在 apk 文件中重新构建文件以重
  • 有没有办法将 sys.fn_varbintohexstr 结果转回 varbinary?

    有没有function in SQL Server要做到这一点 扭转sys fn varbintohexstr 您需要在动态 SQL 语句中使用十六进制字符串 以便将其解析为 varbinary 下面是如何做到这一点的一个示例 Our or
  • Shenandoah 垃圾收集器负载参考屏障

    对于目睹过发展的人来说这不是什么大秘密Shenandoah一个主要的批评是它采用了GC barriers for 每一个写入和读取 无论是引用还是原始 Shenandoah 2 0声称这不再是问题 可以通过所谓的解决方案负载参考屏障 这是怎
  • 类型错误:字符串索引必须是整数(Python)[重复]

    这个问题在这里已经有答案了 我正在尝试检索 id 值 ad284hdnn 我收到以下错误 TypeError string indices must be integers data response json print data for
  • 当您执行 CPU 不支持的指令时会发生什么?

    如果 CPU 尝试执行使用您的 CPU 不支持的某些指令编译的二进制文件 会发生什么情况 我特别想知道一些在旧处理器上运行的新 AVX 指令 我假设这可以进行测试 并且理论上可以向用户显示一条友好的消息 想必大多数低级库都会代表您检查这一点