linux – 如何在x86程序集中使用中断来触发被零除错误异常?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了linux – 如何在x86程序集中使用中断来触发被零除错误异常?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1636字,纯文字阅读大概需要3分钟。
内容图文
我试图理解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 – 如何在x86程序集中使用中断来触发被零除错误异常?全部内容,希望文章能够帮你解决linux – 如何在x86程序集中使用中断来触发被零除错误异常?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。