我试图理解x86程序集中的中断.

我试图触发零除错误,它对应于代码0.

int $0

我期待它具有与除以零相同的行为.

movl $0, %edx # dividend

movl $0, %eax # dividend

movl $0, %edi # divisor

divl %edi

在前一种情况下,我的程序崩溃了“分段错误”并在Linux上退出代码139.在后一种情况下,我的程序崩溃时出现“浮点异常”并在Linux上退出代码136.

如何使用中断来触发与使用零除数调用div指令相同的错误?

解决方法:

I was expecting this to have the same behavior as dividing by zero.

原则上这是正确的.

I tried to trigger a divide-by-zero error, which corresponds to code 0.

int $0

原则上这仍然是正确的.

In the former case, my program crashes with a “Segmentation fault” and exit code 139 on Linux. In the latter case, my program crashes with a “Floating point exception” and exit code 136 on Linux.

x86 CPU有两种工作模式:实模式和保护模式(64位CPU有第三种模式:长模式)

在实模式下,您可以执行CPU在实模式下支持的任何指令.但是,实模式通常只允许16位代码并寻址高达1 MB的内存. 32位操作系统在保护模式下运行.

在保护模式下,cs寄存器中的两个特殊位指示当前运行的代码是属于操作系统内核还是属于应用程序.

在保护模式下……

> …某些指令(例如lmsw)只能由操作系统调用

> …如果操作系统在某个寄存器中设置了一些特殊位,则某些指令(例如cli)只能由应用程序调用;否则只有操作系统可以调用这些指令

> …对某些内存区域的内存访问可以限制在操作系统中

> …从应用程序代码跳入操作系统代码只允许某些地址…

> …这也适用于中断:操作系统可以决定应用程序可以调用哪些中断,哪些不可以.

如果应用程序尝试执行不允许的操作(例如执行某些指令,如lmsw或int $0),CPU将导致“分段错误”中断(因为cs中的两个位指示代码不属于操作系统).禁止执行禁止的指令!

如果你从内核驱动程序调用int $0(在32位Linux上,而不是在64位Linux上),这应该与除以零的效果相同.

标签:linux,assembly

来源: https://codeday.me/bug/20190622/1263918.html

linux处理除零异常,linux – 如何在x86程序集中使用中断来触发被零除错误异常?...相关推荐

  1. android程序在调试时出现了套接字异常“java.net.SocketException: Permission denied”该如何解决...

    Socket不能对外连接,错误不会被报出,调试的时候,能看到Exception, 一般是抛出 java.net.socketexception permission denied这个异常.只要你的程序 ...

  2. linux上无法发送163邮件,如何在linux中发送邮件,使用163邮箱发信。

    linux中,可以使用mail命令往外发送邮件,在使用前,只需要指定如下简单配置即可,这里演示用  163.com    邮箱发送至 qq.com 编辑 /etc/mail.rc,写入下方的参数 se ...

  3. Linux内核中max()宏的奥妙何在?(一)

    Linux内核中max()宏的奥妙何在?(一) 1.max()宏那点事 在Linux内核中,有这样四个比较大小的函数,如下: max(x,y) //两个数求最大值 min(x,y) //两个数求最小值 ...

  4. Linux内核中max()宏的奥妙何在?(二)——大神Linus对这个宏怎么看?

    最新max()宏 上回,我们在<Linux内核中max()宏的奥妙何在?(一)>一文中说到,在3.18.34版Linux内核源码中的max()宏,采用了GCC的扩展特性,可以避免一些错误. ...

  5. [ARM异常]-linux中(aarch/aarch64)异常向量表介绍

    文章目录 1.ARM的异常向量表基地址寄存器--VBAR 1.1.armv8 : VBAR寄存器 1.2.armv7 : VBAR寄存器 2.ARM的异常向量表的定义 2.1 armv8 :异常向量表 ...

  6. mint linux更新内核,如何在Ubuntu/Linux Mint中安装最新Linux 5.2.5内核

    原标题:如何在Ubuntu/Linux Mint中安装最新Linux 5.2.5内核 Linux 5.2的Ubuntu主线内核包最终可以在32位和64位操作系统中下载和安装. 由于构建失败,Linux ...

  7. Linux内核深入理解中断和异常(2):初步中断处理-中断加载

    Linux内核深入理解中断和异常(2):初步中断处理-中断加载 rtoax 2021年3月 1. 总体概览 关于idt_table结构的填充,在5.10.13中流程为: idt_setup_early ...

  8. linux dma 拷贝内存数据_原来 8 张图,就可以搞懂「零拷贝」了

    前言 磁盘可以说是计算机系统最慢的硬件之一,读写速度相差内存 10 倍以上,所以针对优化磁盘的技术非常的多,比如零拷贝.直接 I/O.异步 I/O 等等,这些优化的目的就是为了提高系统的吞吐量,另外操 ...

  9. linux系统可以装win10吗,如何在Win10专业版中安装Linux系统?

    如何在Win10专业版中安装Linux系统?在Windows10 第3个稳定版发布以后,支持内嵌的Linux系统,正如大家所知道的,大多数 Linux 上的命令行二进制程序现在可以原生地运行在 Win ...

最新文章

  1. authc过滤器 shiro_shrio 权限管理filterChainDefinitions过滤器配置
  2. 从时间管理聊到技术人如何保持竞争力?
  3. 使用system函数时应该忽略两个信号
  4. 邮件发送打印机更改打印机连接的通知
  5. 北京大学计算机研究所所长,北大计算机研究所所长郭宗明:探索新机制,释放科研创新能力...
  6. android SharedPreferences保存list数据
  7. 微软面试题:正则表达式提取链接地址
  8. QT 的基础调试技巧 -- 未完 -- 更新中
  9. 冒泡排序+查找打印——上海大学C语言考试
  10. 管理感悟:你是产品的第一个用户
  11. typora最好用的主题_推荐一款超好用Markdown编辑器-Typora
  12. 【65】如何通过sys文件系统remove和probe一个PCI设备
  13. amd的服务器cpu型号大全,AMD CPU型号大全
  14. Selenium简单的163邮箱登录实例
  15. Android 窗口结构(一) 窗口层级构造
  16. 目前缺少用于语义分割的 3D LiDAR 数据吗?关于三维点云数据集和方法的调查
  17. 【转】Oracle 中的 TO_DATE 和 TO_CHAR 函数 日期处理
  18. 最受程序员欢迎的 20 本书!
  19. Autoencoder-based Zeroth Order Optimization Method for Attacking Black-box Neural Networks
  20. C#调用斑马打印机打印条码标签(含源码)(支持COM、LPT、USB、TCP连接方式和ZPL、EPL、CPCL指令)

热门文章

  1. 滴滴出行回应导航崩了;微信支付正式上线「向手机号转账」功能;Guns 6.0 发布 | 极客头条...
  2. 我被产品小姐姐的笔记本深深吸引了....
  3. 首批 8 款 5G 手机获 3C 认证;iPhone6 系列停产;Android Q Beta 5 发布 | 极客头条
  4. Python 爬取知乎 9674 个问答,揭秘最受欢迎的 98 本书!
  5. 重磅!Facebook 更新 PyTorch 1.1,打算跨 GPU 分割神经网络 | 技术头条
  6. 智能时代“云”主沉浮
  7. oracle转mysql总结,原理+实战+视频+源码
  8. java随机数生成字母,手撕面试官
  9. 第 15 章 垃圾回收相关算法
  10. html在线发布ipa文件在哪里,打包ipa文件